日本語

WhatsApp Business API Integration With Your CRM (Working Setup)

Here's a frustrating reality: you get WhatsApp conversations flowing, reps respond, leads express interest, and then 40% of those contacts never appear in your CRM. Not because of a technical limitation, but because the integration was misconfigured in a way that silently fails.

A RevOps manager at a B2B SaaS company discovered this when she pulled a WhatsApp report and compared it against HubSpot. The gap was real and had been accumulating for two months. The fix took one afternoon once she identified which path she was on and what was misconfigured.

This guide walks you through the three main integration setups: ManyChat → HubSpot, Respond.io → HubSpot, and webhook-to-any-CRM, with the specific field mapping, deduplication logic, and UTM attribution steps that each requires.

Choosing Your Integration Path

Before touching any settings, pick your path. The decision comes down to your existing toolstack and CRM. According to Meta's official WhatsApp Business Platform documentation, the Business API supports three authentication tiers with different messaging capabilities — your integration path determines which tier applies to your use case. If you're still deciding which chat platform fits your workflow, the Respond.io vs ManyChat comparison for B2B sales breaks down the tradeoffs clearly.

Path Best for Technical requirement Sync depth
ManyChat → HubSpot Teams already using ManyChat for flows Low (native connector) Contact + custom properties
Respond.io → HubSpot Teams using Respond.io as primary inbox Low (native connector) Contact + lifecycle stage + conversation history
Webhook → Any CRM Salesforce, Pipedrive, custom CRMs Medium (Zapier or Make required) Configurable via webhook payload

If you're on HubSpot and actively building flows in ManyChat, go with Path A. If you're running all chat operations through Respond.io, Path B gives you deeper sync. If your CRM isn't HubSpot, Path C is your option.

Path A: ManyChat → HubSpot

Enabling the Integration

In ManyChat, go to Settings → Integrations → HubSpot. You'll need:

  • A HubSpot account with Contacts access
  • A ManyChat admin role
  • HubSpot API key or OAuth connection (OAuth is preferred)

Click Connect, authorize the HubSpot connection, and confirm the linked portal.

Required HubSpot Permissions

The connecting HubSpot user needs at minimum: Contacts (view and edit), Properties (view), and Workflows (view). If you're using HubSpot workflows triggered by ManyChat data, add Workflows (edit).

Mapping Contact Fields

ManyChat subscriber data maps to HubSpot contact properties. Here's the default mapping and what you'll want to customize:

ManyChat Field HubSpot Property Notes
First Name firstname Auto-mapped
Last Name lastname Auto-mapped
Phone phone Maps to primary phone (watch E.164 format)
Email email Only present if collected in flow
Custom attribute: company_size company_size (custom) Must create property first in HubSpot
Custom attribute: industry industry Maps to standard HubSpot property
Custom attribute: use_case hs_lead_status (custom) Create a custom field for this
Flow source (ad ID) hs_analytics_source Requires UTM passthrough setup

To map a custom attribute, go to ManyChat → Integrations → HubSpot → Field Mapping and add a new row. The HubSpot property must exist before you can map to it. Create it in HubSpot first under Contacts → Properties.

Contact Owner Assignment

ManyChat can assign a HubSpot contact owner based on round-robin or a fixed owner. Set this under the HubSpot integration settings → Default Owner. For teams doing territory-based routing, you'll need to use a HubSpot workflow triggered on contact creation to re-assign based on company or region.

What Syncs and What Doesn't

ManyChat syncs contact properties and optionally pushes a note with conversation summary. It does not sync full conversation transcripts to HubSpot natively. For conversation history, you need Path B or a webhook workaround.

The integration also doesn't push contact updates in real-time for every message. It triggers on specific events in your flow (typically on opt-in or when a flow step fires the HubSpot action).

Path B: Respond.io → HubSpot

Connecting Via Respond.io's Native HubSpot Module

In Respond.io, go to Settings → Integrations → HubSpot. You'll authenticate via OAuth. Respond.io requires a HubSpot admin account for the initial connection.

Once connected, Respond.io creates a two-way sync: contacts created in Respond.io appear in HubSpot, and existing HubSpot contacts can be pulled into Respond.io conversations.

Lifecycle Stage Mapping

Respond.io can update HubSpot lifecycle stages based on conversation events. Configure this under the HubSpot integration settings:

  • New contact from WhatsApp → Lead
  • Qualification questions completed → Marketing Qualified Lead
  • Meeting booked → Sales Qualified Lead

Set these mappings to fire automatically when the relevant step in your flow completes.

Contact Deduplication by Phone Number

Respond.io uses phone number as the primary deduplication key when syncing to HubSpot. If a contact already exists in HubSpot with the same E.164-formatted phone number, Respond.io updates the existing record rather than creating a duplicate.

The catch: phone number format must match exactly. If HubSpot has "+1 (555) 000-0000" and Respond.io sends "+15550000000", they won't deduplicate. Standardize all phone numbers to E.164 format in both systems. In HubSpot, you can use a workflow with the "Format phone number" action to normalize existing records.

Conversation History Sync Options

Respond.io can push conversation history to HubSpot as a note on the contact record. Enable this under HubSpot integration → Sync Options → Log Conversations. Each conversation becomes a timestamped note with the full exchange.

This is the biggest advantage of Path B over Path A for teams that want reps to see context before they call a chat-sourced lead.

Path C: Webhook to Any CRM

Structuring the Respond.io Webhook Payload

