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.
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
- In HubSpot → Settings → Integrations → Private Apps
- Click Create a private app
- Name:
Rapiwa WhatsApp Integration - Scopes: enable
contacts,crm.objects.contacts.read,crm.objects.deals.read - Click Create app and copy the Access Token
Step 2: Set Up n8n as Middleware
In n8n, create a new workflow:
- Trigger: Webhook node (to receive HubSpot events)
- HubSpot node: Fetch contact details (phone number, name)
- 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:
- Create a new Contact-based workflow
- Enrollment trigger: e.g., "Contact fills out lead form" or "Contact property changes"
- Add action: Send a webhook
- Webhook URL: your n8n webhook URL
- Request type: POST
- 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:
- Rapiwa webhook → n8n Webhook node (second workflow)
- n8n queries HubSpot by phone number:
GET /crm/v3/objects/contacts?filterGroups=... - Creates a HubSpot note with the incoming message
- 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.
