WhatsApp Cloud API · Go-live guide · 2026
WhatsApp Cloud API Test Number vs Production Number: How to Go Live
Your first message went out from Meta's test number and landed on your phone. Nice. Now customers need to hear from your business number, and this is where most integrations stall for a day or two. It isn't a one-field swap. Here's what actually changes and the order to do it in.
By On Cloud API team · Updated · Checked against Meta's developer documentation on the same date
Quick answer
You don't "upgrade" Meta's test number. You add your real business number to your WhatsApp Business Account, verify it by SMS or voice call, and register it with a 6-digit PIN. Then replace three values in your app: the Phone Number ID (your real number has a new one), the access token (use a system user token, not the test token), and, if it changed, the WABA ID. Your message code and webhook URL usually stay the same.
Test number vs production number
| Meta test number | Your production number | |
|---|---|---|
| Owned by | Meta, for testing | Your business |
| Who can receive messages | Only the few recipient numbers you add and verify (up to five) | Any customer, within Meta's messaging limits and opt-in rules |
| Phone Number ID | Its own test ID | A different ID |
| Verification and registration | Already done by Meta | You verify ownership and register it |
| Display name and profile | Meta's test name | Your business name, after Meta approves it |
| Billing | For testing | Normal Meta per-message pricing |
| Right for | Proving your code works | Real customers |
The test number is there so you can check the things that don't depend on the final sender: your API calls, message payloads, webhook verification, how your app parses incoming messages, and your CRM or n8n logic. Get all of that working first. Then going live is just swapping the sender.
What actually changes in your app
| Value | Changes when you go live? |
|---|---|
| Phone Number ID | Yes, always. Your real number is a new object with a new ID. |
| Access token | Should. Swap the short-lived test token for a system user token. |
| WABA ID | Maybe. Same if you added the number to the same account; different if it went into another WABA. Check, don't assume. |
| Message templates | Maybe. Templates belong to a WABA, so a new WABA needs its own approved templates. |
| Webhook URL | Usually no, but the app must be subscribed to the production WABA. |
| Message payload and endpoint | No. Same /<PHONE_NUMBER_ID>/messages call. |
If these values live in environment variables, going live is a config change, not a code change:
# .env — testing WHATSAPP_PHONE_NUMBER_ID=meta_test_phone_number_id WHATSAPP_ACCESS_TOKEN=temporary_test_token # .env — production WHATSAPP_PHONE_NUMBER_ID=your_real_phone_number_id WHATSAPP_ACCESS_TOKEN=system_user_token WHATSAPP_WABA_ID=your_production_waba_id
New number or your existing WhatsApp Business app number?
Decide this before you touch anything. The path is different.
| Your situation | Path |
|---|---|
| A new or spare number, used only for the API | Add it in WhatsApp Manager, verify, register. The steps below. |
| A number already on another API provider | A migration, not a fresh add. The number must be released by the old setup first. |
| Your current WhatsApp Business app number, and you want to keep using the app | Coexistence, through a Tech Provider's Embedded Signup. |
What coexistence means
With coexistence, your existing WhatsApp Business app number connects to the Cloud API and keeps working in the app on your phone. You can reply one-to-one from the app and send at volume through the API. A few things worth knowing, straight from Meta's documentation:
- Only Tech Providers and Solution Partners can onboard you, through Embedded Signup.
- Messages you send from the Business app stay free; API messages are billed at normal Cloud API rates.
- Throughput on a coexistence number is fixed at 20 messages per second.
- You get 24 hours to sync your chat history during onboarding.
- Some app features stop working afterwards, including broadcast lists, group chats, disappearing messages and calls.
If that trade-off suits you, coexistence saves you from changing the number your customers already know.
Go-live steps, in the right order
- Finish testing on the test number. One outbound message, one inbound message hitting your webhook, and your app processing both. Don't add a real number to a setup that isn't working yet.
- Open the right Business Portfolio and WABA. If you manage several businesses, double-check. Adding the number to one WABA and using credentials from another is a classic time-waster.
- Add your number in WhatsApp Manager (or through a Tech Provider's Embedded Signup). Set your display name. Meta reviews it, so use your real business name.
- Verify ownership with the SMS or voice code. The number must be able to receive it. Voice works for landlines.
- Get the new Phone Number ID from API Setup or
/<WABA_ID>/phone_numbers. - Register the number for Cloud API with a 6-digit PIN, which also becomes the number's two-step verification PIN. Save it somewhere safe.
- Switch to a system user token with the WhatsApp permissions, and make sure the system user has this WABA assigned.
- Subscribe your app to the WABA so incoming messages reach your webhook.
- Check your templates exist and are approved in this WABA.
- Update your .env, restart workers, then send one template to your own phone.
- Message the new number from another phone and confirm your webhook receives it.
- Only then turn on real traffic: campaigns, CRM triggers, the chatbot.
Verify and register the number with API calls
WhatsApp Manager can do the verification for you, but if you're doing it by API, these are the three calls. All of them use the new Phone Number ID.
1. Request a verification code
curl -X POST \
"https://graph.facebook.com/<GRAPH_API_VERSION>/<PHONE_NUMBER_ID>/request_code" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "code_method": "SMS", "language": "en_US" }'
Use "VOICE" instead of "SMS" if the number can't receive texts.
2. Submit the code
curl -X POST \
"https://graph.facebook.com/<GRAPH_API_VERSION>/<PHONE_NUMBER_ID>/verify_code" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "code": "<6_DIGIT_CODE_YOU_RECEIVED>" }'
3. Register the number for Cloud API
curl -X POST \
"https://graph.facebook.com/<GRAPH_API_VERSION>/<PHONE_NUMBER_ID>/register" \
-H "Authorization: Bearer <SYSTEM_USER_ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "messaging_product": "whatsapp", "pin": "<YOUR_6_DIGIT_PIN>" }'
A {"success": true} response means the number is live on Cloud API. Replace <GRAPH_API_VERSION> with a current version from Meta's changelog (for example v25.0).
Do you need a new webhook for the production number?
Usually not. The webhook URL is set on your Meta app, not on the phone number. What you do need is for your app to be subscribed to the WABA the new number belongs to:
curl -X POST \ "https://graph.facebook.com/<GRAPH_API_VERSION>/<WABA_ID>/subscribed_apps" \ -H "Authorization: Bearer <ACCESS_TOKEN>"
Then check your own code. If your webhook handler filters incoming events by the test Phone Number ID, it will silently ignore every message to your real number. Each webhook payload includes metadata.phone_number_id. Make sure your routing expects the new one.
For the bigger picture of how the Cloud API, WABA and numbers fit together, see our WhatsApp Cloud API overview. If you're moving an n8n workflow from test to live, our WhatsApp Business API + n8n guide shows which credential and node fields to update.
Test number works, production doesn't? Check these
| What you see | Likely cause | Fix |
|---|---|---|
| Messages still come from the test sender | Old Phone Number ID somewhere | Search code, .env and workflow nodes for the test ID |
Error 190 | Test token expired | Use a system user token |
Error 200 or 10 | Permission or asset missing | Give the system user the WABA and the WhatsApp permissions |
| Number shows in WhatsApp Manager but can't send | Not registered yet | Call /register with a 6-digit PIN |
| Registration fails asking for a PIN | Two-step verification already set | Use the existing PIN, or reset it in WhatsApp Manager |
| Sending works, incoming messages don't arrive | App not subscribed, or webhook filters the old ID | Call /subscribed_apps; update routing to the new phone_number_id |
| "Template does not exist" | Template is in a different WABA | Create and approve it in the production WABA |
This process is the same in every market. A +92 Pakistan number, a +971 UAE number or a +91 India number each gets its own Phone Number ID and goes through the same verify-and-register steps. What differs by country is message pricing, not the go-live process.
Frequently asked questions
What is the WhatsApp Cloud API test number?
It is a phone number Meta gives you when you add WhatsApp to your app, so you can send test messages before connecting your own business number. It can only message the handful of recipient numbers you add and verify.
Can I use the Meta test number in production?
No. It can only reach a few verified test recipients and it is not your business identity. Real customers must be messaged from your own verified and registered number.
How many numbers can the WhatsApp test number message?
Up to five recipient numbers that you add and verify in the API Setup page. Your production number has no such list and can message any customer within Meta's limits and opt-in rules.
Does my real number get a different Phone Number ID?
Yes. Your business number is a separate object with its own Phone Number ID, so you must replace the test ID everywhere in your code, environment settings and workflows.
How do I move WhatsApp Cloud API from the test number to my real number?
Add your number to your WhatsApp Business Account, verify it by SMS or voice, register it with a 6-digit PIN, then update your app with the new Phone Number ID and a system user access token, and make sure your app is subscribed to the WABA.
Do I need a new webhook URL for my production number?
Usually not. The webhook is set on your Meta app. You do need to subscribe the app to the production WABA and make sure your code accepts events for the new phone_number_id.
Can I use my existing WhatsApp Business app number with the Cloud API?
Yes, through coexistence, which a Tech Provider or Solution Partner offers using Embedded Signup. You keep using the Business app, but some app features such as broadcast lists and group chats stop working and API throughput is fixed at 20 messages per second.
Why does the test number work but my real number does not?
The usual causes are the old test Phone Number ID still in your code, an expired test token, a number that was verified but not registered, missing WABA access for the system user, or templates that only exist in another WABA.
What is the 6-digit PIN when registering a WhatsApp number?
It is the two-step verification PIN you set when you register the number for Cloud API. Store it safely, because Meta can ask for it again, for example when re-registering or migrating the number.


