Most data-source integrations in Statisfy share the same configuration model. Whether you are syncing a Snowflake table, a PostHog HogQL query, or a Jira project, the self-serve settings page exposes the same building blocks: what to pull, how to match rows to accounts, and how often to run. This page explains those shared concepts once. Each per-integration guide then focuses on the specifics — credentials, dialect, and any integration-only knobs. Applies to: Salesforce, HubSpot, and Gainsight have related but separate settings flows — see their own pages for details.Documentation Index
Fetch the complete documentation index at: https://help.statisfy.com/llms.txt
Use this file to discover all available pages before exploring further.
Where to find the settings
Once an integration is connected, open Integrations → {integration} → Settings. The settings page is the single place to:- Add or edit queries / project rules
- Map result columns to Statisfy fields
- Pick how rows match to accounts
- Set a sync cadence
- Run a one-off sync on demand
- Review the active configuration version
Query types
For warehouse and PostHog integrations, every query you author has a type that tells Statisfy what to do with the result rows.| Query Type | What it writes | Typical use |
|---|---|---|
product_usage | Time-series metric values per account | MAU, API call counts, feature adoption |
custom_field | Account- or person-level attribute values | Health score, segment, plan tier, industry |
custom_object | Records of a custom object type | Subscriptions, deployments, contracts |
A single integration can have many queries / rules — for example, one
product_usage query for daily logins and another custom_field query for weekly health scores, each running on its own cadence.Account resolvers
Every row that comes out of a query has to be matched to a Statisfy account before it can be stored. The account resolver is the rule that tells Statisfy which column on the row identifies the account, and what kind of value it contains.| Resolver | What the column should contain |
|---|---|
| Statisfy Account ID | The native Statisfy account ID |
| CRM Account ID | The Salesforce or HubSpot account ID for the account |
| Organization ID | An external org identifier you’ve stored on the account |
| Email Domain | A company website domain (e.g., acme.com) — matched against accounts’ domain field |
| Account Name | The company name — uses fuzzy matching, with a tunable cutoff |
| Custom Field | The value of any custom field defined on accounts |
Fuzzy matching cutoff
The Account Name resolver does approximate matching to absorb small typos, casing, and “Inc.” vs. “Inc” differences. The cutoff (0.0–1.0) controls how strict the match has to be. The default suits most cases; raise it if you see false positives, lower it if legitimate matches are being missed.Person resolvers (warehouse and PostHog only)
Forcustom_field queries that target people (contacts) instead of accounts, pick an email column. Optionally also map first name, last name, or a single full-name column — Statisfy will use these to upsert the person record. Internal vs. external is decided by comparing the email domain against your tenant domain.
Column transformers
Sometimes a column has the right value embedded in something else — a CRM ID with aorg_ prefix, an email field with extra whitespace, a hostname when you want just the domain. Column transformers let you reshape a column before it’s used.
Available transforms:
| Transform | What it does |
|---|---|
strip_prefix | Removes a fixed prefix (e.g., strip org_ from org_12345) |
split_first_token | Splits on a delimiter and keeps the first token (e.g., extract the local part of an email) |
regex_extract | Pulls a capture group out of the column with a regex |
lookup | Replaces values via a static {from: to} mapping |
skip_if_equals | Drops the row if the column equals a given value |
skip_if_contains | Drops the row if the column contains a given substring |
Field and metric mappings
A query’s columns become useful only when they are mapped to Statisfy fields.- For
custom_fieldqueries, pick a Statisfy custom field for each value column. The field must exist on the target entity (account or people); create it in Object Manager first if needed. - For
product_usagequeries, pick the metric (product dimension) the value belongs to, and the timestamp column that places it in time. Create new product dimensions in Object Manager. - For
custom_objectqueries, map each attribute on the custom object record.
Schedule
Each query and each Jira rule can run on its own cadence. The available cadences:HOURLY · TWO_HOURS · FOUR_HOURS · SIX_HOURS · TWELVE_HOURS · DAILY · WEEKLY · MONTHLY
If a query doesn’t set its own cadence, it inherits the integration default (typically WEEKLY).
For warehouse product_usage queries that aggregate by week, the Week Start Day at the integration level decides which day of the week the snapshot is anchored to (0 = Monday, 6 = Sunday).
Date placeholders (warehouse only)
Warehouse queries can reference the active sync window via placeholders:{START_DATE}— the start of the current window, asYYYY-MM-DD{END_DATE}— the end of the current window, asYYYY-MM-DD{END_DATE_SQL}— the end as a SQL-quoted literal, ready to drop into aWHEREclause
WEEKLY, the previous Monday through Sunday; for MONTHLY, the first to last day of the previous month; for DAILY, the previous day. Use these to keep queries incremental.
Preview and validation
Before saving a query, use the Preview button to run it against your data source and inspect a sample of rows. The preview is also the validation step:- For SQL warehouses, syntax is checked against the warehouse’s dialect (Postgres, Redshift, BigQuery Standard SQL, Snowflake) before execution. Dialect-specific functions that aren’t supported are flagged at save time.
- For PostHog, HogQL has no static schema browser, so preview-by-execution is the only way to validate.
- For Jira, validation happens against the JIRA REST API at save — invalid project keys, unknown field IDs, or unsupported issue type filters surface immediately.
Configuration history
Every save creates a new configuration version. The settings page header shows where the active config came from:| Badge | Meaning |
|---|---|
Database (v3) | Most recent saved version is the active config |
Default (Code) | No self-serve config has ever been saved; Statisfy is using a built-in fallback set up by support |
Not Configured | Neither a saved version nor a code fallback exists — the integration is connected but idle |
Running a sync on demand
Each integration’s settings page has a Run Sync Job button that enqueues an immediate sync without waiting for the next scheduled run. The most recent job’s status (queued / running / completed / failed) and timestamps are shown on the same page.Non-CRM integrations (warehouse, Jira, PostHog, Gainsight) only start syncing after at least one successful CRM sync. Statisfy uses your CRM as the source of truth for which accounts exist, so non-CRM rows have nothing to resolve to until the CRM is loaded.
Bootstrap vs. periodic
When you first connect a data source, Statisfy runs a bootstrap sync covering the last 30 days of data. After that, scheduled periodic syncs run on the cadence you’ve configured, pulling only the active window each time. Both kinds of jobs show up in the job history on the settings page.What you can’t do (yet) from the UI
- Rollback to an older version — supported via the database but not yet wired into the UI. Ask support.
- Bulk-edit queries across integrations — each integration has its own settings page.
- Pause an integration globally — you can mark individual queries / rules as inactive (
is_active = false), but there is no single off-switch beyond disconnecting.
Troubleshooting checklist
Rows are not landing in Statisfy
Rows are not landing in Statisfy
- Confirm the account resolver is using a column whose values exist in Statisfy — for CRM ID resolvers, the matching accounts must already be synced from your CRM.
- Run the Preview and verify the resolver column actually contains the expected values for those rows (no nulls, no stray prefixes).
- Check whether column transformers are inadvertently filtering rows (
skip_if_*transforms). - For
product_usage, confirm the metric (product dimension) exists in Object Manager. - Look at the latest job status — a failed job will show the error.
Some rows match but most don't
Some rows match but most don't
- Try a different resolver. CRM ID and Statisfy Account ID are the most exact; Email Domain and Account Name are best-effort.
- For Account Name, raise or lower the fuzzy cutoff depending on whether you’re seeing false matches or missing matches.
- For Custom Field resolvers, make sure the field is populated on the target accounts — empty values can’t be matched.
The query is too slow or times out
The query is too slow or times out
- Tighten the date range using
{START_DATE}/{END_DATE_SQL}. - Drop the cadence to
DAILYso each run covers a smaller window. - For warehouses, push filters into the query rather than relying on Statisfy to discard rows post-hoc.
A saved configuration isn't taking effect
A saved configuration isn't taking effect
- Confirm the version badge in the header shows
Database (vN)and notDefault (Code)— if it still says Default, your save didn’t land. - Check that the query is marked active — inactive queries are kept for reference but don’t run.
- Trigger a manual sync with Run Sync Job and watch the job history.