Canvas node
Canvas edge
"out", every input "in", sub-node output also "in". See Canvas vs execution.
Execution WorkflowNode
parentId is set on sub-nodes only. connections.out is an array of target node ids.
NodeType catalog
IgnorestickyNote (canvas decoration) and deprecated assignTags / assignAgents (use updateConversation).
Triggers — category Trigger
Exactly one trigger. It lives in data.nodes and workflow.trigger, never in parsedData.
Manual POST
/trigger triggerData is copied onto whichever trigger type ran. Read it with return $<this-trigger-id>.triggerData.<key>; — see triggerData.
Actions — category Action
WhatsApp templates
The first WhatsApp node is not always a template. Infer from user intent:
Meta requires an approved template when the business opens a WhatsApp conversation (outside the 24-hour customer-care window). Pingmee encodes that as a message node with both
messageType: "template" and templateType: "whatsapp". A workflowTrigger child reached from a pointer during an inbound run is still in-session — custom is OK.
When
messageType: "template"
- Starter:
workflowTrigger+ POST /trigger / campaign-style send that opens the thread — the first WhatsApp node must be a template. - Any send after the 24-hour window has closed.
- The user asked for a named catalog template on a reply bot.
messageType: "custom" is OK
- Reply bot: inbound
pingmeeTriggerwitheventType: "Messages Created"or"New Conversation Started"(the customer just wrote; the window is open). First node can be custom text. - Later nodes in the same run after the customer has already replied to a template.
- Pointer child continuing an inbound session.
- Bind the workflow phone (Platform binding).
GET https://api.pingmee.co.il/templates?type=whatsapp&phoneNumberId=<associatedToBusinessId>.- Keep
status === "APPROVED". Skip PENDING / REJECTED. - Prefer BODY-only or BODY + QUICK_REPLY / URL buttons. If HEADER
formatisIMAGE,VIDEO, orDOCUMENTand noattachmentS3Idis on that component, do not use that template via API. - Paste the template into
data.templateInformationon both the canvas node and theparsedDatanode. - Bind every
{{n}}in BODY (and text HEADER). Missing keys send empty parameters and Meta rejects the send. - If BUTTONS include
QUICK_REPLY, setwaitForUserResponse: trueand add matchinganswersub-nodes (label= buttontext,index0-based). Outgoing edges from those answers usesourceHandle: "in".
attachmentS3Id. An AI authoring via REST must stay text / template-only unless an attachmentS3Id is already stored on the template component from a previous GUI save. Never put blob: URLs or arbitrary CDN links in templateInformation.attachment or header_handle.
Conditions — category Condition
comparison strings: "Equals", "Not Equal", "Greater than", "Greater than or equal", "Less than", "Less than or equal", "Contains", "Is Empty", "Is Not Empty". Contains expects secondValue as [{ "label": "hello" }].
Operations — category Operation
Sub-nodes
Full parenting rules: Sub-nodes.