After designing the strategy to integrate WhatsApp, OpenAI, and CRM for client follow-ups, the next step is execution.
In this post, we will walk you through how we actually built it — so you can replicate or adapt it for your organization too.

  1. Setting Up The Architecture At the heart of our system is a simple but powerful workflow:

Component Purpose
Call Management System Detects call statuses (busy, no answer, rejected, etc.)
WhatsApp API (Meta Cloud API) Sends/receives WhatsApp messages automatically
OpenAI API Handles client queries via chat
CRM Integration Supplies order, product, merchant, and customer data
Centralized Logging Tracks calls, chats, and AI escalations
We used a microservices approach so that each part can evolve independently.

  1. Detecting Failed Calls When a call is made to a client, the telephony platform (like Twilio, or a PBX system like Asterisk or FreePBX) returns a call status code.

We listen for these codes:

php
$failureCodes = [
'NO_ANSWER',
'USER_BUSY',
'CALL_REJECTED',
'SUBSCRIBER_ABSENT',
'NORMAL_TEMPORARY_FAILURE',
'UNALLOCATED_NUMBER',
'NO_USER_RESPONSE'
];

if (in_array($callStatusCode, $failureCodes)) {
initiateWhatsAppFollowUp($orderId, $clientPhone);
}
The initiateWhatsAppFollowUp() method triggers the next step: sending the WhatsApp message.

  1. Sending the WhatsApp Message We integrated with the Meta WhatsApp Cloud API.

Example WhatsApp Payload:

php
$message = [
'messaging_product' => 'whatsapp',
'to' => $clientPhone,
'type' => 'template',
'template' => [
'name' => 'order_followup',
'language' => ['code' => 'en_US'],
'components' => [
[
'type' => 'body',
'parameters' => [
['type' => 'text', 'text' => $merchantName],
['type' => 'text', 'text' => $productName],
['type' => 'text', 'text' => 'KES ' . $price],
],
],
],
],
];

$response = Http::withToken(env('WHATSAPP_API_TOKEN'))
->post('https://graph.facebook.com/v17.0/'.env('WHATSAPP_PHONE_NUMBER_ID').'/messages', $message);
We used pre-approved WhatsApp templates (required by Meta) to send these messages.

  1. Handling Client Replies Incoming client responses are captured via webhooks.

Webhook Handler:

php
public function handleIncomingWhatsApp(Request $request)
{
$message = $request->input('messages.0.text.body');
$from = $request->input('messages.0.from');

// Analyze and respond
$this->analyzeMessage($message, $from);

}

  1. Analyzing Messages Using OpenAI The next step is where the real magic happens.

We send the client's message to OpenAI for classification:

php
$response = Http::withToken(env('OPENAI_API_KEY'))->post('https://api.openai.com/v1/chat/completions', [
'model' => 'gpt-4',
'messages' => [
['role' => 'system', 'content' => 'You are a helpful customer service agent.'],
['role' => 'user', 'content' => "Client said: '{$message}'. What should we reply?"],
],
]);
If the AI suggests a simple reply (like "Yes, you can reschedule"), we automatically send it back through WhatsApp.

If the reply is complex, we escalate to a live agent.

  1. Escalating Complex Queries If AI determines escalation is needed:

A notification is triggered in the agent dashboard.

The conversation is flagged for human takeover.

Agents can immediately continue the conversation on WhatsApp Web integrated inside their system.

  1. Logging Every Interaction Every action is logged into the CRM:

Table What it stores
call_logs All call attempts and results
chat_logs All WhatsApp messages in/out
escalation_logs Any AI escalations to human agents
Example chat_logs entry:

client_id order_id message direction timestamp
12345 9876 "Hello, confirming my address..." inbound 2025-04-29 14:10

  1. Managing Templates and Personalization For flexibility, message templates are editable in the admin panel:

Merchants can customize messages.

Dynamic fields like [Merchant Name], [Product Name], [Price] are automatically populated.

This makes the system fully adaptable across different businesses.

Final System Architecture Diagram

Agent Calls Client

Call Failure Detected

Automated WhatsApp Follow-Up

Client Responds

AI Handles / Escalates

Logs Everything into CRM
Conclusion
With relatively lightweight coding, smart APIs, and the power of automation + AI, we created a system that ensures:

No client is left unattended.

Conversations continue naturally even outside office hours.

Agents focus on what matters most: building real client relationships.

The future of call centers is not about "more calls" — it’s about smarter conversations.
And that future is here, today.