Documentation · Attribution · Post-Purchase Surveys

Post-purchase surveys: the ground-truth attribution layer pixels can't see

Ask "Where did you FIRST hear about us?" on the thank-you page and capture word of mouth, podcasts, friends-and-family, organic creator content — everything click-tracking misses. Free on every Admaxxer plan; Fairing and KNO charge $99-$499/mo.

What is PPS? Why pixels can't see vs Fairing Default survey FAQ

What is post-purchase survey attribution?

A post-purchase survey (PPS) is a one-question modal shown to customers right after they buy. The canonical question — "Where did you FIRST hear about us?" — captures self-reported attribution at the highest-intent moment in the funnel. Industry benchmark is a 30-40% response rate, which makes PPS one of the highest-signal data layers in DTC.

The structural value: PPS surfaces channels that pixels cannot see. Word of mouth doesn't have a UTM. Podcasts referenced verbally don't generate clicks. Print ads and billboards never enter the click-stream. PPS is the only attribution layer that captures these non-clickable touchpoints — and they're often the largest single channel in a mature brand's PPS distribution.

Why pixels can't see what PPS can

Pixel blind spots: word of mouth (no click, no UTM); podcast mentions (verbal, off-platform); TV and print (never in click-stream); friends-and-family direct sharing (direct/none in pixel); iOS 14.5+ ATT-blocked impressions (modeled, not deterministic).

PPS captures all of them: "Friend or family", "Podcast", "Saw on social media (not paid)", "Influencer / blog", and "Other" with free-text are all in the default option set. When pixel direct/none is high but PPS word-of-mouth is also high, your attribution is healthy. When pixel direct is high but PPS word-of-mouth is LOW, you have a UTM hygiene problem (paid traffic landing as direct). The Reconciliation Panel surfaces this gap explicitly.

vs Fairing / KNO / TripleWhale Sonar

PPS is a category old DTC tools have refined over years. The gold standard is Fairing (formerly EnquireLabs); KNO Commerce extends to NPS + product feedback; TripleWhale's Sonar bundles a limited PPS in the TW dashboard. Admaxxer ships the attribution-focused PPS surface natively, free on every plan.

ToolPriceNotes
Admaxxer Free on every plan Native PPS shipped with the Custom Pixel snippet. Default question + 10 default options match Fairing's catalog. Per-shop survey customization in /settings/surveys. Aggregates render in /marketing-acquisition with response-rate chip + per-channel bar chart.
Fairing (formerly EnquireLabs) $99-$499/mo The OG PPS tool. Strong question library, 30%+ response rates documented. No native attribution-layer reconciliation; exports to TripleWhale + GA4.
KNO Commerce $199-$799/mo PPS + zero-party data layer. Adds NPS + product-feedback questions. Higher price for the broader scope.
TripleWhale Sonar (PPS module) Bundled with TW seat ($129+/mo) TW's bundled PPS — limited to TW's question template, no per-shop customization. Locked into the TW dashboard surface.
Datafast Not offered Datafast is a UTM-only attribution tool; no PPS surface.

Pricing math: at Fairing's $99/mo entry tier you spend $3,564 over 3 years; at the $499/mo tier you spend $17,964. Admaxxer ships the same attribution-focused PPS layer free on every plan.

The default Admaxxer survey

Default question: Where did you FIRST hear about us?

Default options (in render order):

Customize per-shop in /settings/surveys. ids must be lowercase snake_case (validated by the Tinybird LowCardinality column); up to 30 options total per survey.

How to install + customize — 4 steps

  1. Step 1. Open /settings/surveys and enable the default survey. Toggle the survey on for the website you want to ask. Customize question copy and options as needed; ids are validated as lowercase snake_case to keep Tinybird's LowCardinality column tidy.
  2. Step 2. Make sure your Custom Pixel snippet is fresh. Old snippets predate the survey hooks — paste a fresh snippet from /integrations/shopify if you installed before 2026-05.
  3. Step 3. Watch the response rate climb. Industry benchmark is 30-40%. Monitor SurveyResponsesCard on /marketing-acquisition for total responses + response rate.
  4. Step 4. Reconcile against pixel attribution. Compare per-channel response distribution against pixel attribution (last-click / time-decay / Markov). The gap surfaces UTM hygiene problems and channels pixels can't see.

Curl example

The PPS surface is a regular REST resource: POST to /api/v1/surveys to create a survey, GET /api/v1/surveys/:id/aggregate to read the per-channel response distribution. Same endpoints the Admaxxer UI calls. No SDK required — copy, paste, swap $TOKEN.

