Skip to main content
Orbit workflows run on form submissions, booked meetings, deal stage changes and imports, and send data to CRMs, Slack, webhooks and more. Your app can be one of those steps. Turn on Available in workflows for the app in the Developer Portal, declare the actions it offers, and every workspace that has installed your app sees them in the workflow editor’s Installed apps section as “App: Action”.

Do you need this?

Two kinds of apps exist, and the difference is only where the app shows up: Pick API and webhooks when your app pulls or pushes data on its own (a CRM sync, an analytics import, an enrichment tool that reads contacts). Pick workflows when a workspace should be able to decide, per workflow, to send something to your app at a particular step (“when this form is submitted, send the event to App”). The portal shows a preview of the step before you turn it on, and you can change your mind later: turning it on for an approved app is a change request (you get the signing secret and can define actions right away; workspaces see the app once the request is approved), turning it off applies immediately. Running the step POSTs the inputs the workspace mapped to your endpoint, signed with your app’s action signing secret. Nothing is sent to workspaces that have not installed the app, and deliveries stop on their own when a workspace uninstalls it.

Declare an action

An action has: Declare up to 20 actions per app and 30 inputs per action. The workspace maps each input from its workflow fields ({{email}}, {{deal.amount}}, a literal) in the step’s panel; required inputs must be mapped before the workflow can be activated, and a run whose required input renders empty for that contact fails the step without calling you. Manage actions on the app’s page in the portal, or over the API with the app owner’s session: Turning an action off keeps the steps workspaces built; they fail with “the app turned off Action” until it is on again. Deleting it does the same, for good.

The delivery

Each run of the step is one POST to your endpoint:
team_id is the workspace that installed your app (the same id GET /api/v1/me and the webhook envelope carry), so you can look up the right account. inputs holds every declared input, typed as declared; an optional input the workspace left unmapped is null. Use contact.id with GET /api/v1/contacts/:id for anything beyond what was mapped. Headers: Verify the signature exactly as for webhooks, with the action signing secret instead of the webhook secret. The secret is shown once when you turn the feature on and can be rotated from the portal; rotate it before you change your verification, as deliveries use the new secret from the next run.

Your response

  • A 2xx means the step succeeded. A JSON body with an outputs object ({ "outputs": { "cometly_event_id": "evt_9" } }) is kept with the run and available to later steps; values are strings, numbers or booleans, at most 50 keys.
  • 408, 425, 429, any 5xx, a timeout (20 seconds) or a connection error is retried up to three times with backoff, like any destination step.
  • Any other 4xx is treated as your app refusing the call: the step fails at once with your response text in the run’s error, and is not retried.

For workspaces and agents

In the editor, installed apps’ actions appear under Installed apps in the add-step menu once the app is installed; each step’s panel shows your inputs with the workspace’s field picker. Over the API and MCP, GET /api/v1/workflows/schema lists them under app_actions, and a workflow node with "type": "destination", "provider": "app_action" and config { app_id, action_id, action_key, inputs: { "<input key>": "<template>" } } uses one.

Webhooks

Tell your app what happened in a workspace

Workflows API

Build and run workflows from code