· 4 min · TextMeFlow Team

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