Integrations & Plugins
Connect your workflows to hundreds of external services — Stripe, GitHub, Slack, Google, Notion, Airtable, HubSpot, Shopify and many more — without writing integration code. Each service brings a set of actions (do something) and triggers (start a workflow when something happens).
The integrations catalog
Click Browse Integrations (the box icon by the Plugins section of the node palette) to open the catalog. It's organised so it scales to hundreds of services:
- Brands — the top level. Vendors with several products (Google, Microsoft) group their services under one tile; single-service vendors are their own tile.
- Services — the products within a brand (e.g. Google → Sheets, Drive, Gmail, Calendar).
- Operations — the individual actions and triggers a service offers.
Use the search box at any level to jump straight to a service or operation.
Adding an integration to a workflow
- From the node palette, drag a service onto the canvas (or pick it in Browse Integrations).
- An operation picker opens. At the top you'll see two tabs:
- Actions — operations that do something (create a charge, send a message, add a row).
- Triggers — operations that start a workflow when something new appears (only shown for services that have them).
- Choose an operation. It drops onto the canvas as a node and its configuration panel opens automatically.
Each node is self-contained: everything it needs to run is stored on the node, so your workflow stays portable and opens instantly.
Actions vs triggers
| Action | Trigger | |
|---|---|---|
| What it does | Performs an operation on demand | Starts a workflow when something new appears |
| Where it sits | In the middle of a flow | At the beginning of a flow |
| Inputs | Takes input from upstream nodes | Has no input — it's the starting point |
| Examples | "Create a charge", "Send a message", "Add a row" | "New charge", "New issue", "New row" |
A trigger node has no input connector — that's how you can tell at a glance that it begins a flow. Try to connect something into it and the editor will refuse.
Connecting your account
Most services need a connection (your credentials) before they can run. Open the node's configuration panel and either:
- Paste a token / API key — for services that use a key or personal access token, or
- Connect with OAuth — for services that support it, sign in and authorise Circuitry.
Connections are saved and reused across every node and workflow, so you only set up a service once. Your credentials are stored encrypted and never appear in the workflow itself.
If a node shows "needs a connection", open it and select or create one — that message is there to save you from a confusing error later.
Using triggers
Triggers turn an integration into the start of an automation: "whenever there's a new charge in Stripe, do X", "whenever a new issue is opened in GitHub, do Y".
How they work
A trigger polls the service on a schedule and fires once per new item. It remembers the newest item it has already seen (by a creation time or id), so it only fires for items that are genuinely new — you won't get the same row twice.
Test it before you build: "Fetch latest"
When you open a trigger's configuration you'll see a Fetch latest button. Click it to poll the service once, right now, and the most recent item appears in the node's output. This lets you see the exact shape of the data a trigger will emit — its fields and values — so you can wire up the downstream nodes against real data before the automation ever runs live.
Examples
- Stripe — New charge: fires for each new payment, ordered by when it was created.
- GitHub — New issue: fires when an issue is opened in a repository (you choose the owner and repo).
- Airtable — New record: fires when a row is added to a table.
Using a node's output
Every node's output is available to the nodes after it through template variables. Reference a field with double curly braces:
{{input.amount}} the "amount" field of the item
{{input.id}} the item's id
{{input.customer.email}} a nested field
For a trigger, each fire emits one item, so {{input.<field>}} refers to that new charge / issue / row. Pass those values into the next action — e.g. a "New charge" trigger → a "Send a Slack message" action with A new charge of {{input.amount}} arrived.
Tips & troubleshooting
- "Needs a connection" — open the node and select or create a connection for that service.
- A trigger won't accept an input edge — that's by design; triggers start the flow.
- Some operations need an id (a spreadsheet, a base/table, a repo). Where possible the configuration offers a picker so you choose the resource instead of pasting an id.
- Don't see a Triggers tab for a service? That service doesn't expose a pollable list yet — it's available as actions only.
Building your own
Need a service that isn't in the catalog yet? Use the Plugin Wizard to add one: describe the API in plain language and Circuitry generates the node for you. It then behaves exactly like any catalog integration.
Next steps
- Workflows — build the automation around your integrations
- Webhooks — start a workflow from an inbound request instead of polling
- Template variables — pass data between nodes
- Environment variables — keep secrets out of your workflows