> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gocrux.io/llms.txt
> Use this file to discover all available pages before exploring further.

# How Attribution Works

> How Crux attribution works: the deterministic six-source waterfall, first-click versus last-click, and the modelled survey-based channel re-attribution layer.

Crux attribution works as a **waterfall**: for each order, we check multiple data sources in sequence. If the first source returns a clear attribution (not Direct or Unknown), we use it. If not, we move to the next source. This layered approach recovers orders that any single tracking method would miss.

## Two layers of attribution

There is no single "correct" attribution model. What matters is matching the right method to the decision you are making. Crux runs two complementary layers, each answering a different question.

<CardGroup cols={2}>
  <Card title="Deterministic (campaign level)" icon="crosshairs">
    Per-order attribution, traced back to a real touchpoint by the waterfall below. Because every order is traceable to a source, campaign or creative, this is the layer you use for **within-channel optimisation**: improving paid social, comparing influencer codes, or cutting CAC on a specific channel.
  </Card>

  <Card title="Modelled (channel level)" icon="chart-mixed">
    A modelled layer on top of the waterfall that redistributes residual, non-actionable traffic across your real acquisition channels using post-purchase survey data. Because it is modelled rather than traced to a single order, this is the layer you use for **cross-channel strategy and budget decisions**: how channels compare, and where the next pound should go.
  </Card>
</CardGroup>

The rest of this page walks through the deterministic waterfall first, then the modelled re-attribution layer that sits on top.

## The six layers

<Steps>
  <Step title="GA4 raw event data">
    We sync your raw GA4 event data straight into BigQuery. This bypasses the sampling, unnattributed & data processing issues you see within the GA user interface. GA4 tracks events (page views, clicks, add to carts, purchases etc), landing pages and UTM parameters across your site. When a customer purchases, we match their session history to the Shopify order.

    This captures paid search, Meta ads, email clicks, and any UTM-tagged traffic. We look at the users first ever event on the website (that is not Direct or Unknown) for the attribution source. We also don't bound this by time, meaning if you have a long purchase cycle (60+ days) we cater for that unlike GA standard reporting.

    This first event (click) model using raw ga4 data typically accounts for 60 - 70% of your order attribution.
  </Step>

  <Step title="Discount codes">
    Discount codes are mapped to channels, campaigns and ad groups via your [configuration sheet](/attribution/channel-mapping). When a customer searches for your brand after seeing an influencer post, or being referred by a friend. We use the discount code at checkout to correctly attributes the order, even though GA4 saw it as direct or brand traffic.

    This is particularly valuable for influencer, referral program, direct mail, offline (out of home, tv), partnership and affiliate channels where customers often navigate directly rather than clicking a tracked link.
  </Step>

  <Step title="Shopify customer journey">
    Shopify independently tracks the last non-direct touchpoint before purchase. This is used as a fallback when GA4 and discount codes both return Direct or Unknown.

    Shopify's journey data captures social media referrals, search engine visits and other touchpoints that GA4 may have missed due to tracking blockers or cookie restrictions.
  </Step>

  <Step title="Klaviyo email and flows">
    Klaviyo records which campaign or automated flow a customer engaged with before they purchased. When an order is still attributed to a low-intent channel (Unknown, Direct, Self Referral, Organic Search or Paid Search - Brand) and Klaviyo attributed it to a campaign or flow, we credit the order to Email.

    This recovers revenue driven by newsletters, promotions and lifecycle automations (welcome, abandoned cart, win-back) that customers often act on without clicking a tracked link. The override only replaces low-intent channels: a genuine paid or generic click always keeps its credit, so email never inflates itself at the expense of your acquisition channels. Recovered orders are credited to the Email channel (CRM group) and stamped with the Klaviyo campaign or flow name.
  </Step>

  <Step title="Post-purchase surveys">
    First-party data from "How did you hear about us?" surveys (such as Fairing, Kno or Triple Whale) provides a fallback for orders still attributed to Unknown, Direct, or Paid Search Brand.

    Surveys capture channels with no digital footprint: word of mouth, podcast mentions, TV ads, in-store recommendations, and other offline touchpoints that no click-based system can detect.
  </Step>

  <Step title="Order note attributes">
    Tags appended by influencer or affiliate platforms (Awin, Social Snowball, Saral, Superfilliate) serve as the final layer for any remaining Unknown orders. These platform-specific tags identify affiliate and influencer orders that slipped through all previous layers.
  </Step>
