Attribution
Attribution connects your AI visibility data to real leads and revenue. Instead of only seeing whether your brand appears in AI answers, you can see whether customers actually say they found you through ChatGPT, Perplexity, Claude, Google, ads, referrals, or other channels — and how much revenue each channel drives. Finseo attribution works with two kinds of data that are merged automatically:- Responses — a customer’s answer to “How did you hear about us?”, from the Finseo survey popup, your own forms, a survey tool, or your CRM.
- Conversions — purchases and leads with a transaction ID and value, from your existing tracking (Google/Meta), Stripe, your shop system, or a webhook.
Guided setup
The fastest way to set up attribution is the built-in wizard: open Attribution in your dashboard and click Set up attribution. It asks what you want to track (purchases, leads, or both), which system you run, and whether you already have tracking or a post-purchase survey — then it recommends exactly one install path with copy-paste snippets and verifies live that the first event arrives. The recommended paths, depending on your setup:Finseo Snippet
One script tag. Survey popup plus automatic purchase capture from your existing Google/Meta tracking.
Stripe
One Stripe webhook event. Amounts, trials, and renewals are classified automatically.
Shopify
A Custom Pixel that reports every completed checkout — theme scripts can’t run on Shopify’s checkout, the pixel can.
WooCommerce
A native order webhook, including WooCommerce’s built-in Order Attribution origin.
Shopware
A Flow Builder webhook on “Order placed”.
Webhook / CRM
HubSpot, Pipedrive, Calendly, form tools, or your own backend.
The Finseo Snippet
The snippet is a single script tag served per project:</head> on every page (or add it via Google Tag Manager as a Custom HTML tag). It does three things:
1. Captures answers from your existing forms
If your forms already ask “How did you hear about us?” (also detected in German: “Wie bist du auf uns aufmerksam geworden?”), the snippet captures that answer on submit — the popup then never shows. Emails and names from the same form are attached as merge keys so the answer can later be linked to a deal or order.2. Shows the survey popup
If no form on the page asks the question, the snippet shows a small popup with your configured question and answer options. You control everything in Attribution → Survey settings:- Question and channels — default channels include AI Search, Google/Bing, Social Media, Online Ads, Referral, Content, and Other (with free text). You can also use detailed AI channels (ChatGPT, Perplexity, Claude, Gemini, Copilot).
- Trigger — on page load, after form submit, after a detected purchase, or manual via JavaScript.
- Style — accent color, position, corner radius, font (system or inherit from your site), and optional answer shuffling to avoid position bias (“Other” always stays last).
localStorage).
3. Piggybacks on your existing conversion tracking
If Google Analytics / Google Ads (dataLayer / gtag) or the Meta Pixel (fbq) is installed, the snippet passively listens for conversion events and reports them to Finseo — no duplicate tracking setup:
The snippet reads transaction ID, value, currency, and items from the event, deduplicates per transaction ID (thank-you-page reloads are not counted twice), and also scans events that fired before it loaded. Visitor-facing behavior is never altered.
JavaScript API
For manual control, the snippet exposes a small API:How responses and conversions merge
Conversions and survey answers usually arrive separately — a customer answers the popup while browsing, and the order comes in later via Stripe or your shop webhook. Finseo merges them automatically:- Merge keys: transaction ID (
respondentExternalId↔transactionId) or email. A transaction-ID match always wins over an email match. - Windows: a new conversion looks back 90 days for a survey answer (SaaS trials often convert weeks after signup). A new survey answer only looks back 48 hours for an unmatched conversion, so a fresh answer is never linked to an old, unrelated order.
- Deal values: if the answer has no deal value, the merged conversion’s amount fills it in — revenue is never counted twice.
- Conversion types: Stripe checkouts with a $0 total are stored as trials, recurring invoices as renewals. Only regular purchases count as new customers awaiting attribution.
- Unattributed revenue: conversions that never got a survey answer are shown as their own KPI, so you always see how much revenue is still unexplained.
Privacy by default
Customer emails are SHA-256-hashed at ingestion. Finseo never stores plaintext addresses — only the hash (used to merge orders with survey answers) and a masked preview likej***@company.com for the dashboard.
Import answers from survey tools
Already running a post-purchase survey? Keep it — Finseo imports its answers instead of showing a second popup:Fairing
Via Shopify Flow
KnoCommerce
Via native webhook
Zigpoll
Via native webhook
SurveyMonkey
Via Zapier/Make
Typeform
Native support
Tally
Native support
Send data with a webhook
Your project webhook endpoint has this shape:POST requests with Content-Type: application/json. Form-encoded and multipart form submissions are also accepted for form tools that cannot send raw JSON.
Order-only payloads become conversions
If a payload carries order data (transaction ID + amount) but no attribution answer — a Stripe event, a WooCommerce order, or a custom order webhook — Finseo stores it as a conversion instead of rejecting it. The response then looks like this:matched: true means the conversion was immediately merged with an earlier survey answer.
Field reference
Finseo normalizes channel text into categories. For example, answers containing
chatgpt, openai, claude, perplexity, gemini, copilot, or ai search are categorized as ai_search.
Map incoming fields
Many tools send payloads with their own names, such asLeadSource, how_did_you_find_us, q3_howDid, or nested Typeform answers. Finseo can map these fields in Attribution workflows.
- Open Attribution.
- Go to Workflows.
- Send one test webhook from your source system.
- Open the created workflow.
- Map the incoming fields to attribution, email, name, deal value, currency, form ID, or rules.
- Save the mapping.
utm_source contains chatgpt, map it to AI Search.
Supported source formats
Finseo auto-detects several common sources:- HubSpot: legacy contact webhook payloads with
properties, or custom JSON bodies from Operations Hub. - Typeform:
form_response.answers, including choice, choices, text, and email fields. - Tally:
data.fieldspayloads. - Salesforce: JSON from Flow HTTP Callout, for example
LeadSource,Email,Name,Amount, andCurrencyIsoCode. - Jotform: multipart/form-data with
rawRequestor fields likeq3_howDid,formID, andsubmissionID. - Stripe: event payloads (
checkout.session.completed,invoice.paid, …) — stored as conversions with automatic cent conversion and trial/renewal classification. - WooCommerce: order webhooks, including Order Attribution meta as the marketing origin.
- Shopware: Flow Builder order payloads with
orderNumber,amountTotal, and customer email. - Raw JSON: direct payloads with fields like
channelId,respondentEmail,dealValue, andmetadata.
Examples
Daily batch import
If you prefer a daily job, send up to1000 responses at once with the bulk API.
Receive attribution events
You can configure an outbound webhook URL in Attribution settings. Finseo sends an event to your URL whenever a new response is saved.X-FinSEO-Signature header using HMAC-SHA256.
Rate limits
- Webhook endpoint: 120 requests per minute per project.
- Snippet collect endpoint: 60 requests per minute per visitor IP.
429 and can safely be retried after a minute.
Troubleshooting
Every incoming webhook request is logged with its parse result in Attribution → Webhook logs — including rejected requests. The statuses:Best practices
- Add the attribution question close to conversion, such as signup, demo request, checkout, or lead qualification.
- Keep answer options stable across countries. Translate labels for users if needed, but keep webhook values consistent.
- Send the original paid currency in
dealCurrency; Finseo can still aggregate and map values. - Include a stable
respondentExternalIdsuch as order ID, CRM lead ID, contact ID, or deal ID. - Put product, SKU, market, campaign, and other business context in
metadata. - Send one event per lead, order, or deal. Avoid sending every page view as attribution.