Attribution Engine
Signal’s attribution engine solves one of the most persistent problems in digital advertising: double-counting conversions. When a user clicks ads on multiple platforms before converting, every platform claims full credit for the sale, inflating your reported ROAS and distorting budget decisions.
The attribution engine evaluates touchpoints at conversion time and controls which ad platforms receive the conversion event, and with what value. All of this happens server-side, before events reach the delivery stage — no changes to your vendor blueprints are required.
The Problem: Double-Counting
Without attribution, if a user clicks a Meta ad on Monday, a Google ad on Tuesday, and converts on Wednesday, both Meta and Google report the full conversion value. A $100 purchase becomes $200 in reported revenue across your ad platforms.
This compounds across campaigns and channels, making it impossible to accurately assess which platforms are driving real value.
How It Works
The attribution engine operates in three stages:
1. Touchpoint Recording
User clicks ad → click ID captured → stored against canonical identity
2. Attribution Evaluation (at conversion time)
Conversion event arrives → engine looks up all touchpoints for the identity
→ applies the attribution model → assigns fractional credit to each platform
3. Delivery Adjustment
Each ad platform receives the conversion event with its attributed share
of the conversion value (or is suppressed entirely if it receives no credit)Attribution runs after the Organisation Data Layer and before the Pipeline Transformation Engine. It only activates on events classified as conversions — all other events pass through unaffected.
Attribution Models
Signal supports five standard attribution models. You select a default model at the organisation level and can override it per integration.
| Model | How credit is distributed |
|---|---|
| Last Click | 100% credit to the last touchpoint before conversion |
| First Click | 100% credit to the first touchpoint |
| Linear | Credit split equally across all touchpoints |
| Time Decay | More credit to touchpoints closer to the conversion, using exponential decay |
| Position-Based | 40% to first touchpoint, 40% to last, 20% split among middle touchpoints |
Last Click is the default model and matches how most ad platforms self-report. Switching to a different model will cause your Signal-reported conversions to diverge from the platform’s own reporting — this is expected and is the point of server-side attribution.
Choosing a Model
- Last Click is the simplest starting point and easiest to reconcile with platform-reported numbers.
- Linear is useful when you want to understand the full journey without weighting any single touchpoint.
- Time Decay suits businesses with shorter consideration cycles where recent touchpoints are more influential.
- Position-Based balances discovery (first click) and closing (last click) while still crediting the middle of the funnel.
Custom Model Configuration
Beyond selecting a model, you can configure per-vendor overrides at the organisation level:
- Value caps — set a maximum attributed value per conversion per vendor (e.g. never attribute more than $50 to a single Meta conversion)
- Minimum thresholds — suppress delivery to a vendor if its attributed share falls below a minimum value or percentage (e.g. don’t send a conversion to TikTok if its share is less than 5%)
These overrides are stored in your organisation’s model library and can be edited in the Management UI.
Integration Classification
Not all integrations are subject to attribution. Signal classifies integrations into three categories:
| Category | Attribution applied | Examples |
|---|---|---|
| Advertising | Yes | Meta CAPI, Google Ads, TikTok, Snapchat, Pinterest |
| Analytics | No | Google Analytics 4, Amplitude, Mixpanel |
| Data Warehouse | No | BigQuery, Snowflake, Redshift |
Analytics and data warehouse integrations always receive the full, unmodified conversion value. Attribution only governs advertising integrations where double-counting is a concern.
Each integration’s category is set by its blueprint. You can see the classification on the integration detail page in the Management UI.
Touchpoint Tracking
The attribution engine tracks touchpoints by capturing click IDs from URL parameters when users arrive on your site. These click IDs are stored against the user’s canonical identity, creating a timeline of ad interactions.
How Click IDs Are Captured
- User clicks an ad and lands on your site with a click ID in the URL (e.g.
?gclid=abc123) - Datafly.js captures the URL parameters and sends them with the page view event
- The ingestion gateway extracts recognised click IDs and records them as touchpoints
- Touchpoints are associated with the user’s canonical identity and stored with a timestamp
Supported Click IDs
| Parameter | Vendor | Description |
|---|---|---|
gclid | Google Ads | Google click identifier |
gbraid | Google Ads | Google app campaign click identifier (iOS) |
wbraid | Google Ads | Google web-to-app click identifier (iOS) |
dclid | Google (CM360) | DoubleClick / Campaign Manager click identifier |
fbclid | Meta (Facebook/Instagram) | Meta click identifier |
ttclid | TikTok | TikTok click identifier |
ScCid | Snapchat | Snapchat click identifier |
epik | Pinterest click identifier | |
msclkid | Microsoft Ads | Microsoft Advertising click identifier |
li_fat_id | LinkedIn first-party ad tracking identifier | |
twclid | X (Twitter) | X/Twitter click identifier |
rdt_cid | Reddit click identifier |
Click IDs have expiry windows that vary by vendor. For example, Google’s gclid is valid for 90 days. The attribution engine respects these windows and will not attribute conversions to expired touchpoints.
Configuration
Attribution is configured per organisation in the Management UI under Settings > Attribution.
Enabling Attribution
- Navigate to Settings > Attribution and enable the attribution engine
- Select your default attribution model
- Optionally configure per-vendor overrides (caps, minimums)
Once enabled, attribution automatically applies to all conversion events routed to advertising integrations.
Defining Conversion Events
The attribution engine needs to know which events are conversions. You define this under Settings > Attribution > Conversion Events by specifying which event names should trigger attribution evaluation (e.g. Purchase, Sign Up, Add Payment Info).
Events not listed as conversions pass through to all integrations with their full value, unaffected by attribution.
Edge Cases
No Touchpoints Found
When a conversion occurs but no ad click touchpoints exist for the user, the behaviour is configurable:
- Deliver to all (default) — send the conversion to all advertising integrations with the full value (matches pre-attribution behaviour)
- Suppress all — do not send the conversion to any advertising integration
- Deliver to organic only — send the conversion only to analytics and data warehouse integrations
Same Vendor, Multiple Clicks
If a user clicks multiple ads on the same platform (e.g. two different Google Ads campaigns), the attribution engine treats each click as a separate touchpoint. The vendor receives a single conversion event with its total attributed share across all of its touchpoints.
Cross-Device Attribution
Because touchpoints are stored against the user’s canonical identity, attribution works across devices. If a user clicks an ad on mobile and converts on desktop, the touchpoint is still attributed — provided the identity graph has linked both sessions to the same canonical identity.
View-Through Conversions
The attribution engine is click-based only. View-through conversions (where a user saw but did not click an ad) are not tracked. Ad platforms that support view-through attribution will continue to self-report those conversions on their side.
What Gets Sent to Vendors
When attribution is active, the conversion value sent to each advertising integration is adjusted based on its attributed share. For example, with a Linear model and a $100 purchase across two touchpoints (Meta and Google):
- Meta receives a conversion event with value = $50
- Google receives a conversion event with value = $50
- Your analytics integration (e.g. GA4) receives the full $100
The event structure and all other fields remain unchanged — only the conversion value is adjusted. Your blueprints do not need any modifications to work with attribution.
If a vendor’s attributed share is zero (or below the configured minimum threshold), the conversion event is suppressed entirely for that vendor.
Performance
The attribution engine adds minimal processing overhead. Touchpoint lookups are served from Redis, and attribution evaluation only runs on events classified as conversions. Non-conversion events (page views, identifies, custom events) bypass the attribution engine entirely.