# 1) Create a survey on the canonical thank-you-page question.
# Replace $TOKEN with a workspace API key from /settings/api.
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  "https://admaxxer.com/api/v1/surveys" \
  -d '{
    "websiteId": "admx_yourshop_123",
    "question": "Where did you FIRST hear about us?",
    "options": [
      { "id": "friend_or_family",     "label": "Friend or family",        "emoji": "wave" },
      { "id": "social_paid",          "label": "Saw a social media ad",   "emoji": "phone" },
      { "id": "social_organic",       "label": "Social (not paid)",       "emoji": "speech" },
      { "id": "podcast",              "label": "Podcast",                 "emoji": "mic" },
      { "id": "search",               "label": "Google / search engine",  "emoji": "search" },
      { "id": "influencer_blog",      "label": "Influencer / blog",       "emoji": "sparkle" },
      { "id": "other",                "label": "Other (tell us more)",    "emoji": "bulb" }
    ],
    "enabled": true
  }'

# 2) Read aggregate responses for the survey created above.
curl -H "Authorization: Bearer $TOKEN" \
  "https://admaxxer.com/api/v1/surveys/srv_abc123/aggregate?since=2026-04-01&until=2026-04-30" \
  | jq

# Sample response (truncated):
# {
#   "survey_id": "srv_abc123",
#   "responses_total": 412,
#   "orders_in_window": 938,
#   "response_rate": 0.439,
#   "by_option": [
#     { "option_id": "friend_or_family",   "responses": 158, "share": 0.384, "attributed_revenue": 12480 },
#     { "option_id": "social_paid",         "responses": 102, "share": 0.247, "attributed_revenue":  8240 },
#     { "option_id": "podcast",             "responses":  64, "share": 0.155, "attributed_revenue":  5120 }
#   ]
# }

FAQ

What's the goal of a post-purchase survey?
PPS surfaces self-reported attribution — where customers SAY they first heard about you. This is ground-truth signal for channels that pixels structurally can't see: word of mouth, podcasts, friends-and-family, organic creator content, billboards, TV, print. It's the only attribution layer that captures non-clickable touchpoints.
Is PPS a replacement for pixel attribution?
No - it's a complement. Pixel attribution (last-click / time-decay / Markov) is mathematical, deterministic, and grounded in click-stream data. PPS is self-reported, has confirmation/recency bias, and depends on response rate. Used together, they triangulate.
What response rate should I expect?
Industry benchmark for thank-you-page PPS is 30-40%. Below 15% indicates a config problem (modal firing on the wrong page, question too broad, mobile rendering issue). Above 50% is exceptional and usually means a small repeat-customer base.
How is the data joined to revenue?
Each response carries an optional customerEmailHash (sha256 of the order email, truncated to 16 hex chars) and an optional shopOrderId. These let the aggregate endpoint join PPS responses to visitor_payments / orders for revenue-by-self-reported-channel.
Does PPS data flow into the AI agent?
Yes. The Claude AI agent's query_metrics tool can scope to the survey aggregate via the same /api/v1/surveys/:id/aggregate endpoint the UI uses.
Can I customize the question and options per shop?
Yes — /settings/surveys. The question is capped at 500 chars; options are capped at 30 entries with ids in lowercase snake_case. The 10 default options match Fairing's catalog so merchants migrating get familiar buckets.
What's the privacy story?
Same as the rest of the Admaxxer pixel. Email hashing happens client-side before the response leaves the browser; the raw email never hits Admaxxer servers. When the visitor has opted out via the consent API, the modal doesn't render at all.
Does the survey work on Shopify Plus / non-Shopify storefronts?
Yes for Shopify (any tier) — the Custom Pixel snippet handles thank-you-page detection. For non-Shopify, manually fire admaxxer.showSurvey() from your thank-you page.
What vendor-specific response rate benchmarks should I plan against?
Fairing publishes thank-you-page response rates of 40-60% for active DTC merchants (their 'Strong' tier). KNO Commerce publishes ~45% across their book of business. Admaxxer ships the same default question pattern ('Where did you FIRST hear about us?') with 10 default options matched to Fairing's catalog, on the same thank-you-page surface, so plan for similar response-rate territory — 40-50% in the first month is realistic, climbing toward 50-60% as you tune the question copy and option set to your brand voice. If you're seeing under 25% after a week, something is wrong with the modal placement or trigger (most common cause: the Custom Pixel snippet is from before 2026-05 and predates the survey hooks — repaste from /integrations/shopify). The SurveyResponsesCard on /marketing-acquisition surfaces the live response-rate chip so you can compare your shop against these benchmarks in real time.