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.
- 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.
- 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.
- 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.
- 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);
}
- 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.
- 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.
- 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
- 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.