Automate WhatsApp
When to use
Use this skill to build and run WhatsApp automations: workflow CRUD, graph edits, triggers, executions, function management, app integrations, and D1 database operations.
Setup
Env vars:
KAPSO_API_BASE_URL(host only, no/platform/v1)KAPSO_API_KEY
How to
Edit a workflow graph
- Fetch graph:
node scripts/get-graph.js <workflow_id>(note thelock_version) - Edit the JSON (see graph rules below)
- Validate:
node scripts/validate-graph.js --definition-file <path> - Update:
node scripts/update-graph.js <workflow_id> --expected-lock-version <n> --definition-file <path> - Re-fetch to confirm
For small edits, use edit-graph.js with --old-file and --new-file instead.
If you get a lock_version conflict: re-fetch, re-apply changes, retry with new lock_version.
Manage triggers
- List:
node scripts/list-triggers.js <workflow_id> - Create:
node scripts/create-trigger.js <workflow_id> --trigger-type <type> --phone-number-id <id> - Toggle:
node scripts/update-trigger.js --trigger-id <id> --active true|false - Delete:
node scripts/delete-trigger.js --trigger-id <id>
For inbound_message triggers, first run node scripts/list-whatsapp-phone-numbers.js to get phone_number_id.
Debug executions
- List:
node scripts/list-executions.js <workflow_id> - Inspect:
node scripts/get-execution.js <execution-id> - Get value:
node scripts/get-context-value.js <execution-id> --variable-path vars.foo - Events:
node scripts/list-execution-events.js <execution-id>
Create and deploy a function
- Write code with handler signature (see function rules below)
- Create:
node scripts/create-function.js --name <name> --code-file <path> - Deploy:
node scripts/deploy-function.js --function-id <id> - Verify:
node scripts/get-function.js --function-id <id>
Set up agent node with app integrations
- Find model:
node scripts/list-provider-models.js - Find account:
node scripts/list-accounts.js --app-slug <slug>(usepipedream_account_id) - Find action:
node scripts/search-actions.js --query <word> --app-slug <slug>(action_id = key) - Create integration:
node scripts/create-integration.js --action-id <id> --app-slug <slug> --account-id <id> --configured-props <json> - Add tools to agent node via
flow_agent_app_integration_tools
Database CRUD
- List tables:
node scripts/list-tables.js - Query:
node scripts/query-rows.js --table <name> --filters <json> - Create/update/delete with row scripts
Graph rules
- Exactly one start node with
id=start - Never change existing node IDs
- Use
{node_type}_{timestamp_ms}for new node IDs - Non-decide nodes have 0 or 1 outgoing
nextedge - Decide edge labels must match
conditions[].label - Edge keys are
source/target/label(notfrom/to)
For full schema details, see references/graph-contract.md.
Function rules
async function handler(request, env) {
// Parse input
const body = await request.json();
// Use env.KV and env.DB as needed
return new Response(JSON.stringify({ result: "ok" }));
}
- Do NOT use
export,export default, or arrow functions - Return a
Responseobject
Execution context
Always use this structure:
vars- user-defined variablessystem- system variablescontext- channel datametadata- request metadata
Scripts
Workflows
| Script | Purpose | |--------|---------| | list-workflows.js | List workflows (metadata only) | | get-workflow.js | Get workflow metadata | | create-workflow.js | Create a workflow | | update-workflow-settings.js | Update workflow settings |
Graph
| Script | Purpose | |--------|---------| | get-graph.js | Get workflow graph + lock_version | | edit-graph.js | Patch graph via string replacement | | update-graph.js | Replace entire graph | | validate-graph.js | Validate graph structure locally |
Triggers
| Script | Purpose | |--------|---------| | list-triggers.js | List triggers for a workflow | | create-trigger.js | Create a trigger | | update-trigger.js | Enable/disable a trigger | | delete-trigger.js | Delete a trigger | | list-whatsapp-phone-numbers.js | List phone numbers for trigger setup |
Executions
| Script | Purpose | |--------|---------| | list-executions.js | List executions | | get-execution.js | Get execution details | | get-context-value.js | Read value from execution context | | update-execution-status.js | Force execution state | | resume-execution.js | Resume waiting execution | | list-execution-events.js | List execution events |
Functions
| Script | Purpose | |--------|---------| | list-functions.js | List project functions | | get-function.js | Get function details + code | | create-function.js | Create a function | | update-function.js | Update function code | | deploy-function.js | Deploy function to runtime | | invoke-function.js | Invoke function with payload | | list-function-invocations.js | List function invocations |
App integrations
| Script | Purpose | |--------|---------| | list-apps.js | Search integration apps | | search-actions.js | Search actions (action_id = key) | | get-action-schema.js | Get action JSON schema | | list-accounts.js | List connected accounts | | create-connect-token.js | Create OAuth connect link | | configure-prop.js | Resolve remote_options for a prop | | reload-props.js | Reload dynamic props | | list-integrations.js | List saved integrations | | create-integration.js | Create an integration | | update-integration.js | Update an integration | | delete-integration.js | Delete an integration |
Databases
| Script | Purpose | |--------|---------| | list-tables.js | List D1 tables | | get-table.js | Get table schema + sample rows | | query-rows.js | Query rows with filters | | create-row.js | Create a row | | update-row.js | Update rows | | upsert-row.js | Upsert a row | | delete-row.js | Delete rows |
OpenAPI
| Script | Purpose | |--------|---------| | openapi-explore.mjs | Explore OpenAPI (search/op/schema/where) |
Install deps (once):
npm i
Examples:
node scripts/openapi-explore.mjs --spec workflows search "variables"
node scripts/openapi-explore.mjs --spec workflows op getWorkflowVariables
node scripts/openapi-explore.mjs --spec platform op queryDatabaseRows
Notes
- Prefer file paths over inline JSON (
--definition-file,--code-file) action_idis the same askeyfromsearch-actions--account-idusespipedream_account_idfromlist-accounts- Variable CRUD (
variables-set.js,variables-delete.js) is blocked - Platform API doesn't support it - Raw SQL execution is not supported via Platform API
References
Read before editing:
- [references/graph-contract.md](references/graph-contract.md) - Graph schema, computed vs editable fields, lock_version
- [references/node-types.md](references/node-types.md) - Node types and config shapes
- [references/workflow-overview.md](references/workflow-overview.md) - Execution flow and states
Other references:
- [references/execution-context.md](references/execution-context.md) - Context structure and variable substitution
- [references/triggers.md](references/triggers.md) - Trigger types and setup
- [references/app-integrations.md](references/app-integrations.md) - App integration and variable_definitions
- [references/functions-reference.md](references/functions-reference.md) - Function management
- [references/functions-payloads.md](references/functions-payloads.md) - Payload shapes for functions
- [references/databases-reference.md](references/databases-reference.md) - Database operations
Assets
| File | Description | |------|-------------| | workflow-linear.json | Minimal linear workflow | | workflow-decision.json | Minimal branching workflow | | workflow-agent-simple.json | Minimal agent