Skip to main content

Canvas node

Canvas edge

Handles: root output "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

Ignore stickyNote (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.
When messageType: "custom" is OK
  • Reply bot: inbound pingmeeTrigger with eventType: "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.
Fetch and map (starter only, or a named template)
  1. Bind the workflow phone (Platform binding).
  2. GET https://api.pingmee.co.il/templates?type=whatsapp&phoneNumberId=<associatedToBusinessId>.
  3. Keep status === "APPROVED". Skip PENDING / REJECTED.
  4. Prefer BODY-only or BODY + QUICK_REPLY / URL buttons. If HEADER format is IMAGE, VIDEO, or DOCUMENT and no attachmentS3Id is on that component, do not use that template via API.
  5. Paste the template into data.templateInformation on both the canvas node and the parsedData node.
  6. Bind every {{n}} in BODY (and text HEADER). Missing keys send empty parameters and Meta rejects the send.
  7. If BUTTONS include QUICK_REPLY, set waitForUserResponse: true and add matching answer sub-nodes (label = button text, index 0-based). Outgoing edges from those answers use sourceHandle: "in".
Reply snippet: Examples — Pingmee trigger + keywords. Starter snippet: Examples — conversation opener. Attachments (limitation) There is no documented public upload API for agents. The board uploads blob URLs on save into 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.
Last modified on September 4, 2026