Sending WhatsApp Notifications from HubSpot Deals and Forms
HubSpot workflows can call an external webhook the moment a deal changes stage, a form gets submitted, or a lead is assigned to a rep. Most teams point that webhook at Slack or email. Pointing it at WhatsApp instead gets the message in front of the one person it actually matters to — the sales rep, the lead, or the customer — in a channel they check within minutes, not whenever they next open their inbox.
This is a plain webhook-to-API pattern: no HubSpot marketplace app, no extra subscription, just a workflow action and a small receiver.
Why not the HubSpot WhatsApp channel directly
HubSpot's own WhatsApp integration (via its Inbox) is built for two-way conversations with contacts, and it's tied to Meta's official WhatsApp Business Platform with its own approval and template-message process. That's a different tool for a different job. What's covered here is one-way, transactional notifications — "deal moved to Proposal Sent," "new lead assigned to you," "form submitted by X" — sent through TextMeFlow's messages API, which doesn't require Meta's template approval flow at all. Use HubSpot's native channel for agent-facing WhatsApp conversations with customers; use this pattern for internal alerts and simple confirmations.
Step 1: Add a webhook action to a HubSpot workflow
In HubSpot, open Automation → Workflows and edit (or create) a workflow enrolled on the trigger you want — a deal entering a specific stage, a form submission, or a contact property change. Add a Webhook action:
- Method:
POST - URL: your receiver endpoint (see below)
- Request body: choose "Custom" and map the HubSpot properties you need — deal name, amount, owner phone number, contact phone number
HubSpot workflow webhooks only fire on Professional and Enterprise tiers; on Starter, use a Zapier or Make connection to HubSpot instead and skip straight to the TextMeFlow action inside that automation, following the same field mapping.
Step 2: Build a small receiver
Your receiver takes HubSpot's POST body, decides what the message should say, and calls TextMeFlow. A minimal Node/Express version:
import express from 'express';
const app = express();
app.use(express.json());
app.post('/hubspot-deal-hook', async (req, res) => {
const { dealname, amount, owner_phone } = req.body;
await fetch('https://api.textmeflow.eu/v1/messages', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TEXTMEFLOW_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to: owner_phone,
text: `Deal "${dealname}" (€${amount}) just moved to Proposal Sent. Follow up today.`,
}),
});
res.sendStatus(200);
});
The same shape works for a PHP or Python receiver — TextMeFlow's SDKs exist for both, or any plain HTTP client works since it's a standard REST API.
Step 3: Handle phone number formatting
This is where most HubSpot-to-WhatsApp setups quietly break. HubSpot phone properties are free text — +32 470 12 34 56, 0470123456, 32470123456 can all sit in the same field depending on who typed it in. Normalize to E.164 (+ and digits only, country code included) before calling the API, and reject or flag anything that doesn't parse rather than silently dropping the notification:
function toE164(raw, defaultCountry = '32') {
const digits = raw.replace(/[^\d]/g, '');
if (raw.startsWith('+')) return '+' + digits;
if (digits.startsWith('00')) return '+' + digits.slice(2);
if (digits.startsWith('0')) return `+${defaultCountry}${digits.slice(1)}`;
return `+${digits}`;
}
For the deal-owner use case, pull the phone number from the HubSpot user's profile rather than a free-text deal property if you can — it's far less likely to be malformed or missing.
Step 4: Don't notify on every property change
HubSpot workflows re-enroll or re-fire on property updates more often than you'd expect — a deal amount rounding, an owner reassignment, a form field auto-filled by a HubSpot integration can all trigger the same webhook. Add a filter branch in the workflow so the webhook only fires on the specific stage transitions or form names you actually want a WhatsApp message for, and keep the receiver itself idempotent (dedupe on hs_object_id + new stage) so a HubSpot retry doesn't double-send.
What this is good for
Good fits: a rep getting pinged the moment a high-value deal reaches a late stage, a lead getting an instant WhatsApp confirmation after filling a contact form, an account manager alerted when a renewal-risk property flips. Poor fit: bulk outreach to a HubSpot list — that's marketing messaging and needs consent and template handling this pattern doesn't provide; route that through a proper campaign tool instead, and keep this pattern for one-to-one, event-triggered notifications, which is also what keeps you clear of TextMeFlow's anti-spam risk scoring.
Start free on TextMeFlow — 50 messages a month, no time limit, plenty to wire up and test a HubSpot workflow before deciding on a paid plan.
Zelf WhatsApp-berichten versturen via API?
Gratis voor altijd tot 50 berichten/maand. QR scannen en binnen 5 minuten verstuur je je eerste bericht.
Gratis voor altijd