- Bots, flows & AI
- Practitioner
- Developers
Flow Lifecycle
Also called: WhatsApp Flow status · Flow statuses · Flow status lifecycle
The Flow lifecycle is the set of statuses a WhatsApp Flow moves through — Draft, Published, Throttled, Blocked, Deprecated — and what you can do in each.
Reviewed
What is the Flow lifecycle?
The Flow lifecycle is the sequence of statuses a WhatsApp Flow passes through from creation to retirement, together with the rules for what can be edited, sent and opened in each. There are five: DRAFT, PUBLISHED and DEPRECATED, which the business controls, and THROTTLED and BLOCKED, which WhatsApp sets on its own when it detects that a Flow's endpoint or screen navigations are unhealthy.
A new Flow starts as a draft. In DRAFT its Flow JSON and settings can change freely, it can be deleted, and it can be sent only for testing, with mode: "draft" in the message. Publishing moves it to PUBLISHED, after which it can never be deleted. Meta's lifecycle guide lets you edit a published Flow's metadata or Flow JSON, but the edit returns it to Draft until you publish again, and only messages sent after that carry the new version — Flows already delivered keep the one they were sent with. Some older Flows don't support editing and must be cloned with clone_flow_id instead. When a Flow is no longer wanted, deprecating it retires it for good: it can no longer be sent to real customers, it can't be restored, and Meta warns that copies already on customers' phones may still send responses.
The two system statuses protect customers from broken Flows. When endpoint error rate, latency or availability deteriorate, a published Flow becomes THROTTLED — it still opens and sends, but only 10 messages an hour — and if health keeps getting worse it becomes BLOCKED: the business cannot send it and customers cannot open copies they already received. Recovery is automatic and runs back the same way: once the endpoint is healthy again, a blocked Flow moves to Throttled and then to Published. The lifecycle describes the Flow's state over time, separate from its content (the Flow JSON) and from the status of any template used to send it.
Key takeaways
- Every WhatsApp Flow is in one of five statuses: DRAFT, PUBLISHED, THROTTLED, BLOCKED or DEPRECATED.
- Drafts can be deleted and sent only for testing; once published, a Flow can never be deleted, only deprecated for good.
- Editing a published Flow returns it to Draft until you publish again, and messages already sent keep the old version.
- WhatsApp sets THROTTLED (10 sends an hour) and BLOCKED automatically when a Flow's endpoint is unhealthy.
- Status changes arrive as
FLOW_STATUS_CHANGEevents on theflowswebhook field.
Interactive stop
Follow a Flow from draft to retirement
- Draft to Published: publish
- Draft to Deleted: delete
- Published to Draft: edit
- Published to Throttled: health drops
- Throttled to Published: recovers
- Throttled to Blocked: gets worse
- Blocked to Throttled: improves
- Published to Deprecated: deprecate
- Draft
- Published
- Deprecated
Step 3 of 3 · end of walk
Deprecated
Retired by the business, from Published, Throttled or Blocked. It can no longer be sent to real customers and the change is one-way; late responses from delivered copies may still arrive.
Arrived from Published via deprecate.
Can move to
Nothing — this is a final state.
Happy path, step 3 of 3: Deprecated (via deprecate). Retired by the business, from Published, Throttled or Blocked. It can no longer be sent to real customers and the change is one-way; late responses from delivered copies may still arrive.
How does the Flow lifecycle work?
Create: DRAFT
POST /{WABA_ID}/flowscreates the Flow as a draft. Upload Flow JSON, clear thevalidation_errors, and send test messages withmode: "draft".Publish: PUBLISHED
POST /{FLOW_ID}/publishmakes it sendable to every customer. Meta expects a verified business with high message quality and no open validation errors or publishing checks; from then on the Flow can't be deleted.Change it: edit or clone
Uploading new Flow JSON or metadata to a published Flow returns it to Draft; test it and publish again, and only new sends carry the change. For a big change, or an older Flow that doesn't support editing, create a new Flow with
clone_flow_id, test the draft, publish it and switch your sends to the newflow_idwhile the original keeps running.React to THROTTLED and BLOCKED
If the endpoint degrades, WhatsApp limits the Flow to 10 messages an hour (sends beyond that fail with error 132069), then blocks it (error 132068). Fix the endpoint; the status recovers on its own.
Retire: DEPRECATED
POST /{FLOW_ID}/deprecatestops the Flow being sent to real customers once a replacement is live. It can't be undone, and only drafts can be deleted outright. Keep handling its responses for a while — copies already delivered may still be submitted — before you retire its endpoint.
The Flow lifecycle: key facts and limits
- Statuses
- DRAFT, PUBLISHED, THROTTLED, BLOCKED, DEPRECATED
- Set by the business
- Draft (on create), Published, Deprecated
- Set by WhatsApp
- Throttled and Blocked, on unhealthy endpoint or navigations
- Throttled
- Opens and sends, but only 10 messages an hour (error 132069 beyond)
- Blocked
- Can't be sent or opened (error 132068)
- Edit or delete
- Delete drafts only; editing a published Flow returns it to Draft
- Deprecated
- Can't be sent to real customers; terminal, can't be restored
- Webhook
- flows field, event FLOW_STATUS_CHANGE
The Flow lifecycle in code
# Publish a draft (fails while validation_errors remain)curl -X POST "https://graph.facebook.com/v26.0/{FLOW_ID}/publish" \-H "Authorization: Bearer {ACCESS_TOKEN}"# Check status, validation errors and health before a campaigncurl "https://graph.facebook.com/v26.0/{FLOW_ID}?fields=name,status,validation_errors,health_status" \-H "Authorization: Bearer {ACCESS_TOKEN}"# Small change: upload new Flow JSON (a published Flow returns to DRAFT; publish again)curl -X POST "https://graph.facebook.com/v26.0/{FLOW_ID}/assets" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-F "file=@flow.json;type=application/json" -F "name=flow.json" -F "asset_type=FLOW_JSON"# Big change or an older Flow: clone it into a new draft (the original keeps running)curl -X POST "https://graph.facebook.com/v26.0/{WABA_ID}/flows" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{ "name": "admission_enquiry_v2", "categories": ["LEAD_GENERATION"], "clone_flow_id": "{FLOW_ID}" }'# Retire the old version (one-way)curl -X POST "https://graph.facebook.com/v26.0/{FLOW_ID}/deprecate" \-H "Authorization: Bearer {ACCESS_TOKEN}"# Delete: drafts onlycurl -X DELETE "https://graph.facebook.com/v26.0/{FLOW_ID}" \-H "Authorization: Bearer {ACCESS_TOKEN}"
Common mistakes with the Flow lifecycle
Expecting an edit to reach Flows already sent
Customers who already received the Flow keep the version they were sent, and the edited Flow sits in Draft until you publish again. Keep your webhook tolerant of both versions' payloads for a while, and resend the Flow if everyone needs the new one.
Launching with draft settings
Drafts can only be sent in test mode. If production code still sends
mode: "draft"or a draftflow_id, real customers won't receive the Flow. Publish first and drop the draft flag.Deprecating too early
Deprecation is permanent and stops every new send. Check that no template, campaign or bot path still references the old
flow_idbefore you deprecate it, and keep handling its responses afterwards — Meta warns they can still arrive from copies already delivered.Missing a throttle
A throttled Flow still sends — just ten an hour — so campaigns degrade quietly. Subscribe to the
flowswebhook, alert on THROTTLED and BLOCKED, and watch endpoint health before it gets that far.
Example: A clone release and a throttle in Lucknow
A Lucknow coaching institute publishes an admission-enquiry Flow in March. In June it needs a new "preferred batch" field. Rather than editing the live Flow mid-admissions, the developer clones it so the current version keeps taking enquiries, adds the field to the draft, has two counsellors test it with mode: "draft", publishes the clone and points the website's click-to-chat handler at the new flow_id. The original is deprecated a week later, once no campaign still uses it, and the webhook keeps accepting its older payload shape for late submissions. In July the institute's endpoint slows down during results week: a FLOW_STATUS_CHANGE webhook reports PUBLISHED → THROTTLED, the on-call engineer scales the endpoint, and a second event reports THROTTLED → PUBLISHED forty minutes later — before the Flow ever reached Blocked.
Why does the Flow lifecycle matter?
Status decides whether a Flow works for customers right now. Teams get caught out in predictable ways: they edit a live Flow and expect customers who already received it to see the fix, they forget that testers were using a draft real customers cannot receive, or they miss a throttle until a campaign mysteriously sends ten an hour. Tracking status through the webhook and the API, and treating every change as a tested release with a version number, keeps Flows dependable.
Best practices for the Flow lifecycle
- Put the version in the Flow name (
admission_enquiry_v2) so clones are easy to tell apart. - Keep the live
flow_idin configuration, not code, so switching versions is a config change. - Check
health_statusbefore a large campaign that uses a Flow with an endpoint. - Keep the old version published until the new one is proven, then deprecate it.
Flow Lifecycle FAQs
Can I edit a WhatsApp Flow after publishing it?+
Why is my WhatsApp Flow throttled?+
What happens to Flows customers already received when a Flow is blocked?+
Can I delete a WhatsApp Flow?+
Talk to InfiQ
From definition to your first message
InfiQ is an official Meta Business Partner. Start a 7-day free trial — no card needed — and see this running on your own number.