Outbound integrations (Slack, webhooks, API calls) are about what a flow
does as it runs. AI providers are about what FirstFlow’s own AI
runs on. These are configured in different places and fail independently.
How integrations fit the runtime
When a user qualifies for an experience, the backend walks its flow graph from the trigger, evaluating decisions and running action nodes in order, until it reaches a result node and composes a widget. Action nodes Slack, Webhook, API Call execute during that walk, on the server. A node can run inline (the walk waits for it) or be deferred until the next step, so a slow webhook need not block the widget the user is waiting on. The AI provider layer sits underneath that same walk: a classify node calls your chosen provider to pick a branch, and the result node calls Anthropic (claude-sonnet-4-6) to render the WidgetTree
that gets pushed to the browser. The diagram below shows where each integration
hooks into a single flow run.
Every box left of the browser runs on the backend. The browser only enters at
the end, when the finished widget arrives. See
Flows & nodes for the full node catalog and
How it works for the end-to-end cycle.
Slack
A Slack message node posts a message or DM to your workspace while a flow runs routing an escalation, alerting a channel when a survey response comes in, or notifying support that an experience fired. You connect Slack once via OAuth in the dashboard under Connections, pick a default channel, and then add the node to any flow and configure its destination and content. The node runs server-side when the walk reaches it, inline or deferred like any action node. Slack is optional and degrades gracefully. If the self-host environment lacksSLACK_CLIENT_ID, SLACK_CLIENT_SECRET, or SLACK_SIGNING_SECRET, the
provider simply isn’t offered and nothing else breaks. Full setup, OAuth scopes,
and node configuration live in Slack.
Webhooks
A Webhook node calls your backend as the flow runs to sync a survey answer, kick off a provisioning job, or notify an internal system. FirstFlow delivers webhooks reliably through its own outbox table and a retry worker with exponential backoff, so a momentary outage on your side does not drop the event. When you set a signing secret, each request carries an HMAC signature so you can verify authenticity. To verify, compute the HMAC of the raw request body with your secret and compare it in constant time to the signature header, rejecting anything that does not match. Experiences can also enqueue a webhook programmatically from a logic action rather than from a node on the canvas. That path is idempotent: the first enqueue is accepted and any duplicate of the same event is ignored, so a retried client call cannot fire your endpoint twice. Payload schemas, the event catalog, and verification details are in Webhooks.API calls
An API Call node fetches data from an external HTTP endpoint server-side during a flow run and makes the response available in the flow’s context, so downstream nodes including a guide’s widget composition can incorporate live data like account status, plan limits, or order state. Because the call runs on the backend, your endpoint and credentials are never exposed to the browser. The natural pairing is an API Call feeding a branch. Fetch the account first, then route on it with a classify or decision node — one guide for trial accounts, another for paid before the result node composes the final widget. Configuration and the request/response shape are in API calls.AI providers
FirstFlow’s AI features run on LLM providers you configure once in the dashboard under Settings → AI Providers, where each key is stored encrypted; you then assign which provider and model power each feature on an agent’s settings. The division of labor is fixed for one feature and configurable for the rest:
Supported providers are Anthropic, OpenAI, Cloudflare (Workers AI
gateway), and any OpenAI-compatible endpoint including self-hosted Ollama,
vLLM, and LM Studio. AI features degrade gracefully: when no key is configured
the rest of the platform keeps running, the affected AI step is skipped, and no
widget is composed for that path. See AI providers
for per-feature assignment.
This provider layer is internal to FirstFlow it is what FirstFlow’s backend
uses to render and route experiences. It is separate from the LLM client in
your own product that the server SDK wraps to observe
your conversations. Those observed turns are what power user-message triggers and
classifier context; tag every observed call with
firstflowAgentId, sessionId,
and userId:
Self-hosting
Slack, the AI providers, and the ClickHouse analytics warehouse are each optional. When a credential is absent the corresponding capability is simply unavailable and the rest of the platform continues to work, so you can adopt integrations incrementally. Set the relevant keys in your environment —ANTHROPIC_API_KEY, OPENAI_API_KEY, the SLACK_* secrets and consult
self-hosting Configuration for the full list.
Next
Pick the integration you’re wiring up next, or step back to the runtime that drives them in Flows & nodes.Slack
Connect via OAuth and post messages or DMs from a flow.
AI providers
Assign the LLM provider and model behind each AI feature.