Log WhatsApp messages in HubSpot from a Coexistence number
HubSpot has a Communications object whose channel type can be WHATS_APP, made for logging messages that happen outside HubSpot. Route the number's webhooks to an n8n workflow, find or create the contact by phone, and POST each message to /crm/v3/objects/communications. The conversation lands on the contact timeline while the team keeps answering from the WhatsApp Business app.
A supported value of hs_communication_channel_type on HubSpot's Communications object.
Burst limit per privately distributed app on HubSpot Free and Starter; Professional and Enterprise allow 190.
Marketing Hub or Service Hub tier HubSpot requires for its own WhatsApp inbox channel.
How does a WhatsApp message end up on a HubSpot contact?
In three hops. Meta delivers the message to the webhook destination you set for the number, which here is an n8n Webhook node. The workflow searches HubSpot for a contact with the sender's phone number and creates one if nothing matches. Then it creates a communication record with the message text and associates it with that contact.
HubSpot built the Communications object for this case. It represents a message on WhatsApp, LinkedIn or SMS that was sent or received outside HubSpot, and it shows on the record timeline like a logged call or email. The required properties are the channel type, hs_communication_logged_from set to CRM, the body, an owner and a timestamp.
Nothing about this needs a HubSpot marketplace app. n8n's HTTP Request node can reuse the HubSpot credential you already set up for the HubSpot node, and the call is a single POST per message.
{
"properties": {
"hs_communication_channel_type": "WHATS_APP",
"hs_communication_logged_from": "CRM",
"hs_communication_body": "do you have anything friday?",
"hubspot_owner_id": "75480934",
"hs_timestamp": "2026-10-11T14:20:00.000Z"
}
}Do messages typed on the phone get logged too?
They can, and that is the part a Coexistence number adds. When someone on the team answers from the WhatsApp Business app, Meta sends an echo of that outgoing message to the same webhook destination. A workflow that handles both the inbound messages and the echoes writes both sides of the conversation to the timeline, so a salesperson opening the contact in HubSpot sees what the customer asked and what the shop replied.
Branch on the webhook field. Inbound messages arrive under messages and the phone's replies arrive under smb_message_echoes. Log the first as received and the second as sent, and the timeline reads in order.
Replies that the workflow itself sends through the Cloud API are already known to it, so log them at the moment of sending rather than waiting for a webhook.
What about HubSpot's own WhatsApp inbox channel?
That is a different integration. HubSpot's conversations inbox connects a WhatsApp number to HubSpot itself, and its knowledge base says the number must not be connected to another WhatsApp integration. It is available on Marketing Hub or Service Hub Professional and Enterprise.
A number connected through EasyCoexistence is reached the other way: Meta routes its webhooks to a URL you own, and HubSpot receives records through its API. The conversation is answered from the phone or by your workflow, and HubSpot is the system of record that holds the history against the contact, deal or ticket.
The call needs a contacts write scope on the private app or credential that makes it, which is the same scope a workflow already needs to create the contact in the first place.
How should the workflow match a sender to a contact?
By phone number, normalised before the search. Meta sends the sender as digits with the country code and no plus sign, such as 14155550188. HubSpot contacts are typed by hand, so the same person may be stored as +1 415 555 0188 or (415) 555-0188.
The reliable pattern is to keep a dedicated contact property holding the digits-only number, populate it when the workflow creates a contact, and search on that property. Searching the free-text phone field directly works for contacts the workflow created and misses many that a person created, which produces duplicates.
When a search returns nothing, create the contact with the profile name from the webhook payload as the first name and the digits-only number in both fields. A person can merge or rename later, and the conversation is already attached.
Common mistakes
- Logging only inbound messages. The timeline then shows questions with no answers, because replies typed on the phone arrive as smb_message_echoes events.
- Leaving hs_communication_logged_from unset. HubSpot requires it to be CRM when creating a communication through the API.
- Searching contacts on the raw phone field. Meta's digits-only format rarely matches what a person typed, and every miss creates a duplicate contact.
Connect the number at easycoexistence.com, point its webhook destination at your n8n workflow, and HubSpot starts filling with conversations. From US$ 9 per number per month, falling to US$ 1 as you add numbers, with the first 3 days free.
Frequently asked questions
Can I reply to the customer from inside HubSpot?
Not through the Communications object, which is a log. Replies go from the WhatsApp Business app or from a workflow calling the Cloud API, and both are logged back to the contact.
Which HubSpot permissions does the workflow need?
Contacts read and write. HubSpot lists crm.objects.contacts.read or crm.objects.contacts.write as the scopes for the Communications API, and creating contacts needs the write scope anyway.
Can the same workflow also send the first message?
Yes. A separate n8n branch can send an approved template through the Cloud API with the number's phone number id and token, then log it to the contact as an outgoing communication.
Is message content stored by EasyCoexistence on the way?
No. Meta delivers the webhook straight to your n8n URL. EasyCoexistence never stores conversation content.
Keep reading
Ready to get started?
Set up WhatsApp Coexistence in minutes, not months. The app keeps working on the phone.
Start Free TrialVerified on