Respond.io supports outbound webhooks triggered by conversation events (new contact, message received, flow step completed). Configure these under Settings → Developer → Webhooks.

A sample payload when a contact completes a qualification flow step:

{
  "event": "contact.updated",
  "contact": {
    "id": "abc123",
    "phone": "+15550001234",
    "firstName": "Jane",
    "lastName": "Chen",
    "customAttributes": {
      "company_size": "50-200",
      "use_case": "sales_automation",
      "timeline": "Q2_2026",
      "source_ad_id": "23849572894"
    },
    "createdAt": "2026-04-18T09:32:00Z",
    "optInTimestamp": "2026-04-18T09:31:47Z"
  },
  "conversation": {
    "id": "conv_xyz789",
    "channel": "whatsapp"
  }
}

Building the Zapier or Make Zap

In Zapier:

  1. Trigger: Webhooks by Zapier → Catch Hook
  2. Copy the webhook URL into Respond.io
  3. Send a test contact through the flow to populate sample data
  4. Action: Create or Update Contact in your CRM
  5. Map fields from the webhook payload to CRM fields
  6. Add a filter step: only proceed if phone is not empty

In Make (formerly Integromat), use the Webhooks module as trigger, then route to your CRM's Create/Update Contact module.

Handling the Phone Number Format Issue

WhatsApp always sends phone numbers in E.164 format. Most CRMs accept E.164 but some (particularly Salesforce) have local format requirements. Add a text formatter step in Zapier/Make to strip the country code prefix or reformat as needed before the CRM action fires.

UTM and Source Attribution

When a contact enters your WhatsApp funnel from a Meta ad, the ad source data travels with them, but only if you've wired the handoff correctly. For the full ad setup that feeds this attribution pipeline, see the guide on Click-to-WhatsApp ad campaigns.

Meta passes a ad_id and campaign_id parameter when the conversation is initiated from a Click-to-WhatsApp ad. Respond.io captures these automatically in the conversation metadata. ManyChat captures them as User Input variables if you've added the Meta ad source step to your flow.

To get campaign-level attribution in your CRM:

  1. Store ad_id, ad_set_id, and campaign_id as custom attributes in your chat platform
  2. Include them in your field mapping or webhook payload to the CRM
  3. Create a HubSpot custom property "WhatsApp Campaign Source" mapped to campaign_id
  4. Build a HubSpot report filtered by "WhatsApp Campaign Source" to see pipeline by campaign

This gives you a simple campaign → pipeline view without needing a third-party attribution tool.

Deduplication Rules

When the same phone number enters your funnel multiple times (common with retargeting campaigns), your integration needs a clear rule. This is especially relevant when lead capture automation is pulling contacts in from multiple channels simultaneously.

The priority order:

  1. Match on phone number first (E.164 normalized)
  2. If match found: update the existing record, don't create new
  3. If no match: create new contact, flag as new lead
  4. If phone matches but email differs: update email only if the existing record has no email

In HubSpot, the native deduplication only matches on email by default. For phone-based deduplication, use a HubSpot workflow: trigger on contact creation, search for existing contact by phone number, and if found, merge the records using a custom code step or a third-party deduplication app like Dedupely.

In Salesforce, use duplicate rules under Setup → Duplicate Management, with a matching rule on Phone field. A Gartner study on CRM data quality found that poor data quality costs organizations an average of $12.9 million per year — phone deduplication is one of the most cost-effective fixes.

Testing the Integration

Run this 6-step sequence before going live:

  1. Send yourself through the full WhatsApp flow using a test phone number
  2. Check your chat platform (ManyChat/Respond.io) to confirm the contact was created with all custom attributes populated
  3. Wait 2-3 minutes, then check your CRM for a new contact with the matching phone number
  4. Verify each mapped field arrived with the correct value, especially custom attributes
  5. Check that contact owner was assigned correctly
  6. Send a second test with the same phone number to verify deduplication (update not duplicate)

If step 3 fails: check your integration connection status first, then look at the event log in your chat platform for sync errors.

If step 4 fails with missing custom attributes: confirm the attribute was populated during the flow (check the contact record in ManyChat/Respond.io) and that the field mapping is configured correctly.

Common Pitfalls

Phone number format mismatch. The single most common failure. Normalize to E.164 everywhere before you build any mapping. GDPR-compliant chat funnels for EU buyers covers additional requirements around storing phone numbers if your contacts are in the EU.

Missing opt-in timestamp. GDPR and WhatsApp Business Policy both require you to record when a user opted in. Store the opt-in timestamp as a CRM field from day one, not as an afterthought.

CRM blocking records without email. HubSpot and Salesforce can be configured to require email on contact creation. WhatsApp contacts often don't have email collected. Either remove the email requirement for chat-sourced contacts or collect email as a flow step.

HubSpot property type conflicts. If you map a ManyChat text attribute to a HubSpot number property, the sync will fail silently. Match property types exactly: text to text, number to number, dropdown to dropdown.

What to Do Next

Once your integration is confirmed working, build a CRM view filtered by "WhatsApp Campaign Source is not empty." Pair this view with solid CRM data model design so your custom chat properties sit in a consistent schema from the start. This becomes your ongoing view for tracking pipeline sourced from chat. Review it weekly against your other lead sources to see the channel's contribution.

From there, connect the attribution dots to revenue. When a chat-sourced lead closes, tag the deal with the original campaign source. After 60 days you'll have enough data to optimize ad spend toward the campaigns that produce not just conversations, but closed revenue.

Learn More