Buni.aiDocs
USSDChatbotVoice (IVR)Automation

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.
Integration panel showing Google Sheets Append Row, Connected, with Capture response items, Retry and Failure path

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.

The Configure Tool dialog for Google Sheets Append Row, with the values, sheet_name and spreadsheet_id parameters and a Run button
Configure Tool for Append Row.

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

HandleWhen
SuccessThe service accepted the action.
FailureFailure 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.

  1. Select + next to Capture response items.
  2. Select the new item, enter the Object path into the result, and in Save to variable enter the variable name.
  3. 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 typeGoogle Sheets Read Rows: the rows are at
USSD, chatbotdata
Automationdata.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.

ParameterWhat it takes
keyColumnThe column to match on: a header name in row 1, such as Phone, or a column letter, such as A.
keyValueThe value to look for, such as {{state.phoneNumber}}. Surrounding spaces are ignored. It can't be empty.
valuesThe row to write: a list in column order, or an object keyed by header names, such as { "Phone": "...", "Rating": "5" }.
hasHeaderRowYes (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

ServiceCategoryConnect withActions
AirtableDatabaseAPI keyCreate Records, Get Record, List Records, Update Records, Delete Records
AsanaProject ManagementAPI keyCreate Task, Get Task, Update Task, List Tasks in Project, Add Comment, Get Project
CalendlyProductivityOAuthGet User Info, List Event Types, Get Scheduled Events, Cancel Event
ClickUpProject ManagementAPI keyCreate Task, Get Task, Update Task, List Tasks, Create Comment, Get Workspace Members
DiscordCommunicationAPI keySend Message, Send Direct Message, Create Channel, Get Guild Info, Add Role to Member, Delete Message
GitHubDeveloper ToolsAPI keyCreate Issue, Get Issue, List Issues, Create Pull Request, Add Comment, Get Repository
GmailCommunicationOAuthSend Email, Reply to Email
Google CalendarProductivityOAuthCreate Event, Get Events, Update Event, Delete Event
Google DriveProductivityOAuthList Files, Get File, Download File, Upload File, Create Folder, Delete File, Share File
Google SheetsProductivityOAuthRead Rows, Find or Add Row, Append Row, Update Row, Clear Range
HubSpotCRMOAuthCreate Contact, Update Contact, Create Company, Create Deal
InfobipCommunicationAPI keySend SMS, Get SMS Reports, Send Voice Message, Get Account Balance
JiraProject ManagementAPI keyCreate Issue, Get Issue, Update Issue, Search Issues, Add Comment
MailchimpMarketingAPI keyCreate Contact, Get Contact, Update Contact, List Contacts, Create Campaign, Send Campaign
Make (Integromat)AutomationAPI keyTrigger Scenario, Get Scenario Execution
Microsoft OutlookCommunicationOAuthSend Email, List Emails, Get Email, Create Calendar Event, List Calendar Events, Update Calendar Event
MongoDBDatabaseAPI keyFind Documents, Find One Document, Insert Document, Update Document, Delete Document, Aggregate
NotionProductivityOAuthCreate Page, Get Page, Update Page, Query Database, Append Block Children, Search
PipedriveCRMAPI keyCreate Deal, Get Deal, Update Deal, Create Person, Search Persons, Add Activity
PostgreSQLDatabaseAPI keySelect Rows, Insert Row, Update Rows, Delete Rows, Upsert Row, Call Function (RPC)
RedisDatabaseAPI keyGet, Set, Delete Key, Increment, Hash Set, Hash Get All, Publish
SalesforceCRMAPI keyAdd Comment to Case, Create Case, Create Contact, Create Lead, Update Case, Update Contact, Update Lead
SendGridEmailAPI keySend Email, Send Template Email, Add Contact, Get Contact, Remove Contact, Create List, Add Contacts to List
ShopifyE-commerceAPI keyCreate Product, Get Product, Update Product, List Orders, Get Order, List Customers
SlackCommunicationOAuthSend Message, Create Channel, Get User Info, Add Reaction
StripeFinanceAPI keyCreate Customer, Create Payment Intent, Get Customer, List Charges, Create Subscription, Get Payment Methods
TelegramCommunicationAPI keySend Message, Send Photo, Send Document, Get Chat, Get Updates, Pin Message
TodoistProductivityAPI keyCreate Task, Get Task, Update Task, Close Task, List Tasks, List Projects
TrelloProject ManagementAPI keyCreate Card, Get Card, Update Card, Get Board, List Cards in List, Add Comment to Card
TwilioCommunicationAPI keySend SMS, Make Call, Get Call Logs, Get SMS Logs
WhatsApp Business CloudCommunicationAPI keySend Text Message, Send Template Message, Send Media Message, Send Interactive Message, Mark Message as Read, Get Message Templates
ZendeskSupportOAuthCreate 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:

  1. Form collects name, email and budget as lead.
  2. Integration, Google Sheets Append Row, values {{state.lead.name}}, {{state.lead.email}}, {{state.lead.budget}}, result sheetResult.
  3. Integration, Slack Send Message to #sales: "New lead: {{state.lead.name}}".
  4. 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.
Last reviewed 7 October 2026

On this page