</Steps>

## First-click vs last-click

Crux captures both first-click and last-click attribution for every order, giving you two complementary views of your marketing performance.

**First-click** shows which channel introduced the customer to your brand. **Last-click** shows which channel drove the purchase. Both are valuable, but they answer different questions.

First-click is the default across all Crux dashboards because it best measures acquisition activity, complemented by discount codes and post-purchase surveys. Last-click is surfaced for visibility and used primarily in CRM reporting (email and SMS channels), since those are low-funnel touchpoints that close sales rather than introduce customers.

**Example:** A customer discovers your brand through a Meta ad (first-click), then returns two weeks later via a Google brand search and purchases (last-click). Both touchpoints are captured. The Meta ad gets credit in the first click model, while the Google search gets credit for the conversion in the last click model.

<Info>
  In your [Orders report](/dashboard-suite/orders), fields prefixed with "Last Click" show last-click data. Fields like Source, Medium, and Channel show the primary first-click attribution.
</Info>

## What happens to unattributed orders

After all six layers have been evaluated, any remaining orders are labelled as Unknown or Direct. These are genuine cases where no trackable touchpoint exists, typically caused by privacy-focused browsers, VPNs, or customers who typed your URL directly without using a discount code.

Most brands see **75-85%+ attribution coverage** after the full waterfall, meaning only a small percentage of orders remain truly unattributed. At order level we leave these honestly as Unknown or Direct rather than guess a source we cannot see. For cross-channel and budget views, the modelled layer below resolves this residual pool.

<Warning>
  Privacy browsers (Safari ITP, Firefox ETP) and VPN usage are increasing, which can reduce GA4's ability to match sessions to orders. The waterfall's additional layers (discount codes, surveys, affiliate tags) help compensate, but some unattributed orders are unavoidable.
</Warning>

## Modelled channel re-attribution

Even after the waterfall, a residual pool of low-signal traffic remains: orders that still resolve to Unknown or brand search, where no touchpoint reliably tells you where the customer first came from. At order level that is honest, we do not invent a source we cannot see. But at channel level it masks real performance, because some of those customers were introduced by Meta, TikTok, an influencer or YouTube, and leaving them in an "Unknown" bucket understates the channels that actually drove them.

For cross-channel strategy and budget decisions, we resolve that pool with a modelled layer on top of the waterfall. It redistributes the residual pool across your real acquisition channels, in proportion to what customers tell us in your post-purchase survey ("How did you hear about us?"). If, over the recent period, surveyed customers name Meta 40% of the time, an influencer 35% and TikTok 25%, the Unknown and brand-search pool for that period is split the same way.

<Steps>
  <Step title="Rolling survey window">
    We use a rolling window of recent survey responses, widening it (7 to 14 to 30 days) until there are enough responses to be reliable. This keeps the split current as your channel mix shifts, rather than applying a stale, all-time average.
  </Step>

  <Step title="Volume thresholds">
    Redistribution only runs when there is enough survey volume to trust the split; below that threshold the pool is left untouched. Individual channels with too few responses are excluded, so survey noise never creates a spurious channel.
  </Step>

  <Step title="Volume-neutral redistribution">
    The layer only moves credit between channels, it never creates orders or revenue. Total orders and revenue are identical before and after, so your topline always reconciles.
  </Step>
</Steps>

<Warning>
  The modelled layer is for **cross-channel and budget decisions only**. Because credit is inferred from survey proportions rather than traced to a specific order, it should never be used for campaign-level optimisation (which ad, keyword or creative to change). For that, use the deterministic waterfall, where every order is traceable to its source.
</Warning>

<Info>
  The modelled view powers cross-channel comparison on the [Channel Performance report](/dashboard-suite/channel_performance) and feeds budget optimisation. Your deterministic, order-level [Orders report](/dashboard-suite/orders) is unchanged: it always shows the traceable attribution, with residual orders left honestly as Unknown or Direct.
</Info>

***

**Need help?** [Contact our team](mailto:support@gocrux.io) or [book a demo](https://gocrux.io/contact).
