Google Sheets integration
Append a row to one of your spreadsheets from a campaign — contact details plus any custom columns you define.
The Google Sheets integration lets a campaign write a row to a spreadsheet you own. Drop an Action step into a flow, pick Add row to Google Sheet, and every contact that reaches that step is appended as a new row — useful for handing qualified leads to a sales team, building an export a partner can read, or keeping a running log of who hit a milestone.
Connect your Google account
Open Settings → Integrations and choose Connect with Google. You'll approve access in Google's own screen and land back in EngageApp connected. Only an owner or admin can do this.
EngageApp asks for one narrow permission: access to files you specifically choose. It cannot see, list, or touch anything else in your Drive — not even other spreadsheets. You grant access to a sheet by picking it in the step editor, one sheet at a time.
Because campaigns run in the background, long after you've closed the browser, the connection is stored as a long-lived grant so a write can happen at 3am with nobody signed in. Revoke it at any time from your Google account permissions or by disconnecting here.
Or use a service account key
Under Use a service account key instead you can connect a Google Cloud service account rather than a personal account. Two reasons to prefer it:
- The connection outlives an employee. An OAuth connection belongs to the person who made it; if their Google account is deactivated, sheet writes stop. A service account belongs to your organisation.
- Self-hosted deployments. "Connect with Google" needs an OAuth client configured by whoever runs your instance. If it isn't available, this path always works.
- In the Google Cloud console, pick or create a project and enable the Google Sheets API.
- Create a service account, then create a JSON key for it and download the file.
- Paste the whole JSON key into the field and choose Test connection. The key is encrypted at rest and never shown again.
- EngageApp shows you the service account's email address. Share every spreadsheet you want to write to with that address, as an Editor. Without this, writes fail with a permission error — it is the single most common setup mistake.
Connecting one way replaces the other; a workspace has a single Google Sheets connection.
Add the step to a campaign
- Open your campaign in the flow builder and add an Action step where the write should happen.
- Set the action type to Add row to Google Sheet.
- Choose Choose from Google Drive and pick your spreadsheet. With a connected Google account this is also how the sheet is granted — picking it here is what gives EngageApp permission to that one file. (With a service account key, paste the sheet's URL or ID instead and share it with the service account.)
- Optionally name a tab. Leave it blank to write to the first tab.
A campaign that contains this step can't be activated until Google Sheets is connected, so a missing connection surfaces when you publish rather than as silently missing rows.
What gets written
Every row carries a written_at timestamp. With Include contact fields switched on (the default), the row also carries contact_id, email, first_name, last_name, phone, external_id, lifecycle_stage, timezone and subscribed.
Custom columns
Add any number of your own key/value pairs. The key becomes the column header; the value can be a constant like winter-promo, or use the same template variables as your messages — for example {{ contact.plan }} or {{ contact.attributes.company }} — so each row carries data specific to that contact. A custom column that reuses a standard column's name replaces it.
How columns line up
EngageApp reads the sheet's first row as the header and writes each value under the column with a matching name (case-insensitively). A key the sheet has never seen becomes a new column, appended to the right — so you can add a column to a live campaign without rearranging the sheet, and existing rows keep their shape. An empty sheet gets its header row written on the first append.
Values are always stored as plain text, never interpreted as spreadsheet formulas, so contact-supplied data can't execute inside your sheet.
When a write fails
If Google rejects the write — the sheet was never granted, the tab doesn't exist, the ID is wrong — the step is recorded as failed on the campaign's activity timeline with the reason, and the contact still continues through the rest of the flow. A failed row is not retried, so fix the cause and the next contacts through the step will write normally.
A permission error usually means one of two things. On a connected Google account, the sheet was pasted as a URL rather than picked, so it was never granted — re-pick it in the step. On a service account, the sheet isn't shared with the account's address.
Manage the connection
Review, reconnect, or disconnect at any time under Settings → Integrations. Disconnecting causes sheet steps to start failing, so pause affected campaigns first.
A connected Google account can also be revoked from Google's side, at your account permissions. If that happens, writes start failing until someone reconnects. For a service account, rotating the key in Google Cloud means pasting the new JSON here; leave the field blank to keep the stored key.
Next steps
- Build the flow that feeds the sheet in the flow builder.
- Decide who reaches the step with a segment or a branch.
- Reference contact data in columns using template variables.
Related
Flow builder
The drag-and-drop canvas where you assemble a campaign from trigger, send, delay, condition, and wait-until steps.
Contacts
How EngageApp models your end-users as contacts, the fields they carry, and the ways to add them.
Segments
Group contacts by attribute and behavior rules to target campaigns and manual enrollments.