Blog/Tutorials

Integrating WhatsApp API with HubSpot CRM: A Practical Guide

Integrate WhatsApp messaging into HubSpot CRM using Rapiwa API. Send WhatsApp messages from HubSpot workflows, log messages as activities, and automate lead follow-ups. Full tutorial.

by Mahi
Integrating WhatsApp API with HubSpot CRM: A Practical Guide

You can integrate WhatsApp messaging into HubSpot CRM by connecting Rapiwa API to HubSpot workflows using webhooks or n8n as middleware. When a HubSpot contact is created, a deal changes stage, or a workflow trigger fires, n8n calls Rapiwa to send a WhatsApp message to the contact's phone number. Rapiwa costs $5/month flat with no per-message fees — making it the most cost-effective WhatsApp layer for HubSpot.

What You Can Do with WhatsApp + HubSpot

  • Lead qualification: Automatically message new leads when they fill a HubSpot form
  • Deal stage notifications: Notify sales reps via WhatsApp when a deal moves to "Proposal Sent"
  • Meeting reminders: Send customers a WhatsApp reminder 1 hour before a HubSpot-booked meeting
  • Contract follow-ups: Message prospects 48 hours after sending a proposal with no response
  • Onboarding sequences: Send WhatsApp onboarding messages triggered by HubSpot deal closed-won

Prerequisites

  • Rapiwa account (free 3-day trial at rapiwa.com)
  • HubSpot account (free or paid)
  • n8n (Cloud free tier or self-hosted) — used as middleware
  • HubSpot Private App Token (to authenticate API calls)

Architecture

HubSpot Workflow → Webhook Action → n8n → Rapiwa API → WhatsApp

Or alternatively with HubSpot webhooks triggering n8n directly:

HubSpot Contact Created → HubSpot Webhook → n8n Webhook Trigger → Rapiwa API → WhatsApp

Step 1: Create a HubSpot Private App

  1. In HubSpot → Settings → Integrations → Private Apps
  2. Click Create a private app
  3. Name: Rapiwa WhatsApp Integration
  4. Scopes: enable contacts, crm.objects.contacts.read, crm.objects.deals.read
  5. Click Create app and copy the Access Token

Step 2: Set Up n8n as Middleware

In n8n, create a new workflow:

  1. Trigger: Webhook node (to receive HubSpot events)
  2. HubSpot node: Fetch contact details (phone number, name)
  3. HTTP Request (Rapiwa): Send WhatsApp message

Get the webhook URL from n8n (copy from Webhook node):

https://yourn8n.cloud/webhook/hubspot-whatsapp

Step 3: Configure HubSpot Workflow to Call n8n

In HubSpot → Automation → Workflows:

  1. Create a new Contact-based workflow
  2. Enrollment trigger: e.g., "Contact fills out lead form" or "Contact property changes"
  3. Add action: Send a webhook
  4. Webhook URL: your n8n webhook URL
  5. Request type: POST
  6. Include properties: phone, firstname, lastname, email, hs_object_id

HubSpot webhook payload (what n8n receives):

{
  "objectId": 12345,
  "properties": {
    "phone": "8801234567890",
    "firstname": "Sarah",
    "lastname": "Johnson",
    "email": "sarah@company.com",
    "hs_lead_status": "NEW"
  }
}

Step 4: Configure n8n to Send the WhatsApp Message

In the n8n workflow, after the Webhook trigger:

Extract Contact Data

Add a Set node to extract the phone number and build the message:

// Expression in Set node
phone: {{ $json.properties.phone }}
first_name: {{ $json.properties.firstname }}
message: Hi {{ $json.properties.firstname }}! We received your inquiry and will be in touch shortly. Reply here if you have any questions!

Send via Rapiwa

Add an HTTP Request node:

  • Method: POST
  • URL: https://app.rapiwa.com/send-message
  • Authorization: Bearer YOUR_RAPIWA_API_KEY
  • Body:
{
  "number": "={{ $json.phone }}",
  "message": "={{ $json.message }}"
}

Working cURL test:

curl -X POST https://app.rapiwa.com/send-message \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "8801234567890",
    "message": "Hi Sarah! Thanks for reaching out. I will call you within the next hour to discuss your requirements. — Alex, Sales Team"
  }'

