Start here
Quick start
From a new account to a delivered order confirmation, in order, with nothing skipped.
This is the whole path, start to finish. It takes about twenty minutes of your time, plus however long Meta takes to approve your templates, usually minutes, occasionally a few hours.
This is what you are building towards, the message the request in step 7 puts on a customer's phone, with the values used there:
Hi Alex, your order #ORD-9001 is confirmed! ✅
Order total: Rs.1,499.00
Track your order here: https://yourstore.com/track/ORD-9001
We'll message you as soon as it ships. Thank you for shopping with us!
Set up, in order
Create your account and pick a plan
A plan sets your message allowance and your sending caps, and can be changed later. Sends are charged against your balance, so the balance has to be non-zero before you send anything in step 7.
Link a WhatsApp Business number
On Phone Numbers, connect a number to your Meta business account. Connect Meta opens Meta's own signup popup and is the path to use unless it is blocked; Discover from Meta imports a number already set up in Business Manager, and Manual Link takes pasted credentials.
The number must not currently be active in the WhatsApp or WhatsApp Business app. Meta will not attach a number that is signed in on a handset. A landline is fine. A number you already use personally is not, until you delete that account from it, which is permanent and takes the chat history with it.
Register the number on the Cloud API
Linking and registering are two different actions. On the number's row, use Register 2FA and set a 6-digit two-step PIN. Write the PIN down, Meta asks for it again if the number is ever re-registered or moved.
An unregistered number is rejected by Meta on every send with error
133010, regardless of how many templates are approved or how much credit you hold, and nothing warns you until the first send fails. The row gains a Registered badge when it is done, and that badge, not the presence of the number, is what means it can send.
Registering a linked number. Nothing sends until this is done. Submit the template catalog
Business-initiated messages must be templates Meta approved in advance. The platform ships 18 covering the transactional events a store needs, order confirmation, status changes, shipping, delivery, payments, refunds, returns, one-time passcodes and three marketing events.
Submit them all from E-commerce Notifications, or with one call. An empty body submits the whole catalog:
bash curl -X POST https://whatsapp-api.growcord.in/api/v1/notifications/templates/submit \ -H "Authorization: Bearer sk_live_xxx" \ -H "Content-Type: application/json" \ -d '{}'Submissions run one at a time because Meta rate-limits template creation per business account, so a full run takes several seconds. Message templates and approval explains what happens to each one.
Wait for approval, and check readiness
Authentication templates are usually approved almost immediately; the rest take minutes to a few hours. This endpoint answers the only question that matters before you send anything: can this number deliver this event right now?
bash curl "https://whatsapp-api.growcord.in/api/v1/notifications/events?refresh=true" \ -H "Authorization: Bearer sk_live_xxx"refresh=truere-reads approval state from Meta before answering, so a template approved a minute ago is visible rather than waiting on a background sync. Two things matter in the response,health.canSendbeingtruewith an emptyblockersarray, andreadyclimbing toward18:json { "phoneNumberId": "1030974986765331", "total": 18, "ready": 18, "health": { "canSend": true, "blockers": [] }, "events": [ … ] }A non-empty
blockersarray names the problem and its fix in one sentence, an unregistered number from step 3 appears here. Each entry inevents[]carries its ownstatusandstatusReason. You do not have to wait for all 18: one approved template is enough to send that one event.
Per-event approval state. Only the approved ones can be delivered. Create an API key
Under API Keys → Generate New Key. The full secret is shown once, at creation. It is stored as a hash, so a lost key cannot be recovered, only revoked and replaced. Keys start with
sk_live_and travel in anAuthorization: Bearerheader.Store it as an environment variable on your server. If you must call from a browser, restrict the key to your domains under API Keys → Manage → Allowed domains first, anyone who can read your storefront's source can read a key used in it.
7. Send your first notification
Send an order confirmation to your own number. It works even though you have never messaged your own store, because it is delivered as an approved template, which is the entire point of the catalog.
to and event are the only required fields. Send the number in E.164 form with the country code: non-digits are stripped, so a national number without one is delivered to a different subscriber in a different country rather than being rejected.
curl -X POST https://whatsapp-api.growcord.in/api/v1/notifications/send \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"to": "+919876543210",
"event": "order_confirmation",
"variables": {
"customerName": "Alex",
"orderId": "#ORD-9001",
"orderTotal": "1,499.00",
"trackingLink": "https://yourstore.com/track/ORD-9001"
}
}'A success looks like this:
{
"success": true,
"messageId": "wamid.HBgMOTE5ODc2NTQzMjEwFQIAERgSN0Yx...",
"channel": "template",
"event": "order_confirmation",
"template": "order_confirmation"
}You did not have to name a phoneNumberId above. With one number on the account it is inferred; with several, pass it explicitly or you will send from whichever was configured first.
8. Confirm it arrived
The message id from the send is the handle on its delivery state. Meta reports status asynchronously, so a message read back immediately usually still says sent, that on its own is not a problem.
curl "https://whatsapp-api.growcord.in/api/v1/notifications/status/wamid.HBgMOTE5..." \
-H "Authorization: Bearer sk_live_xxx"status moves sent → delivered → read, or lands on failed. The same history is on the Logs screen, which is quicker to read while you are still setting things up.
9. Connect your store
Once one manual send works, wire the store up. All three routes end up making the request you just made by hand:
- WooCommerce and WordPress, install the plugin, paste the key, choose which order statuses send what.
- Shopify, install the app; it subscribes to order and fulfilment webhooks itself.
- Custom and headless stores, call
/v1/notifications/sendfrom your own backend, deduplicating per order and event so a retry cannot send twice.
If nothing arrived
Work down this list. Almost every case is one of the first three.
- Is the number registered? Call
GET /v1/notifications/eventsand readhealth.blockers. An unregistered number fails every send with Meta error133010. - Is the template approved? A
409withTEMPLATE_NOT_APPROVEDsays it is not. Poll readiness rather than retrying the send, approval is Meta's and cannot be hurried. - Is there credit? A
402says not. Nothing was sent and nothing was spent. - Is the recipient number right? A send that returned a
messageIdand never arrived usually went to a valid but wrong number, look for a missing country code.
Troubleshooting covers each of these in full, including how to check it and what to do about it, plus a table of every error code.
