Send a WhatsApp message from an Attio workflow
A deal moves, an invoice falls due, a booking is confirmed, and the customer hears from you on WhatsApp with nobody pressing send. This runs on the WhatsApp Business API, so it needs your number connected through Meta and wording Meta approved in advance.
What you need first
"channel": "qr" and text instead of a template. API quickstart- A Meta Business portfolio you are an admin on.
- Your number connected through Meta, not linked as personal WhatsApp.
- A WhatSync API key. API keys are part of the Max plan and up.
- At least one message template Meta has approved.
- Somewhere to send an HTTP request from: Attio workflows, Zapier, Make, n8n or your own backend.
Connect your number
- Open the Business page and sign in with Meta.
- Pick your number from your Meta Business portfolio. You need admin access to it.
- Wait until it says Connected.
You keep your own number; Meta does not give you one. Every message that starts a conversation must be a template Meta approved, and Meta charges per message at your country's rate. Meta also reviews your business before sending turns on, so allow more than an afternoon.
Create an API key
- Open Developers in your WhatSync dashboard.
- Create a key and keep Send messages ticked.
- Copy it once and store it in your workflow tool's secrets, never in the workflow text.
- Send it as
Authorization: Bearer YOUR_API_KEYon every request. - If a key ever leaks, revoke it in the same place and create a new one.
Get a template approved
- Open WhatsApp Manager and the WhatsApp account you connected to WhatSync.
- Open Message templates and create one.
- Choose a category: marketing, utility or authentication.
- Name it in lowercase, like appointment_reminder, and pick the language.
- Write the message with a variable wherever a value changes.
- Add a sample value for every variable. Meta reads them during review.
- Submit it and wait for approval.
Name
appointment_reminder
Message
Hi {{1}}, this is a reminder that your appointment with {{2}} is on {{3}}. Reply here if you need to change it.
{{1}}
Customer name
{{2}}
Team member
{{3}}
Date and time
- Templates are only needed to start a conversation. Once someone replies, you can answer without a template for 24 hours.
- Write it the way the customer should read it, and say why they are hearing from you.
- Use variables only for what changes: a name, a time, an invoice number, a link.
- One template per purpose.
Check yours first with the free template builder.
Build the workflow
- 01
Pick the trigger
Start from something your team already tracks: a new lead, a booking confirmed, an invoice due, a renewal coming up.
- 02
Choose the template
The template name and language in your request must match the approved template in Meta exactly.
- 03
Map the phone number
International format with the country code. No spaces, brackets or local-only numbers.
- 04
Fill the variables
They go in order: the first value in templateParameters fills {{1}}, the second fills {{2}}, and so on.
- 05
Send the request
Your workflow posts to WhatSync with your API key. We check the template and the number, then pass it to Meta.
- 06
Catch the updates
Meta reports what happened to the message. WhatSync saves it and can call your workflow back with a webhook.
The request you send
POST https://whatsync.app/api/v1/tools/send_messageJSON body, with your key in an Authorization: Bearer header. Confirm the person agreed to hear from you with recipientOptInConfirmed, and give each send a fresh idempotencyKey (a random UUID) so a retry never sends it twice.
curl -X POST "https://whatsync.app/api/v1/tools/send_message" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "6f1c2a9e-3b7d-4e1a-9c55-0d2f8b7a4e10",
"channel": "business",
"phoneNumber": "14155550123",
"templateName": "appointment_reminder",
"templateLanguage": "en",
"templateParameters": ["Ava", "Maya from Sales", "Tuesday at 2:00 PM"],
"recipientOptInConfirmed": true
}'- The template name and language must match the approved template in Meta exactly. The language defaults to en_US.
- Templates with an image, video or document header, or a button that needs a value, cannot be sent this way yet.
- The same message to the same person within an hour is refused, so a looping workflow cannot spam someone.
- A success means Meta accepted the message. Delivery is confirmed later.
Every field and error: API quickstart.
After it goes out
- Stage 1
Accepted
Meta took the request
- Stage 2
Sent
It left Meta
- Stage 3
Delivered
It reached the phone
- Stage 4
Read
They opened it
When a message fails, Meta sends a reason with it. We store both, so you can see whether the number was unreachable or the template broke a rule. To update Attio when the status changes, add a webhook for message.status in Developers and point it at your workflow.
Fixing common problems
- It says the connection is not ready
- Your number is not fully connected through Meta. Check the Business page in your WhatSync dashboard says Connected.
- Meta rejects the send
- Nearly always the template. Check it is approved, the name matches character for character, the language code is right, and the number is in international format.
- It says the template is not supported
- Templates with an image, video or document header, or a button that needs a value, cannot be sent through the API yet. Use a template without them.
- The customer never got it
- Check the status in WhatSync, or listen for the message.status webhook. Meta sends a failed update when someone is unreachable or the template breaks policy, and we store the reason.
- The wrong value shows up in the message
- Parameter order. The first value in templateParameters fills {{1}}, the second fills {{2}}, the third fills {{3}}. One off and the name lands where the date should be.
- It says the request was sent before
- Every send needs its own idempotencyKey. Reusing one tells WhatSync it is the same send, so nothing goes out twice. Generate a fresh UUID for each message.
Still stuck? Email hello@whatsync.app with the template name and the error you got.
Meta's documentation
- Create message templatesMeta's walkthrough for writing and submitting a template.
- WhatsApp ManagerWhere you create templates, manage numbers and check approvals.
- Template overviewCategories, components, variables and review rules.
- Cloud API getting startedMeta app setup and account connection, from the developer side.
- Platform or Business app?Meta on the difference between the API and the app you download.
- Add a WhatsApp Business accountAdding a WhatsApp account to your Meta Business portfolio.
What Meta charges in your country: WhatsApp Business API pricing calculator.