Expected response:

{
  "status": "success",
  "messageId": "msg_hubspot_abc123",
  "timestamp": "2026-06-14T10:30:00Z"
}

Step 5: Log WhatsApp Messages Back to HubSpot

After sending the WhatsApp message, log it as a HubSpot activity so your team can see it in the contact timeline:

import requests

def log_whatsapp_to_hubspot(contact_id: str, message: str, hubspot_token: str):
    """Log a WhatsApp message as a note in HubSpot contact timeline."""
    url = f"https://api.hubapi.com/crm/v3/objects/notes"
    headers = {
        "Authorization": f"Bearer {hubspot_token}",
        "Content-Type": "application/json"
    }
    payload = {
        "properties": {
            "hs_note_body": f"WhatsApp message sent via Rapiwa:\n\n{message}",
            "hs_timestamp": str(int(__import__('time').time() * 1000))
        },
        "associations": [
            {
                "to": {"id": contact_id},
                "types": [{"associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 202}]
            }
        ]
    }
    
    response = requests.post(url, headers=headers, json=payload)
    return response.json()

# Usage (in your n8n HTTP Request node or Python webhook handler)
log_whatsapp_to_hubspot(
    contact_id="12345",
    message="Hi Sarah! Thanks for reaching out. I will call you within the next hour.",
    hubspot_token="YOUR_HUBSPOT_PRIVATE_APP_TOKEN"
)

In n8n, add a second HTTP Request node after the Rapiwa send, pointing to the HubSpot Notes API with the contact association.

Step 6: Handling Incoming WhatsApp Replies

When contacts reply on WhatsApp, Rapiwa fires a webhook to your n8n instance. Configure the reply handler:

  1. Rapiwa webhook → n8n Webhook node (second workflow)
  2. n8n queries HubSpot by phone number: GET /crm/v3/objects/contacts?filterGroups=...
  3. Creates a HubSpot note with the incoming message
  4. Optionally assigns a task to the contact owner

Use Case Examples

Lead Form Follow-Up (5-Minute Response)

Trigger: Contact fills form → 
Wait: 0 minutes →
WhatsApp: "Hi [Name]! I'm [Rep] from [Company]. I saw your inquiry — when is a good time to talk this week?"

Deal Stage: Proposal Sent

Trigger: Deal stage = "Proposal Sent" →
Wait: 48 hours, no response →
WhatsApp: "Hi [Name]! Just checking in on the proposal I sent 2 days ago. Happy to walk through any questions — just reply here!"

Meeting Reminder

Trigger: Meeting booked →
Wait: until 1 hour before meeting time →
WhatsApp: "Hi [Name]! Quick reminder — our call is in 1 hour at [time]. Here's the link: [zoom/meet URL]"

Common Errors and Fixes

  • HubSpot webhook not firing: Check that the workflow is active and enrolled contacts match the trigger criteria
  • Phone number format issues: HubSpot may store numbers with spaces, dashes, or +. Strip non-digits in n8n: {{ $json.phone.replace(/[^0-9]/g, '') }}
  • 401 from Rapiwa: API key expired — regenerate in Dashboard → API Keys
  • HubSpot rate limit: HubSpot's API allows 100 requests/10 seconds. For bulk sends, add a Wait node between contacts

FAQ

Is there a native HubSpot WhatsApp integration? HubSpot has a native WhatsApp integration for WhatsApp Business Platform (Meta official API), which requires business verification and per-message fees. Rapiwa provides an alternative unofficial API path at $5/month flat through n8n middleware.

Can I send WhatsApp messages directly from HubSpot without n8n? HubSpot workflows support "Send a webhook" as a native action. This webhook can call Rapiwa's API directly without n8n — but n8n gives you more flexibility for building the message and handling replies.

Does Rapiwa charge per message sent from HubSpot? No. Rapiwa is $5/month flat with no per-message fees. You can process unlimited CRM-triggered WhatsApp messages.

Can I track WhatsApp message delivery rates in HubSpot? Not natively. You would need to build a custom integration: log Rapiwa's success/failure responses as HubSpot contact properties or notes.

Does this work with HubSpot's free plan? Yes. HubSpot's free plan supports workflows (with limitations) and webhooks. The n8n + Rapiwa layer works with any HubSpot tier.