Attentive
Use the Attentive connector to sync segment definitions, product catalog upload status, and account metadata into your Athena lakehouse. This is a Blotout custom connector built on the Airbyte Connector Builder (declarative manifest).
Prerequisites
Section titled “Prerequisites”- A tag with Blotout Cloud set up (green checkmark in the Tags table)
- An Attentive API key — generated under Custom Apps in the Attentive UI (not Settings → API Keys). A new custom app starts with every API set to “No Access” — grant scopes explicitly.
- The following scopes granted on the Custom App:
| Stream | Scope Required | Notes |
|---|---|---|
segments | segments:write | segments:read is Open Beta and may not appear in the UI. segments:write is GA and satisfies the read endpoint. |
product_catalog_uploads | product_catalogs:read | |
account | None | Works with just the key itself. |
Create the pipeline
Section titled “Create the pipeline”Follow the shared Create a pipeline steps until the source catalogue appears, then select Attentive.
Source configuration
Section titled “Source configuration”On the Source step, configure the connector:
| Field | Purpose |
|---|---|
| Schedule Type | How the pipeline runs — typically Scheduled |
| Sync Frequency | How often Airbyte syncs (for example, Every 24 hours) |
| Source Name | Name for this pipeline — used in the Athena schema <SOURCE_NAME>_<ENV> |
Authentication (API Key — Bearer)
Section titled “Authentication (API Key — Bearer)”Every request carries Authorization: Bearer <api key>. The key is long-lived with no refresh step.
- Under Attentive Configuration, paste your API Key into the API Key field.
Configuration fields
Section titled “Configuration fields”| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| api_key | secret string | Yes | — | Attentive API key, sent as Authorization: Bearer <key>. Generated under Custom Apps in the Attentive UI. |
| start_date | string | Yes | — | Earliest segment modification date to pull (YYYY-MM-DD), sent as updatedSince. Applies to segments server-side and to product_catalog_uploads client-side. |
| page_size | integer | No | 1000 | Page size for the segments stream (limit param). API max is 1000; Attentive’s own default is only 20. |
| lookback_hours | integer | No | 24 | Hours to rewind before the stored cursor on each incremental sync (range 0–168). |
| base_url | string | No | https://api.attentivemobile.com | Override only if Attentive provides a dedicated host. v1 and v2 paths both hang off this host. |
Supported sync modes
Section titled “Supported sync modes”- Incremental Sync — Append (
segments,product_catalog_uploads) - Full Refresh (
account)
Supported streams
Section titled “Supported streams”| Stream | Endpoint | Cursor | Paginated | Sync Mode |
|---|---|---|---|---|
segments | GET /v2/segments | updated (server-side) | Yes (cursor/hasMore) | Incremental |
product_catalog_uploads | GET /v1/product-catalog/uploads | lastUpdated (client-side) | No | Incremental |
account | GET /v2/me | None | No | Full Refresh |
segments
Section titled “segments”Segment definitions — externalId, name, description, created, updated. This is NOT membership data. Attentive publishes no endpoint listing a segment’s subscribers. If you need membership, derive it from subscription events in the SFTP feed.
| Field | Type | Notes |
|---|---|---|
externalId | string | Primary key — segment ID used by every Attentive surface |
name | string | Segment name |
description | string | |
created | string | ISO-8601 |
updated | string | ISO-8601 — cursor field |
product_catalog_uploads
Section titled “product_catalog_uploads”Operational monitoring for the nightly catalog push. The endpoint only keeps recent uploads.
| Field | Type | Notes |
|---|---|---|
uploadId | string | Primary key |
status | string | initialized → validating → validated → completed |
productsReceived | integer | |
productsProcessed | integer | |
lastUpdated | string | ISO-8601 — cursor field |
expires | string | ISO-8601 |
uploadUrl | string | |
validateOnly | boolean | |
errors | array<object> | errorType, errorMessage, lineNum |
account
Section titled “account”One row identifying the company behind the key. Also the check stream.
| Field | Type | Notes |
|---|---|---|
companyId | string | Primary key — joins to company_id in the SFTP feed tables |
companyName | string | |
attentiveDomainName | string | The {attn_domain} in SFTP feed filenames |
applicationName | string | |
contactEmail | string |
The other half: SFTP data feeds
Section titled “The other half: SFTP data feeds”Message performance, subscriber events, and attributed revenue live in Attentive’s nightly SFTP data feeds. No custom connector is needed — Airbyte ships an SFTP Bulk source.
| Setting | Value |
|---|---|
| Host | sftp.client.attentivemobile.com (port 22) |
| Auth | Password — username from the SFTP account-creation email |
| Folder | /downloads |
| Glob (events) | **/*_attentive_email_SMS_*.csv |
| Glob (conversions) | **/*_attentive_conversions_*.csv |
| Cadence | Nightly, available by 10:00 UTC |
General Events feed (60 columns)
Section titled “General Events feed (60 columns)”One row per event. The type column discriminates 24 distinct event types including subscription, impression, click, message, email delivery, commerce, and user property events.
Conversions feed (17 columns)
Section titled “Conversions feed (17 columns)”Conversions attributed to Attentive messages: phone, email, external_id, client_id, amount, uuid, timestamp, message_id, message_name, order_id, product_skus, coupon, quantity. This is what joins Attentive attribution to Shopify/commerce revenue.
Downstream notes
Section titled “Downstream notes”- Schema:
attentive_<client>_prod.* account.attentiveDomainNameis the{attn_domain}that prefixes SFTP feed filenames;account.companyIdjoins these rows to the feed tables- Deduplication for incremental streams:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY externalId ORDER BY _airbyte_extracted_at DESC ) AS rn FROM attentive_<client>_prod.segments) WHERE rn = 1Changelog
Section titled “Changelog”| Version | Date | Description |
|---|---|---|
| 1.1.0 | 2026-09 | Removed webhooks stream — GET /v1/webhooks returns 403 with API keys and the webhooks:write scope is not grantable in the Custom App UI. A 403ing stream fails the entire sync. Streams are now: segments, product_catalog_uploads, account. |
| 1.0.0 | 2026-08 | Initial release with 4 streams: segments, webhooks, product_catalog_uploads, account |
Complete Schema and Summary
Section titled “Complete Schema and Summary”Continue through the Schema and Summary steps to choose streams and confirm the connection. Save and run the first sync.
After a successful sync, Airflow creates an organization-scoped DAG for the pipeline, and dbt models feed downstream analytics.
Related documentation
Section titled “Related documentation”- Data Pipelines overview — Tags-first create flow