Data Integrations
Sync community data with spreadsheets, CRM tools, and external services. These integrations work as action nodes in the Workflow Builder.
Overview
| Service | Operations | Auth Method |
|---|---|---|
| Google Sheets | Append row, update cells, update row, read rows, lookup row, clear range | Service Account or OAuth2 |
| HubSpot | Upsert contact, create deal, add/remove from list | OAuth2 or Private App Token |
| Mailchimp | Subscribe/unsubscribe, add/remove tag | API key |
| Kit (ConvertKit) | Subscribe/unsubscribe, add/remove tag | API key |
| Webhook | Custom HTTP POST/PUT to any URL | Bearer token, API key, or custom headers |
Google Sheets
Setup
Option 1: Service Account (recommended)
- Go to Google Cloud Console
- Create a project → Enable Google Sheets API
- Go to Credentials → Create Service Account
- Download the JSON key file
- Open your spreadsheet → click Share → add the service account email (e.g.,
my-bot@project.iam.gserviceaccount.com) as Editor
Option 2: OAuth2
- In Uni8, click Connect and sign in with your Google account
- Authorize access to Google Sheets
In Uni8:
- Go to Settings > Automations > Integrations > Google Sheets
- Upload the JSON key file (Service Account) or click Connect (OAuth2)
- Click Test Connection
Actions
Append Row
Add a new row to the bottom of a sheet. Best for logging events, registrations, or transactions.
Configuration:
| Field | Description | Example |
|---|---|---|
| Spreadsheet ID | The ID from the sheet URL | 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms |
| Sheet Name | Tab name within the spreadsheet | Sheet1 |
| Columns | Values for each column, one per line | See below |
Column values — Enter one value per line. Each line maps to a column (A, B, C, ...):
{{ user.name }}
{{ user.email }}
{{ triggerPayload.membershipTier }}
{{ triggerPayload.amount }}
This produces a row: | John Doe | john@example.com | Pro | 500000 |
Supports up to 50 columns per row.
Update Cells
Modify a specific cell range. Best for updating dashboards, status fields, or summary tables.
Configuration:
| Field | Description | Example |
|---|---|---|
| Spreadsheet ID | Sheet ID from URL | 1BxiMVs0XRA... |
| Range | Cell range in A1 notation | Sheet1!B2:D2 |
| Values | New values, one per line | See below |
Example — Update a member's status:
- Range:
Members!C5:E5 - Values:
Active
2025-01-15
Pro Tier
Update Row
Find a row by matching a column value, then update specific cells in that row.
Configuration:
| Field | Description | Example |
|---|---|---|
| Spreadsheet ID | Sheet ID from URL | 1BxiMVs0XRA... |
| Sheet Name | Tab name | Members |
| Lookup Column | Column to search in (A, B, C...) | A |
| Lookup Value | Value to match | {{ user.email }} |
| Update Columns | Column-value pairs to update | See below |
Example — Update member tier when membership changes:
- Lookup Column:
A(email column) - Lookup Value:
{{ user.email }} - Update: Column C =
{{ triggerPayload.newTier }}, Column D ={{ triggerPayload.date }}
Read Rows
Read data from a range. Useful for checking existing data before writing.
Configuration:
| Field | Description | Example |
|---|---|---|
| Spreadsheet ID | Sheet ID from URL | 1BxiMVs0XRA... |
| Range | Cell range to read | Sheet1!A1:D100 |
Returns row data that can be used in subsequent workflow nodes.
Lookup Row
Search for a specific row by matching a value in a column. Returns the first matching row.
Configuration:
| Field | Description | Example |
|---|---|---|
| Spreadsheet ID | Sheet ID from URL | 1BxiMVs0XRA... |
| Sheet Name | Tab name | Members |
| Lookup Column | Column to search | B |
| Lookup Value | Value to find | {{ user.email }} |
Clear Range
Remove all values from a cell range without deleting the cells.
Configuration:
| Field | Description | Example |
|---|---|---|
| Spreadsheet ID | Sheet ID from URL | 1BxiMVs0XRA... |
| Range | Cell range to clear | Sheet1!A2:Z1000 |
Common Use Cases
| Use Case | Action | Example |
|---|---|---|
| Log new members | Append Row | Name, email, join date, tier |
| Track event attendance | Append Row | Name, event title, check-in time |
| Update member status | Update Row | Find by email, update tier column |
| Export payment records | Append Row | Amount, date, product, buyer |
| Monthly report dashboard | Update Cells | Update summary cells with totals |
HubSpot CRM
Setup
OAuth2 (recommended):
- In Uni8, click Connect and authorize with HubSpot
Private App Token:
- Go to HubSpot Developers
- Create a Private App with scopes:
crm.objects.contacts.write,crm.objects.deals.write,crm.lists.write - Copy the access token
Actions
Upsert Contact
- Create or update a contact by email address
- Map community profile fields to HubSpot contact properties
- Supports custom properties
| Field | Maps To |
|---|---|
{{ user.email }} | Email (lookup key) |
{{ user.name }} | First/Last name |
{{ triggerPayload.membershipTier }} | Custom property |
Create Deal
- Create a deal in a specific pipeline and stage
- Attach to an existing contact
- Set deal amount, name, and close date
Add/Remove from List
- Add or remove a contact from a static list
- Useful for segmenting members by tier, event attendance, or course completion
Mailchimp
Setup
- Go to Mailchimp Account Settings > API Keys
- Generate a new API key
- In Uni8, paste the key — datacenter is detected automatically from the key suffix
Actions
- Subscribe — Add or update a member in an audience (upsert by email)
- Unsubscribe — Remove a member from an audience
- Add tag — Apply a tag to a subscriber for segmentation
- Remove tag — Remove a tag from a subscriber
Supports custom merge fields for additional profile data.
Kit (ConvertKit)
Setup
- Go to Kit Settings > Developer and copy your API key
- In Uni8, paste the API key
Actions
- Subscribe — Add a subscriber (upsert by email)
- Unsubscribe — Remove a subscriber
- Add tag — Tag a subscriber
- Remove tag — Remove a tag
Supports custom fields.
Webhook (Custom)
Send data to any external URL when a workflow runs. Ideal for connecting services that don't have a built-in integration.
Setup
No credential needed — configure per action in the workflow.
Configuration
| Field | Description |
|---|---|
| URL | HTTPS endpoint to receive data |
| Method | POST or PUT |
| Headers | Custom headers (e.g., Authorization, Content-Type) |
| Body Template | JSON body with {{ }} expressions |
| Retry Count | 0–5 retries with exponential backoff |
Example Body Template
{
"event": "membership_purchased",
"member": {
"name": "{{ user.name }}",
"email": "{{ user.email }}"
},
"tier": "{{ triggerPayload.membershipTier }}",
"amount": "{{ triggerPayload.amount }}"
}
Security Features
- HTTPS only — HTTP URLs are blocked
- HMAC-SHA256 signing — Each tenant gets a unique signing secret. The signature is sent in
X-Webhook-Signatureheader for payload verification - SSRF protection — Internal/private IP addresses are blocked
- Timeout — 10-second timeout per attempt
- Retry — Exponential backoff (1s, 2s, 4s, 8s, 16s) up to 5 retries
Payload Enrichment
Webhook payloads are automatically enriched with context based on the trigger:
- User data — Name, email, profile fields
- Event data — Event title, date, location (for event triggers)
- Course data — Course title, completion status (for course triggers)
- Payment data — Amount, currency, transaction ID (for payment triggers)
Related
- Integrations Setup — Credential management overview
- Messaging Integrations — Discord, Twilio, Slack, and more
- Workflow Builder — Build automated workflows