Must do
- Send both
dataandparsedDataplustrigger/triggerTypeon any graph save. - Keep the same node ids on the canvas, in
parsedData, ontrigger, and in every edge /connections.out. - Create is always inactive. Activate with
PUT { "isActive": true }(no graph fields). - Graph PUT: echo
lastModifiedfrom the last GET or create, or the API returns 409. - Leave
associatedToto the server (Cookie). - Pick a phone before save. GET phone numbers; if more than one, ask the user. Set
associatedToBusinessIdto that row’sid(notassociatedBusinessId/ WABA) andplatformTypeon create. OptionalassociatedToPlatformIdis the same id. - Infer intent — do not force a template on reply bots. The first WhatsApp node is a Meta template only when the bot opens the conversation. Use the table in Infer starter vs reply.
- Copy every canvas edge into execution
connections.out(same node ids). RootsourceHandleis"out"; sub-nodesourceHandleis"in"; everytargetHandleis"in"; edgetypeis"buttonedge". See How to wire a graph. - Exactly one trigger node.
- A workflow pointer target must exist, be active, and start with
workflowTrigger. - Parameter slots are Fixed (
Variable), Expression (expression), or Custom (custom). Check Custom first when reading JSON. See Variables. - Copy Variable
parentIdfrom the producer node. Do not mint a new parent on a downstream binding. - Incoming run payload is
triggerDataon POST /trigger. Read it withreturn $<triggerNodeId>.triggerData.<key>;— the$…id is the trigger node id, not the workflow id. See Variables. - After copying a node into another workflow, rewrite every
$nodeIdinside Expression bodies to ids that exist in the destination (usually the new trigger). Stale$oldId.triggerData…does not resolve. Update FixedparentIds the same way. - If/Else child titles must be
trueandfalse(case-insensitive). - WhatsApp answers: max 10. No public media upload. Text / template body only unless
attachmentS3Idis already known — never put blob upload URLs in templates. Skip IMAGE / VIDEO / DOCUMENT header templates via API. - Before rewriting a live graph from analytics: GET first and read
analytics. If the field is missing, the plan may not include canvas analytics — do not invent counts. See Workflow analytics. - After a graph PUT the server prunes
nodeStats/edgeStats/buttonStatsfor ids no longer on the graph. New or renamed node ids have no stats until new executions. GET again before the next rewrite.
Infer starter vs reply
A pointer child with
workflowTrigger that continues an inbound session may still use custom. Template is required for POST /trigger, campaign-style outbound, or any send outside the 24-hour window.
Common failures
Do not send
analytics,executionCount, identifyingnotes- Deprecated
assignTags/assignAgents(useupdateConversation) - Sticky notes in
parsedData(optional indataonly) - Real customer names, phones, emails, CRM table names, agent ids, or other bots’
workflowIds in examples you commit