You can connect WhatsApp Business API to Kommo without the native widget by going directly through Meta Cloud API and Kommo Chats API. You get your own webhook server that receives incoming messages from Meta, processes them, and passes them to Kommo via Chats API - tying each conversation to the right deal. This is a full two-way messaging channel with no middlemen and no monthly widget fee.
In Exceltic.dev projects this architecture is regularly chosen when a client has a non-standard scenario: multiple numbers with different routing logic, integration with an external queue system, GDPR requirements for storing conversations, or simply an unwillingness to pay $30-50 per month on top of the Kommo plan for a feature that can be implemented via Meta’s free Cloud API.
WhatsApp Business API (WABA) is a server-side API from Meta for organizations. It lets you send and receive WhatsApp messages programmatically, without a mobile app. Unlike WhatsApp Business App, it works via HTTP requests to Meta’s servers and supports template messages for outbound notifications.
This article covers the architecture of a custom integration: what is needed on the Meta side, how Kommo Chats API works, and how this approach differs from Kommo’s native widget.
Kommo native widget vs custom integration
Kommo supports native WhatsApp connection through a built-in integration based on Meta Cloud API. It is convenient for a quick start, but imposes limitations that become visible in projects with non-standard requirements.
| Parameter | Kommo native widget | Custom integration via Cloud API |
|---|---|---|
| Cost | Included in Base plan and above; template messages billed at Meta rates | Only Meta per-message fees plus development and server hosting costs |
| Numbers per account | 1 on Base, 3 on Advanced/Pro | Any number within one WABA |
| Access to conversation data | Inside Kommo only | Full: all messages pass through your server, you can write to your own DB |
| Message templates | Through Kommo interface, limited variable set | Directly via Meta Business Manager, any variables, buttons, media |
| Routing | By Kommo channels and pipelines | Arbitrary - by number, tag, UTM, link payload |
| Digital Pipeline and SalesBot | Natively supported | Supported via Chats API (Kommo sees the chat as a standard channel) |
| GDPR storage | Data at Meta and in Kommo | Data at Meta, in Kommo, and on your server - full control |
| Implementation time | 1-2 hours | 2-5 business days |
The custom approach is justified when: multiple product lines on different numbers with different response logic; you need to log conversations to your own CRM or data warehouse; the native widget does not support the required template type; or your team is already building a middleware layer between the CRM and external systems.
For a simple start with one number the native widget is the right choice.
What the custom setup implements
Architecture: Meta Cloud API webhook -> your server -> Kommo Chats API
The setup consists of three components working in sequence.
Meta Cloud API receives messages from WhatsApp users and delivers them to your webhook server as a POST request with a JSON payload. The payload contains from (sender number), id (message ID), timestamp, type (text/image/audio/document), and the message body. For incoming text, that is the text.body field.
Your webhook server is the middleware layer that:
- Verifies the request from Meta via X-Hub-Signature-256
- Parses the payload
- Determines which deal or lead this contact belongs to (by phone number via Kommo Contacts API)
- Passes the message to Kommo via Chats API POST
/api/v1/chats/messages - Responds to Meta with status 200
Kommo Chats API accepts incoming messages and attaches the conversation to a deal. If the contact is new, Kommo creates a lead automatically based on pipeline settings. If a deal already exists, the message appears in its activity feed.
For outgoing messages the direction reverses: Kommo sends a webhook to your server (event message_sent), and the server makes a POST to Meta Graph API /{phone_number_id}/messages with the access token.
Template and session messages
Meta distinguishes two messaging modes:
Session messages are free-form text within the 24-hour window after the last incoming message from the client. They require no template approval. This is the mode where most sales conversations happen.
Template messages (HSM) are used for initial outbound contact or re-engagement after the 24-hour window expires. Each template goes through moderation in Meta Business Manager. Template structure: header (optional), body with variables {{1}}, {{2}}, footer (optional), buttons (Reply/CTA). Under Meta pricing from July 2025, each template is billed individually - the price depends on the category (Utility, Marketing, Authentication) and the recipient’s country.
In a custom integration you manage templates directly through Meta Business Manager or via Graph API POST /{whatsapp-business-account-id}/message_templates. This lets you use any variables, carousels, location buttons - capabilities that Kommo’s native widget supports only partially.
GDPR and opt-in
WhatsApp Business API requires confirmed opt-in from the user before sending template messages. This is not just a recommendation - Meta blocks accounts with a high complaint rate. Opt-in is recorded via a web form, SMS confirmation, or any other documented channel and must be stored in your system.
For EU clients this is also a GDPR requirement: the legal basis for processing data via WhatsApp must be documented. In the custom setup this is easier: you control storage and can show a full audit trail at any time.
Step-by-step connection guide
Step 1. Create a Meta App and WABA
Go to Meta for Developers, create a Business-type application. Under Products, add WhatsApp. The system will automatically create a test number and a WhatsApp Business Account (WABA ID). For production you need a verified Business Portfolio in Meta Business Manager.
Step 2. Register a phone number
Add your production number via WhatsApp Manager or API. The number must not be registered in WhatsApp Business App - if it is, delete the account first. After adding, register the number via the API call POST /{phone-number-id}/register with parameters messaging_product: whatsapp and pin. Without this call the number will not be activated for Cloud API.
Step 3. Configure webhook on Meta’s side
In the WhatsApp -> Configuration section, enter the URL of your webhook endpoint and a Verify Token (any string). Meta will send a GET request with parameters hub.mode=subscribe, hub.verify_token, and hub.challenge. Your server must verify the token and return the value of hub.challenge as a 200 response. After verification, Meta will start delivering incoming events to this URL.
Subscribe to the events you need: messages (incoming messages), message_deliveries, message_reads. Subscribe via POST /{app-id}/subscriptions.
Step 4. Register a channel in Kommo Chats API
Submit a request to Kommo support to enable Chats API. In response you will receive channel parameters: channel_id, channel_secret (used to sign the X-Signature of outgoing webhooks from Kommo). Review time is 1-3 business days.
After receiving the parameters, register your webhook address via POST /api/v1/chats/channels/{channel_id}/webhook. Kommo will then start sending events about outgoing messages from the CRM interface to this address.
Step 5. Implement routing logic on the server
The server must support two flows:
Incoming (Meta -> Kommo): receive webhook from Meta, extract from (sender number in E.164 format), find the contact in Kommo by number via GET /api/v4/contacts?query={phone}, pass the message via Chats API with contact_id and conversation_id. On the first message from a new number, Kommo creates a lead based on pipeline rules.
Outgoing (Kommo -> Meta): receive webhook from Kommo indicating a manager sent a message in the chat, make a POST to Meta Graph API /{phone_number_id}/messages with the message body or a template reference.
Step 6. Error handling and idempotency
Meta does not retry webhook delivery on failure - if your server did not return 200, the message is lost. Implement a queue with acknowledgment (for example, via Redis or RabbitMQ): the webhook from Meta is placed in the queue immediately, processing happens asynchronously. For idempotency, store the message_id from the Meta payload and check for duplicates before writing to Kommo.
The anti-pattern here is synchronous processing without a queue. At 100+ messages per minute this leads to timeouts and loss of some conversations.
Step 7. Templates and testing
Create a test Utility-category template in Meta Business Manager. Wait for approval (usually a few hours for Utility). Send a test message via API to a real number. Verify that it appears in the correct Kommo deal. Check the return path: a reply from Kommo should go through your queue to Meta and be delivered in WhatsApp.
Real-world case
One typical Exceltic.dev project in this category involved an Eastern European company with a 20-person sales team that used Kommo and wanted to add WhatsApp as the main inbound lead channel. The native widget was ruled out for two reasons: they needed three different numbers with different pipelines for different products, and they required conversation mirroring to their own storage for compliance.
Architecture: Python FastAPI server on a VPS, queue via Redis Streams, two pipelines in Kommo. The entire stack - three services in Docker Compose.
Result: implementation took 4 business days including testing. Three numbers run on one server with separate routing by phone_number_id. Conversations are mirrored to PostgreSQL with message_id stored for auditing. Infrastructure cost - $15-20 per month (VPS + Redis), versus $30-50 per month for three native widgets on the Advanced plan.
In the first 30 days, approximately 1,200 conversations passed through the integration without a single lost message - thanks to Redis Streams with ACK.
Who this approach is right for
The custom Kommo + WhatsApp integration via Meta Cloud API suits teams of 10-15 or more people who:
- use multiple WhatsApp numbers for different products or markets
- are building their own data warehouse and want to store conversations internally
- operate in regulated industries with audit trail requirements (fintech, healthtech, legaltech)
- already have a middleware server for other integrations and want to add WhatsApp to that architecture
- want to use Meta template capabilities (carousels, location, payment buttons) that the native widget does not fully support
If you have one number, a simple inbound lead scenario, and no data storage requirements - the Kommo native widget is simpler and faster.
For companies that are just moving to Kommo and have not yet decided on a messenger strategy, it is useful to first read the Kommo CRM overview and understand basic pipeline setup before choosing a channel architecture.
If you are already setting up other messengers in Kommo, the approach is similar to integrating Kommo with a Telegram bot: a single webhook server can serve multiple channels in parallel.
Term: Kommo Chats API - Kommo’s server-side API for connecting arbitrary message sources (messengers, chats) to the CRM. It lets you bind incoming conversations to deals and contacts, display conversation threads in the activity feed, and use SalesBot and Digital Pipeline to handle chats from custom channels.
Frequently asked questions
Do I need a verified business on Meta to connect Cloud API?
For testing - no. Meta provides a test number and a test WABA immediately after app creation. For production with a real number, Business Portfolio verification is mandatory. Without verification the account stays in sandbox mode: you can only send messages to registered test numbers. Meta business verification takes from one day to a week and requires official company documents.
How much does Meta Cloud API cost - is there a free tier?
Meta provides 1,000 free service conversations per month per WABA. Service conversations are exchanges initiated by the user. Since July 2025, outbound template messages (Marketing, Utility, Authentication) are billed per message rather than per 24-hour window. Exact rates depend on the recipient’s country and template category - current figures are on Meta’s pricing page. For most EU and US markets a Utility template costs $0.01-0.02 per message.
Can I use one WABA for multiple numbers in different Kommo pipelines?
Yes, one WABA supports multiple numbers. Each number has its own phone_number_id, which your server uses to determine which pipeline to route the incoming lead to. In Kommo Chats API each number is registered as a separate channel with its own channel_id. Routing happens on your server: check the phone_number_id in the Meta payload and pass the message to the corresponding Kommo channel.
What happens if my webhook server is unavailable and Meta could not deliver a message?
Meta does not retry webhook delivery on error or timeout. If the server did not respond with 200, the incoming message is lost from your system’s perspective - the client sent it, but it will not appear in Kommo. This is exactly why a queue-based architecture is critical: the webhook endpoint should only place the task in a queue and immediately return 200, with processing happening asynchronously. It is recommended to monitor queue depth and alert when unprocessed tasks accumulate.
Can SalesBot and Digital Pipeline in Kommo be used via Chats API?
Yes. This is one of the key advantages of Chats API over other ways of connecting WhatsApp through third-party widgets. Kommo treats a chat from a custom channel the same way it treats a chat from a native widget: SalesBot can respond to incoming messages, Digital Pipeline can move the deal when a message is received. This is what distinguishes Chats API from simply writing notes via the Kommo REST API - with the REST API, automation based on a chat event does not work.
Summary
A custom Kommo + WhatsApp Business API integration via Meta Cloud API is the right choice when the native widget is not enough: multiple numbers, storing conversations on your own side, complex routing, or templates with extended capabilities.
Key steps:
- Create a Meta App, add WhatsApp, register the number via API
- Implement a webhook server with X-Hub-Signature-256 verification and a queue
- Get access to Kommo Chats API and register a channel
- Implement the two-way flow: Meta -> server -> Kommo and Kommo -> server -> Meta
- Set up templates in Meta Business Manager, test the opt-in flow
If you are now evaluating this architecture for your team - describe the task to the Exceltic.dev team. We will review the stack, the number of phone numbers, and data storage requirements, and propose an architecture with a scope estimate.