Product data and warehouses
Connect warehouses, S3 exports, Mixpanel, or PostHog and bring product data into Cust.
Product events, metrics, and customer attributes help Cust understand adoption alongside conversations and CRM data. Admins manage these connections in Settings → Integrations.
Connecting a source and defining what to import are separate steps. BigQuery, Snowflake, Redshift, and Amazon S3 use the data sync editor to preview rows, match records, choose fields or metrics, and set a schedule.
Snowflake
Choose Snowflake and follow the connection wizard. It asks for the Snowflake account and the warehouse, database, and schema to use, and provides setup SQL for the OAuth security integration. A Snowflake administrator should review and run that setup, then complete authorization in Cust.
Create a sync from the connection page and check its preview and last-run status. If the connection shows an approaching authorization expiry, reconnect before it expires to keep scheduled imports running.
BigQuery
Choose BigQuery and follow the service-account setup instructions shown in Cust. The wizard calls for BigQuery Job User and BigQuery Data Viewer permissions and a service-account JSON key.
Upload the JSON key in the connection form. Cust validates it before saving the connection. Give the service account access to the projects and datasets needed by your configured queries, and treat the key as a credential.
Amazon Redshift
Connect a provisioned cluster or Serverless workgroup through the Redshift Data API. The wizard guides you through a read-only database user, a Secrets Manager secret, and IAM access. See Amazon Redshift.
Amazon S3
Connect an S3 bucket through an IAM role, then create syncs for folders of CSV exports. Each sync reads new or changed .csv and .csv.gz files and maps them into Cust. See Amazon S3.
Recipe: weekly active seats from BigQuery
Give your CSMs a concrete adoption measure: how many customer users completed a meaningful workflow in the last seven days. This recipe produces one daily reading per company, including zero when an existing customer has no qualifying activity.
1. Agree on the definition and company identity
Here, an active seat is a distinct user who completed at least one workflow_completed event during the seven complete UTC days before the snapshot. Internal users are excluded. A snapshot at 2026-09-22T00:00:00Z covers September 15 through September 21.
The warehouse's company identifier must match the existing company's External ID in Cust. For an external ID of pfizer, the query emits extid-pfizer in its company column. The sync also accepts the bare External ID pfizer. Company names and website domains are not company identifiers for this import.
2. Create the metric in Cust
In Settings → Objects, open the company object and use Add metric:
| Setting | Value |
|---|---|
| Label | Weekly active seats |
| API name | weekly_active_seats |
| Format | Number |
| Grain | Daily |
| Change indicator | Choose the comparison your team needs, or Off for the initial check. |
The query already calculates a seven-day distinct-user count. Daily grain displays each supplied reading without summing overlapping seven-day windows. Add the metric to the company's metric layout so it appears on the account. See Metrics.
3. Prepare the query
Download the complete BigQuery query. Adapt its two source tables:
companies:external_idandis_customer.product_events:company_external_id,user_id,occurred_atas a BigQuery timestamp,event_name, andis_internal.
The query uses a left join so customers with no qualifying events produce 0. It returns the latest 31 daily snapshots with these columns:
| company | metric_slug | value | timestamp | snapshot_date |
|---|---|---|---|---|
extid-pfizer | weekly_active_seats | 176 | 2026-09-22T00:00:00Z | 2026-09-22 |
extid-cloudflare | weekly_active_seats | 48 | 2026-09-22T00:00:00Z | 2026-09-22 |
value is a count of seats, not a percentage. timestamp is the measurement boundary, not the time the sync ran. Use a timezone-aware timestamp consistently. Creating the metric first lets you set its display options before the first import. The sync can also create a missing metric from its slug.
The downloaded query returns the measurement date as snapshot_date. For this small rolling history, the recipe reads all returned rows each run, so corrections within the 31-day window are included.
4. Configure the sync
Open the connected BigQuery integration and click New sync. Enter a name such as Weekly active seats, choose Metric values, and set Metrics belong to to Companies.
Paste the adapted SQL and click Run preview. In Match, choose:
| Setting | Query column |
|---|---|
| Company External ID | company |
| Date | timestamp |
| Metric slug | metric_slug |
| Value | value |
These columns identify a company's metric reading at a timestamp. Keep the record, metric slug, and measurement timestamp stable when correcting a value.
In Schedule, select All rows and a daily schedule after the source has finished loading. A 06:00 to 07:00 daily window in an organization using UTC fits this UTC-based query. Daily windows use the organization's time zone.
Create the sync, turn Enabled on, and click Run now. After the first run, check that weekly_active_seats is linked in Metrics. A metric already supplied by another managed source is not linked automatically.
This query returns 31 daily snapshots, so it refreshes only that window. Extend the query's date range if you need an older backfill. For larger datasets, use Only new and changed rows with a source timestamp that advances when historical values are corrected. See Data syncs.
5. Reconcile the first reading
After the sync shows Succeeded:
- Run the query in BigQuery and locate the Pfizer row for
2026-09-22T00:00:00Z. - Open Pfizer in Cust and its Weekly active seats metric chart. Select a range containing that snapshot.
- Compare the exact timestamp and value:
176seats in the example above. Also check a zero-activity company. - If a reading is missing, check the company External ID, metric API name, field mapping, and query filter before widening the import.
For Snowflake or Redshift, use the same output columns, matching, metric definition, and reconciliation steps with SQL adapted to the warehouse's tables and date functions.
Mixpanel
Create a service account with the Consumer role in the Mixpanel project's settings. In Cust, choose Mixpanel, enter its Username and Secret, and connect.
The sync uses the event selection and profile settings configured for the connection:
- Selected product events sync on an hourly schedule. With no event whitelist configured, product-event import is off.
- User profiles sync hourly when profile sync is enabled.
- Configured JQL queries can provide aggregates on their own schedules.
Check these settings when a connection is healthy but an event or metric is missing. Contact Cust if the data selection you need is not editable on your connection page.
PostHog
Choose PostHog and enter the personal API key and project details requested by the form. Use the correct PostHog host for the project.
Cust imports the selected product events on an hourly schedule. Confirm the configured event selection and the identifiers used to match people to your contacts.
Verify the result
After the first successful sync, inspect a known company and contact:
- Check imported attributes and metrics.
- Check whether product activity is reflected in the contact's user status.
- Compare a known source record and timestamp with what Cust received.
Missing data can come from a query or event filter, source permissions, unmatched identifiers, or a failed sync. A connected status alone does not confirm that every event or table is being imported.
For file-based metric imports, see Data import. For programmatic imports, see the Partner API.