Send WhatsApp messages from any system with a webhook
Your store, CRM or booking tool already knows when an order is placed, a payment fails or an appointment is booked. A webhook can turn each of those events into a WhatsApp message, without code on your side. Here is how to plan it, secure it and test it.
MonoChat Team Updated: 7 min read
On this page
To send a WhatsApp message when something happens in another system, point that system’s webhook at a receiver that finds the customer by phone number and sends an approved WhatsApp template. Your store, CRM or booking tool already fires webhooks for orders, payments and appointments; the work is choosing which events deserve a message, writing the templates, securing the URL and testing with real requests before customers see anything.
This guide covers the plan, the WhatsApp rules that shape it, and how to build it in MonoChat with a flow that starts from its own webhook URL.
What a webhook is, and what it is not
A webhook is an HTTP request that one system sends to a URL you give it when an event happens. Shopify can send one when an order is created, WooCommerce when an order is updated, a CRM when a deal moves stage, a booking tool when an appointment is made. The request carries the details of the event, usually as JSON: an order number, an amount, a customer name and, most importantly for WhatsApp, a phone number.
A webhook does not send anything to the customer by itself. Something has to receive the request, decide what to do with it and call the WhatsApp Business API. That “something” is either code you write and host, or an automation platform that gives you a webhook URL and lets you build the rest without code.
Which events deserve a WhatsApp message
Not every event is worth a message. A customer who gets five notifications for one order starts ignoring all of them. Pick the moments they are actually waiting for:
| Event | Message | Template category |
|---|---|---|
| Order created or paid | Confirmation with the order number and what happens next | Utility |
| Payment failed or pending | A short note and a way to pay again | Utility |
| Order shipped | Carrier and tracking link | Utility |
| Cash-on-delivery order created | A question: confirm the order, change the address or cancel | Utility |
| Appointment booked, changed or due tomorrow | Date, time, place and a way to reschedule | Utility |
| Deal won or lost in the CRM | A handover to the account manager, or a feedback question | Utility or marketing, depending on the text |
| Cart abandoned | A reminder, perhaps with an offer | Marketing |
Meta decides the category from what the template says, not from the label you pick. A message about a specific order, payment or booking is utility; anything that promotes, offers or tries to persuade is marketing, and needs consent that covers marketing. Our WhatsApp template examples have wording for the utility cases above.
The WhatsApp rules that apply
Most webhook messages need a template
A customer service window opens when a customer messages or calls you, and lasts 24 hours from their last message. Inside it you can reply freely; outside it you can only send pre-approved template messages. Store and CRM events rarely happen inside that window, so plan every webhook message as a template, and submit the templates for review before you switch anything on.
The phone number must be usable
The webhook has to carry a phone number that WhatsApp can reach: in international format, with the country code. Many stores let customers type their number any way they like, so check a few real orders. A number without a country code is the most common reason a test works and production doesn’t.
Pricing changed on 1 October 2026
Meta has charged per delivered message since 1 July 2025. Since 1 October 2026, utility templates sent inside an open customer service window are charged again, after a period in which they were free, and every business phone number gets 1,000 free service messages a month. Rates depend on the category and the customer’s country. In practice: an order confirmation costs money whether or not the customer wrote to you recently, so send the messages that matter and skip the ones that don’t. The WhatsApp API pricing guide explains the rate card.
Secure the webhook URL
Anyone who knows a webhook URL can call it. If that URL sends WhatsApp messages, a leaked URL means someone else can message your customers in your name, or run up your bill. Three habits prevent that:
- Require a secret. The sending system adds the secret to a header, or signs the request body with it (HMAC-SHA256) so the receiver can check the request wasn’t changed on the way. Requests without a valid secret or signature are rejected.
- Keep one URL per purpose. An order flow and a booking flow should have different URLs and secrets, so you can rotate one without touching the other.
- Watch for failures on the sending side. WooCommerce disables a webhook after more than five consecutive failed deliveries, and Shopify deletes a webhook subscription whose destination repeatedly returns a non-200 response. A receiver that is switched off or misconfigured can silently stop your notifications.
Where to create the webhook in Shopify and WooCommerce
- Shopify: Settings › Notifications › Webhooks, then Create webhook. Choose one event (Order creation, Order payment, Fulfillment creation and many more), JSON as the format, and an
https://URL. The event can’t be changed after the webhook is created, so make one webhook per event. Send test checks that it reaches the URL. - WooCommerce: WooCommerce › Settings › Advanced › Webhooks, then Add webhook. Pick a topic (order, customer, coupon or product events), enter the delivery URL and a secret; WooCommerce adds a hash of the payload made with that secret to the request headers.
- A CRM or booking tool: look for “webhooks”, “automations” or “outgoing integrations”. If it only offers a fixed format, check which field holds the customer’s phone number before you build anything.
Test with real requests before you go live
Webhook payloads are long and every platform names its fields differently: the phone number may be phone, billing.phone or customer.default_address.phone. Don’t guess. Send a real test request, look at what arrived, and map the fields from that. Then test the edge cases:
- an order without a phone number, or with a number missing the country code;
- the same event delivered twice, which platforms do when they retry;
- an order placed at 3 a.m., if you’d rather the message waits until morning;
- a customer who replies to the notification, so a person or an AI assistant is ready to answer.
How to do it in MonoChat
MonoChat is an official Meta Business Partner. Since version 3.8.37 (October 2026), a flow can start from a webhook, so your store or CRM can trigger WhatsApp messages without code on your side.
1. Start the flow with a Webhook Received node. Add it from the event nodes. It gets its own webhook URL and secret. Choose the channel, for example your WhatsApp number, and the Identity Path, where the customer’s phone number is in the request (request.body.phone by default). MonoChat finds the customer on that channel, or creates them, and runs the flow for them. The node answers the sender with 202 once the flow is queued, and with a clear error when the channel or the phone number isn’t found.
2. Turn on Require Secret. The sender can put the secret in the token header (Authorization by default, on its own or as Bearer <secret>) or send an HMAC-SHA256 signature of the raw body in the signature header (X-Signature by default). Both header names can be changed to match the sending system.
3. Capture a real request. Add /test to the end of the webhook URL and point your store’s test webhook at it. While the node’s settings are open, the request appears under Captured Request with its body, query and headers, without starting the flow. Use it to find the paths you need, then save them as flow variables, for example request.body.orderId as orderId.
4. Send the message. Add a Send Template Message node with your approved template, and fill its variables from the flow variables: the order number, the amount, the tracking link. Use conditions to send different templates for different statuses.
5. Call back if you need to. An HTTP Request node can look up more data in your own system, or write the customer’s answer back, for example “confirmed” on a cash-on-delivery order. It continues on Output when the call succeeds and on On Fail when it doesn’t, so you can send a fallback or assign the conversation to a person.
When the customer replies, the conversation is in the same MonoChat inbox as the rest of your WhatsApp, Instagram and Messenger chats, where your team or an AI assistant can take over. To build flows, see workflow automation.
Two other routes, depending on who should do the work:
- Your developers already call an API. The WhatsApp Template API app sends an approved template with one API call, and replies land in the inbox.
- You run Shopify and want order data in the chat. Shopify chat automation syncs products and orders so the team and the AI assistant can answer order questions.
To start, create a free account at app.monochat.ai, connect your WhatsApp number and compare plans on the pricing page.
Sources
- Meta for Developers: Send messages and the customer service window
- Meta for Developers: Pricing on the WhatsApp Business Platform
- Meta for Developers: Template categorization
- Shopify Help Center: Webhooks
- WooCommerce documentation: Webhooks
- MonoChat help center: Flows, Webhook Received and HTTP Request nodes
Put this into practice with MonoChat