Integrations
Your app can post to Slack, add a contact to HubSpot, create a Linear issue or append a row to Google Sheets. Connect the service once, in a click or with an API key, and your workflows and server functions can use it. Credentials are kept in a vault and never reach the browser.
When to use it
- Tell your team about something (Slack, Teams, Discord, Google Chat).
- Keep another system in step (HubSpot, Salesforce, Notion, Airtable, Sheets).
- Send messages (Twilio, WhatsApp, Telegram, email providers).
For a service that isn't in the catalog, call its API from a server function.
Step by step
- Open the project, then Backend, Integrations. Find the service and click Connect (OAuth or an API key).
- Add an
integrationaction to a workflow, with the call and its props. - Apply and trigger it. The run log shows what the service answered.
Code
{ "id": "slack-new-member", "title": "Post new sign-ups to Slack",
"on": { "entity": "member", "event": "created" },
"do": [{ "action": "integration", "integration": "slack", "call": "send_channel_message",
"props": { "channel": "C0123456789", "text": "New sign-up: {{name}} ({{email}})" } }] }Short form for Slack, Twilio, Telegram and WhatsApp:
{ "action": "integration", "integration": "slack", "message": "New sign-up: {{name}}" }From a server function or custom code:
await ctx.integrations.call("hubspot", { action: "create-or-update-contact", email: String(row.email) });The calls a contract may use, with their props, are listed in the agent guide and in the integrations catalog.
Gotchas
- Steps are skipped until connected. Your app works before you connect anything; the run log says the step was skipped.
- Channel and list ids, not names. Props marked as ids take the provider's id (a Slack channel id like
C0123456789). - Stripe's connection supplies
STRIPE_SECRET_KEYtoctx.secrets. If it reads null, add the secret by hand.