Product data and warehouses
Connect Snowflake, BigQuery, Mixpanel, or PostHog and check the data configured for your workspace.
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. Review the configured resources, queries, and identifiers with the person responsible for your product data.
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.
Check the connection's configured queries and sync 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.
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. A numeric Cust company ID is also supported. 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. The metric must exist before its values are imported.
The downloaded query finishes with a plain outer SELECT, without a trailing semicolon. Keep that shape when adapting it: Cust adds its incremental date filter to the query.
4. Configure the sync with Cust
The connection wizard authorizes the warehouse. Query, mapping, identity, and schedule setup is configured for the connection with Cust. Send your data owner and Cust the setup handoff template, the adapted SQL, and two expected result rows.
For this recipe, use:
{
"resource_type": "metric_data",
"field_mapping": {
"company": "company",
"metric_slug": "metric_slug",
"value": "value",
"timestamp": "timestamp"
},
"id_fields": ["company", "metric_slug", "snapshot_date"],
"updated_at_field": "snapshot_date"
}The field mapping pairs Cust's field name on the left with the query's output column on the right. The three ID columns uniquely identify a company's metric reading on a date. Keep these IDs and timestamps stable when correcting values so the same reading is updated.
Agree on a schedule after your source data finishes loading. For example, a daily 06:00 to 07:00 window in a workspace using UTC fits this UTC-based query. The connection's Data synced panel shows either a sync frequency or a daily window with the workspace timezone. Align that timezone, the query's date boundaries, and your source loading schedule.
BigQuery metric syncs use a recent-history window for the initial load and the last sync date for incremental imports. Coordinate a backfill with Cust when you need older history or corrections to earlier snapshots. Returning historical rows from a query alone does not guarantee they pass the incremental filter.
5. Reconcile the first reading
After the configured resource shows a last-sync time:
- 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, use the same output columns, mapping, metric definition, and reconciliation steps with SQL adapted to your Snowflake tables and date functions. Agree on that query and its schedule with Cust before enabling it.
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.