Field Mapping & Sync Retries
Brevo, webhooks, Google Sheets, HubSpot, Mailchimp, Notion, and Airtable share one field-mapping system: each destination field is mapped from a source on the quiz side, optionally transformed, and validated before every sync attempt. Slack is not field-mappable — it sends a fixed formatted message instead.
Last updated
How does field mapping work across FluoTest integrations?
Each destination field is mapped from a standard quiz field, a specific question, or a computed value, with an optional transform, condition, and fallback. The destination's schema is read live from the connected account. Failed sync attempts are logged and retried automatically with backoff before being marked dead.
Field-mappable providers
The following providers support field mapping. Each reads its destination schema live from the connected account or resource; a webhook has no schema to fetch, so its target keys are free-form.
| Provider | Destination schema source |
|---|---|
| Brevo | Contact attributes on the connected Brevo account. |
| Webhook | None — target keys are free-form. |
| Google Sheets | The header row of the selected sheet. |
| HubSpot | Contact properties on the connected HubSpot account. |
| Mailchimp | Merge fields on the selected audience. |
| Notion | Properties on the selected database. |
| Airtable | Fields on the selected table. |
Source fields
Every quiz exposes the same set of standard source fields, plus one field per question.
| Field | Description |
|---|---|
| Respondent's email address. | |
| name | Full name. |
| first_name | First name. |
| last_name | Last name. |
| company | Company name, if collected. |
| score | Total score. |
| max_score | Maximum possible score. |
| score_percent | Score as a percentage. |
| tier | Label of the matched score tier. |
| outcome | Key of the matched primary outcome (Pro outcome engine). |
| tags | The tier label, as a single-item list — used as the tags target on providers that support tagging. |
| submitted_at | Submission timestamp. |
| quiz_name | Name of the quiz. |
| country | Not currently captured; always empty. |
Each question on the quiz is also available as a source field, labeled with its question text.
Transform types
A mapping can apply one of the following transforms to the resolved source value before it's sent.
| Type | Description |
|---|---|
| none | Send the source value unchanged. |
| lowercase | Lowercase a string value. |
| uppercase | Uppercase a string value. |
| concat | Join multiple fields and/or literal text with a separator. |
| json_path | Read a nested value out of the submission's answers or scores object by dot-path. |
| constant | Always send a fixed value, ignoring any source field. |
| computed | Derive a value FluoTest calculates: full_name, score_fraction (e.g. "8/10"), or score_percent. |
| custom | A template string with {field_key} placeholders substituted from source fields. |
Conditional mapping
A mapping can carry one condition: it only applies when a comparison against a source field (equals, not equals, greater than, less than, or contains) evaluates true. This lets a single destination field be populated differently — or not at all — depending on quiz answers or score.
Fallback values
If a mapping's resolved value is empty, its fallback value (if set) is used instead. A mapping with a fallback and no source field always sends that fallback.
Required fields and validation
A destination field the schema marks as required must resolve to a non-empty value from some mapping — a source, a constant, or a fallback — or the sync fails validation before it's attempted. Validation failures are not retried automatically, since retrying without changing the mapping produces the same result; the mapping needs to be corrected.
Delivery, retries, and failures
Every sync attempt — whether it succeeds, fails, or is retried — is logged. A failed attempt (other than a validation failure) is queued for retry with backoff.
| Status | Meaning |
|---|---|
| success | Delivered without error. |
| failed | The most recent attempt failed; may still be retried. |
| retrying | Queued for another attempt at a scheduled time. |
| dead | All retry attempts are exhausted, or the failure was a validation error — no further automatic attempts. |
Retries are scheduled 1 minute, 5 minutes, and 30 minutes after each failed attempt (up to 3 retries beyond the first attempt, 4 attempts total). A background job checks for due retries every minute. A queued or dead-lettered sync can also be retried manually from the quiz's Integrations dashboard.
Frequently asked questions
Which integrations support field mapping?
Brevo, webhooks, Google Sheets, HubSpot, Mailchimp, Notion, and Airtable. Slack sends a fixed formatted message instead and doesn't use field mapping.
Where does the list of destination fields come from?
It's read live from the connected account or resource — for example HubSpot's contact properties, or a Google Sheet's header row — rather than a fixed list, so it reflects custom fields.
What happens if a required destination field has no mapping?
The sync fails validation and is not attempted or retried. Mapping a source field, a constant, or a fallback value to the required field resolves it.
How many times does FluoTest retry a failed sync?
Up to 3 additional attempts after the first, at 1, 5, and 30-minute delays. After that, or immediately for a validation failure, the sync is marked dead and can be retried manually.