Integration
Runs one action in a connected service such as Salesforce, HubSpot, Google Sheets or Slack, every time the flow reaches it, without AI.
Integration runs a single action in a third-party service: create a Salesforce case, append a Google Sheets row, send a Slack message. It runs the same action every time the flow reaches it, with the parameters you set. No model decides whether or how to call it.
When to use it
- Log every completed registration to a spreadsheet.
- Open a support ticket when a user reports a problem.
- Notify a team channel when an order comes in.
- When an AI should decide whether to call a service, and with what, give the AI Agent node the same integration as a tool instead.
- For a service that is not listed below, use the API node.


Set up the node
Pick a service
Open the node and search the list by name, category or action. Services you have already connected show Connected.
Pick an action and connect
Choose the action, for example Append Row. If the service is not connected yet, select Connect: OAuth services open the provider's sign-in; API-key services ask for the key, which is stored as a credential.
Fill in the parameters
Select Configure Tool to set the action's parameters. Values you type are the values sent, and can include variables such as {{state.email}}. A parameter you leave empty is taken from the step's input or from state instead.


Run executes the action with these values and shows the raw JSON response. It is a real call: running Append Row adds a row to the sheet.
Name the result
Enter Save Result To Variable, for example sheetResult, so later nodes can read the result.
Settings
Prop
Type
Outputs
| Handle | When |
|---|---|
| Success | The service accepted the action. |
| Failure | Failure path on: the service returned an error, or it could not be reached. |
The result
What your Save Result To Variable holds depends on the project type.
USSD and chatbot projects save the action's own result, as the service returns it. Google Sheets Read Rows, for example, returns { success, data, range, rows }, with the rows at data. When the action fails, the variable holds { success: false, error, message }.
Automation projects wrap the result in the same shape for every service:
{
"ok": true,
"provider": "google_sheets",
"operation": "append_row",
"status": 200,
"data": { },
"error": null,
"meta": { "timestamp": "2026-09-24T10:15:00.000Z" }
}data holds the service's response. On failure ok is false, data is null and error has message, category and code.
Capture response
Capture response items save single fields of the result into state, so later nodes can read {{state.lastName}} instead of digging through the whole result.
- Select + next to Capture response items.
- Select the new item, enter the Object path into the result, and in Save to variable enter the variable name.
- Optionally, give the item a Name. The list shows the name, or what the item does when it has none, for example
rows ← data.
A path reads the same object your Save Result To Variable holds (see The result):
| Project type | Google Sheets Read Rows: the rows are at |
|---|---|
| USSD, chatbot | data |
| Automation | data.data |
Paths use dots for fields and [0] for list positions, so data[1][0] is the first cell of the second row. Captures also run when the action fails, so you can capture error or message on the failure path. An item with no variable saves nothing, and the list says Saves to no variable under it.
When you select Run in Configure Tool, a Capture response section under the result shows what each item would save from it, or Nothing at the path when the path finds nothing. Fix a wrong path there before you publish.
Google Sheets
Every Google Sheets action takes the spreadsheet in spreadsheetId (the ID or the sheet's link), and the tab or cells in range (A1 notation, such as Sheet1!A:D) or sheetName (the whole tab). Values are written as plain text, so a phone number such as +233200000111 stays as typed.
Read Rows
Returns every row in data, each as a list of cell values, and in rows, each as { rowNumber, values } numbered as in the sheet.
Set hasHeaderRow to Yes when row 1 holds column names. The result then also has headers, and each entry in rows has its values keyed by header, from row 2: { rowNumber: 2, values: { Phone: "+233200000111", Name: "Kofi" } }. Left as Not set, Read Rows treats row 1 as data, as before.
Find or Add Row
Updates the row whose key column matches a value, or adds a row when none does. Use it to keep one row per caller, for example to save a survey's answers by phone number.
| Parameter | What it takes |
|---|---|
keyColumn | The column to match on: a header name in row 1, such as Phone, or a column letter, such as A. |
keyValue | The value to look for, such as {{state.phoneNumber}}. Surrounding spaces are ignored. It can't be empty. |
values | The row to write: a list in column order, or an object keyed by header names, such as { "Phone": "...", "Rating": "5" }. |
hasHeaderRow | Yes (the default when not set): row 1 holds the column names and is never matched. |
When a row matches, a list overwrites that row from the range's first column, and an object changes only the cells it names: the rest of the row, including formulas, stays as it is. When none matches, the row is added at the end. On an empty tab, an object's names become the header row.
The result is { success, action, rowNumber, range }, where action is updated or added. Find or Add Row writes nothing and fails with a message when the key column isn't a header or a letter in the range, an object names a column the sheet doesn't have, keyValue is empty, or a list is given for a tab with no header row yet.
Available services
| Service | Category | Connect with | Actions |
|---|---|---|---|
| Airtable | Database | API key | Create Records, Get Record, List Records, Update Records, Delete Records |
| Asana | Project Management | API key | Create Task, Get Task, Update Task, List Tasks in Project, Add Comment, Get Project |
| Calendly | Productivity | OAuth | Get User Info, List Event Types, Get Scheduled Events, Cancel Event |
| ClickUp | Project Management | API key | Create Task, Get Task, Update Task, List Tasks, Create Comment, Get Workspace Members |
| Discord | Communication | API key | Send Message, Send Direct Message, Create Channel, Get Guild Info, Add Role to Member, Delete Message |
| GitHub | Developer Tools | API key | Create Issue, Get Issue, List Issues, Create Pull Request, Add Comment, Get Repository |
| Gmail | Communication | OAuth | Send Email, Reply to Email |
| Google Calendar | Productivity | OAuth | Create Event, Get Events, Update Event, Delete Event |
| Google Drive | Productivity | OAuth | List Files, Get File, Download File, Upload File, Create Folder, Delete File, Share File |
| Google Sheets | Productivity | OAuth | Read Rows, Find or Add Row, Append Row, Update Row, Clear Range |
| HubSpot | CRM | OAuth | Create Contact, Update Contact, Create Company, Create Deal |
| Infobip | Communication | API key | Send SMS, Get SMS Reports, Send Voice Message, Get Account Balance |
| Jira | Project Management | API key | Create Issue, Get Issue, Update Issue, Search Issues, Add Comment |
| Mailchimp | Marketing | API key | Create Contact, Get Contact, Update Contact, List Contacts, Create Campaign, Send Campaign |
| Make (Integromat) | Automation | API key | Trigger Scenario, Get Scenario Execution |
| Microsoft Outlook | Communication | OAuth | Send Email, List Emails, Get Email, Create Calendar Event, List Calendar Events, Update Calendar Event |
| MongoDB | Database | API key | Find Documents, Find One Document, Insert Document, Update Document, Delete Document, Aggregate |
| Notion | Productivity | OAuth | Create Page, Get Page, Update Page, Query Database, Append Block Children, Search |
| Pipedrive | CRM | API key | Create Deal, Get Deal, Update Deal, Create Person, Search Persons, Add Activity |
| PostgreSQL | Database | API key | Select Rows, Insert Row, Update Rows, Delete Rows, Upsert Row, Call Function (RPC) |
| Redis | Database | API key | Get, Set, Delete Key, Increment, Hash Set, Hash Get All, Publish |
| Salesforce | CRM | API key | Add Comment to Case, Create Case, Create Contact, Create Lead, Update Case, Update Contact, Update Lead |
| SendGrid | API key | Send Email, Send Template Email, Add Contact, Get Contact, Remove Contact, Create List, Add Contacts to List | |
| Shopify | E-commerce | API key | Create Product, Get Product, Update Product, List Orders, Get Order, List Customers |
| Slack | Communication | OAuth | Send Message, Create Channel, Get User Info, Add Reaction |
| Stripe | Finance | API key | Create Customer, Create Payment Intent, Get Customer, List Charges, Create Subscription, Get Payment Methods |
| Telegram | Communication | API key | Send Message, Send Photo, Send Document, Get Chat, Get Updates, Pin Message |
| Todoist | Productivity | API key | Create Task, Get Task, Update Task, Close Task, List Tasks, List Projects |
| Trello | Project Management | API key | Create Card, Get Card, Update Card, Get Board, List Cards in List, Add Comment to Card |
| Twilio | Communication | API key | Send SMS, Make Call, Get Call Logs, Get SMS Logs |
| WhatsApp Business Cloud | Communication | API key | Send Text Message, Send Template Message, Send Media Message, Send Interactive Message, Mark Message as Read, Get Message Templates |
| Zendesk | Support | OAuth | Create Ticket, Add Ticket Comment, Find Tickets, Update Ticket, Find Group, Find Latest Comment, Find User, Update Organization |
Example
A chatbot logs every completed lead to a sheet and alerts sales:
- Form collects name, email and budget as
lead. - Integration, Google Sheets Append Row, values
{{state.lead.name}},{{state.lead.email}},{{state.lead.budget}}, resultsheetResult. - Integration, Slack Send Message to
#sales: "New lead:{{state.lead.name}}". - Reply: "Thanks, someone will be in touch."
Connect each node's Failure output to a Reply that still thanks the user, so a service outage does not leave them without an answer.
Languages
In chatbot and automation projects that serve more than one language, an Integration node that sends someone a message has a Languages section:
- Send in picks which language each person gets: the language saved on the recipient's contact (the default in automations), the conversation's language (the default in chatbots), or a language from the flow.
- The message's translations, for the tools that send one: WhatsApp text and media captions, Telegram messages and captions, Twilio and Infobip SMS, and Gmail, Outlook and SendGrid email subjects and bodies. Only text typed into the node is translated; a value from an earlier step is sent as it is.
- Template languages, for WhatsApp templates: each language the template is approved in, with the code Meta uses for it, such as
pt_BR.
See Messages in several languages.
Tips and limits
- A disconnected service fails at run time. The panel shows Not Connected with a Connect button; reconnect after an OAuth token is revoked or a key rotated.
- Each service has its own rate limits. When calling one for many items in an automation, use Loop pacing.
- In automations, WhatsApp Business Cloud and Telegram messages sent through this node are added to the recipient's conversation in the Inbox, but only when the send succeeds.
Related
API
Calls any HTTP endpoint with your method, headers, auth and body, captures fields from the response into state, and routes on success or failure.
Collect Payment
Requests a payment by mobile money prompt (MTN MoMo, M-Pesa) or card checkout link (Paystack, Flutterwave, Stripe) on USSD, chat, a call or an automation.