Skip to main content

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.
When a response and a conversion share the same order ID or email, they merge into one attributed data point: “this €1,234 order came from ChatGPT.”

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:
Paste it before </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).
Each visitor is asked only once (stored in 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 (respondentExternalIdtransactionId) 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.
Whatever sends the conversion (Stripe, Shopify Pixel, webhook), always include the customer email when available — it is the most reliable merge key for leads that answer the survey before buying.

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 like j***@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:
You can find or regenerate the webhook token in the Attribution settings for the project. Treat the URL like a secret — the token authenticates every request. Send POST requests with Content-Type: application/json. Form-encoded and multipart form submissions are also accepted for form tools that cannot send raw JSON.
Successful webhook responses look like this:

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 as LeadSource, how_did_you_find_us, q3_howDid, or nested Typeform answers. Finseo can map these fields in Attribution workflows.
  1. Open Attribution.
  2. Go to Workflows.
  3. Send one test webhook from your source system.
  4. Open the created workflow.
  5. Map the incoming fields to attribution, email, name, deal value, currency, form ID, or rules.
  6. Save the mapping.
After mapping, future webhooks with the same structure are parsed automatically. When a payload cannot be parsed at all, Finseo creates the workflow for you and suggests a field mapping using AI — you only need to confirm it.
You can also use rules when a source field needs to be translated. For example, if 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.fields payloads.
  • Salesforce: JSON from Flow HTTP Callout, for example LeadSource, Email, Name, Amount, and CurrencyIsoCode.
  • Jotform: multipart/form-data with rawRequest or fields like q3_howDid, formID, and submissionID.
  • 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, and metadata.

Examples

Daily batch import

If you prefer a daily job, send up to 1000 responses at once with the bulk API.
See the Bulk Create Attributions API for the full reference.

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.
If you add an outbound webhook secret, Finseo signs the JSON body with an 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.
Requests over the limit receive 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 respondentExternalId such 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.