Skip to main content

Must do

  • Send both data and parsedData plus trigger / triggerType on any graph save.
  • Keep the same node ids on the canvas, in parsedData, on trigger, and in every edge / connections.out.
  • Create is always inactive. Activate with PUT { "isActive": true } (no graph fields).
  • Graph PUT: echo lastModified from the last GET or create, or the API returns 409.
  • Leave associatedTo to the server (Cookie).
  • Pick a phone before save. GET phone numbers; if more than one, ask the user. Set associatedToBusinessId to that row’s id (not associatedBusinessId / WABA) and platformType on create. Optional associatedToPlatformId is 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). Root sourceHandle is "out"; sub-node sourceHandle is "in"; every targetHandle is "in"; edge type is "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 parentId from the producer node. Do not mint a new parent on a downstream binding.
  • Incoming run payload is triggerData on POST /trigger. Read it with return $<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 $nodeId inside Expression bodies to ids that exist in the destination (usually the new trigger). Stale $oldId.triggerData… does not resolve. Update Fixed parentIds the same way.
  • If/Else child titles must be true and false (case-insensitive).
  • WhatsApp answers: max 10. No public media upload. Text / template body only unless attachmentS3Id is 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 / buttonStats for 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, identifying notes
  • Deprecated assignTags / assignAgents (use updateConversation)
  • Sticky notes in parsedData (optional in data only)
  • Real customer names, phones, emails, CRM table names, agent ids, or other bots’ workflowIds in examples you commit
Last modified on September 4, 2026