Cet article est disponible uniquement en anglais. Si vous avez besoin d'aide en français, n’hésitez pas à nous contacter.
What's new in V3 (available from 1 April 2026)
Analytics Matching V3 changes how the join is performed. Instead of trying to match multiple fields simultaneously, it generates a single, unified identifier called a matching_key on both sides, analytics and ads, and then joins them on that one key.
Here's what changes:
Each step now has two action blocks — one for Analytics, one for Ads. Both are required.
You can define conditions on both sides independently — the analytics filter and the ads filter are separate.
The result of both action blocks must produce the same value for a match to occur (the
matching_key).
What is Analytics Matching?
Ad platforms (Meta, Google, Snapchat…) and analytics tools (GA4, Piano, Eulerian…) track things independently, using different names and IDs for the same campaigns. Analytics Matching is where you tell spyne how to connect them — which value on the analytics side corresponds to which value on the ads side.
Once set up, every session in your analytics tool is linked to the exact campaign, adgroup, or ad that drove it — giving you accurate attribution and clean deduplication of conversions across platforms.
It’s important not to use double spaces in campaign names, as they are apparently converted into single spaces by GA4.
What are tracking codes and UTMs?
Tracking codes and UTM parameters are additional pieces of tracking information appended to the end of a URL that can give Site Centric Analytics detailed information about the trafic coming to the site (what source, campaign, content ...).
How to access Analytics Matching?
You will need a role of Editor or Admin to manage Analytics Matching settings for a Workspace.
Click your avatar at the bottom of the page, then select Workspace Settings.
From the navigation bar, select Analytics Matching in the Workspace section.
Setting up a rule
By default, `utm_campaign` should contain the campaign name. On some platforms, you might include extra details in this field — for example on Meta, the campaign name plus Adset or Ad name, separated by a delimiter (e.g. `__`, `|`, `::`). This module lets you match Campaigns, Adgroups and Ads at a granular level by extracting the right part from `utm_campaign`.
Rules align campaign tracking between ad platforms (Meta, Google Ads, etc.) and analytics tools (Google Analytics 4, Piano, Eulerian). Each rule targets one ad channel and links it to your analytics data using UTM parameters.
Each rule is displayed as two side-by-side panels — Ads (left) and Analytics (right). You configure both sides so that their actions produce the same output value for a row to match.
Each rule contains one or more steps. Steps are evaluated in order — the first step whose conditions match a row is applied, and the row won't be evaluated by subsequent steps.
Place your most specific steps first and your broadest/fallback steps last. The system stops at the first match.
Available fields reference
Ads fields
Channels to matchPlatform name (e.g. "Meta", "Google")Campaign IDCampaign IDCampaign NameCampaign nameAdgroup IDAdgroup / adset IDAdgroup NameAdgroup / adset nameAd IDAd IDAd NameAd nameAccount IDAccount ID
Analytics fields (UTMs)
utm_sourceTraffic source (e.g. google, facebook)utm_campaignCampaign name or identifierutm_idCampaign IDutm_mediumMarketing medium (e.g. cpc, email)utm_contentAd content identifierutm_termPaid keyword / search termutm_source_platformSource platform (GA4 only)segment_nameCustom segment (Eulerian only)
Source filtering
Analytics rows are filtered by utm_source. Ad rows are filtered by sourceName. Only matching rows enter the rule.
Matching key generation
Each rule is displayed as two side-by-side panels — Ads (left) and Analytics (right).
When — filter which data to process, Then — define how to generate matching identifiers on both sides.
For each step, spyne applies the conditions and actions you configured to generate a matching_key on both the analytics and ads sides. When both sides produce the same value, the entries are matched.
Each rule contains one or more steps. Steps are evaluated sequentially, so you can create complex rules by combining multiple conditions and actions.
Conditions — the "When" block
Conditions are optional. They define which entries a step should apply to. Without conditions, a step applies to everything that reaches it.
You configure conditions separately for the Analytics side and the Ads side — each works independently to determine which entries produce a key.
Split
Split a name by a specific delimiter (e.g. “__” or “|” or “-”) to extract a sub text and match it to the dimension. To do this, use ‘split by’ to provide a delimiter.
Be careful when setting up your delimiter with the UTM fields: it should be different from the delimiters you might use within your Campaign / Adgroup or Adset / Ad names. For example if you use “_” as delimiter within your campaign names, you might want to use another delimiter, such as “|” or “::” to separate the segments within your UTM field.
Split length
It refers to setting criteria on the number of segments resulting from a split operation. You can check if a name, when split by a specific delimiter (e.g. “_” or “|” or “-”), contains the proper number of segments according to your taxonomy standards.
Field value
Rules are applied to the field values. Several ways to identify the values that you want the system to extract.
Contains
It checks if a part of the text is found within the value.
Does not contain
It checks if the text is not found within the value.
Is in
It checks if the value matches any of the listed options.
Is not in
It checks if the value does not match any of the listed options.
Equals
It checks if the value is exactly the same as what is specified.
Matches regex
You can use advanced text extraction and value setting with a full regex integration, for more information about regex please visit : source.
For example,
There are 'Wave1', 'Wave2', 'Wave3', and 'Wave4' in the utm_campaign field: UK_SpringCampaign_RTG_Wave1, FR_SpringCampaign_RTG_Wave2, UK_SummerCampaign_RTG_Wave3, FR_WinterCampaign_RTG_Wave4.You want the rule to only be applied to utm_campaign whose name contains 'Wave'.
Text operations (modifiers)
Not case sensitive
The system ignores the distinction between uppercase and lowercase letters.
For example,
"Hello" would be considered the same as "hello"
No accents
This option removes accents or diacritical marks from characters in the text.
For example,
"é" would be converted to "e"
Trim
Trimming removes any leading or trailing whitespace characters (such as spaces or tabs) from the text. This ensures that the text doesn't have any unnecessary whitespace at the beginning or end.
For example,
“ e “ would be converted to “e”
None of them
This option indicates that none of the aforementioned text operations will be applied. The text will remain unchanged regarding case sensitivity, accents, and leading/trailing whitespace.
For example,
“ Thé “ would be converted to “ Thé “
Multiple conditions
You can combine multiple conditions with the “+ Add condition” button. Conditions can be combined as AND (both conditions must be true), OR (one of the condition must be true).
For example,
For all utm_campaign whose name contain "Marque", and have "BE", "BE-LU", "LU" in the first segment.
No condition
If you want the “then” without any condition, you can remove the “when” by clicking on the grey cross on the right.
Actions — the "Then" block
Actions define what value is used as the matching_key for each row. Both the Analytics side and the Ads side must have at least one action. The goal is for both sides to produce the same output value so they can be joined.
Field value
Retrieve the value from a designated field
For exemple,
You want the desired result values to be the same values of utm_campaign.
Split value
Divide or break down the name into segments, according to a specific delimiter you may have implemented in your taxonomy (e.g. “__” or “|” or “-”), allowing you to choose which segment to collect the values from.
For exemple,
Split utm_campaign with "--" delimiter, select the first segment, and remove "{" and "}".Split the utm_campaign to select the first segment, and use 'replace by' to remove "{" and "}" (leaving the ‘Replace’ field empty).
Post-processing (modifiers)
You can add other subsequent actions, by adding new actions with the button “+ Action” . The options are below:
Lowercase
Convert the value to lowercase
For exemple,
"HELLO" would be converted to "hello"
Uppercase
Convert the value to uppercase
For exemple,
"hello" would be converted to "HELLO"
Title:
Capitalize the first letter of each word
For exemple,
"this is a test" would be converted to "This Is A Test"
Capitalize
Capitalize the first letter of the value
For exemple,
"hello" would be converted to "HELLO"
Replace
You can do one or multiple replacements
For exemple,
"FR" would be converted to "France"
Trim
Remove leading and trailing whitespace
For exemple,
" hello" would be converted to "hello"
Regex replace
Replace parts of the value using regular expressions
For exemple,
"apple pie" would be converted to "banana pie" with refex pattern "apple" and replacement: "banana"
Click the button +Add step
Click + Add step at the bottom of a panel to add a new matching step to the rule. Each step has its own When (conditions) and Then (actions) blocks, configured independently on the Ads side and the Analytics side.
Use multiple steps when your campaigns don't all follow the same UTM structure. For example, some campaigns may carry a numeric ID in utm_term, while others encode the campaign name directly in utm_campaign. Each case gets its own step, and spyne applies the first one that matches.
Tips & best practices
Step order matters. The system stops at the first matching step. Put your most specific conditions (e.g. numeric regex) at the top, and your broad fallback (no condition) at the bottom.
Normalize both sides consistently. If you apply
lowercaseon the analytics side, apply it on the ads side too — otherwise keys won't match.Use a different delimiter for UTM segments. If your campaign names use
_, use a different separator for UTM segments — like__or::— to avoid accidental splits.Add notes to your rules. Use the notes feature to document why a rule exists. Your future self (and teammates) will thank you.
Examples
Example 1: Using composite key
Sometimes a utm parameter can contain multiple information.
For example, the utm_campaign can contain the Campaign name, concatenated with the Ad Group name and the Ad or Creative name using a pipe "|".
1 - Choose the right sources
On the left hand side, select the source that is relevant for this use case, let's say it's Snapchat. On the right hand side, select the UTM Source that will match your Snapchat traffic, for example "snapchat".
2 - Create the matching key on the ads side
We said earlier that the utm_campaign field contains multiple information concatenated with a pipe "|". So on the ads side, we need to create a matching key that will have the same format. We can do this by creating a new transformation with the following formula:
{{Campaign name}}|{{Ad Group name}}|{{Ad name}}This is done by using "Field value" actions for the campaign_name, ad_group_name and ad_name fields, and "text value" action for the pipe "|". The order of the actions is important, it should be:
campaign_namepipe "|"
ad_group_namepipe "|"
ad_name
3 - Create the matching key on the analytics side
On the analytics side, we need to create a matching key that will have the same format as the one on the ads side. This is done by creating a new transformation with the following formula:
{{utm_campaign}}
You are now ready to test that the matching is working correctly, using the “Test” button on the top right corner. You can check the unmatched in analytics and unmatched in ads sections of the output and look for Snapchat data that might be unmatched. Try refining the matching accordingly until you get a good match rate.
Example 2 : extracting an identifier from a name
Sometimes, it can happen that the matching key is contained in the Campaign Name, on the ads side.
For example if you're using CM360, you might use this technique to track which CM Campaign / Placement we're referring to in the platform, and use this tracking for your analytics as well.
Let's say that your Campaign Name on the Ads side looks like this: "<country>-<identifier>-<other_info>", for example "FR-12345-Brand-Awareness". The matching key that you want to use is the identifier, which is "12345" in this case. On the analytics side, this identifier is stored in the utm_id field.
1 - Select the right source and UTM
Always the same first step, select the right source and UTM that contains the data you want to match. In this case, let's say it's Meta and the UTM Source is "facebook".
2 - Create the matching key on the ads side
On the ads side, we need to create a matching key that will extract the identifier from the Campaign Name. We have two choices to do this:
if your identifier is consistently located on the 2nd position of the Campaign Name, split by a dash "-", then you can use the "Split value" action with the following configuration:
Separator: "-"
Index: 2
If the position of the identifier is not consistent, but it is always located after the country code (which is always 2 characters), and before the next dash "-", then you can use the "Regex extract" action with the following configuration:
Regex Pattern:
^[A-Z]{2}-(\\\\d+)-.*$
3 - Create the matching key on the analytics side
As we said earlier, the identifier is stored in the utm_id field on the analytics side, so we just need to create a new transformation with the following formula: {{utm_id}}
Example 3: When utm_term contains the numeric adgroup ID
Meta automatically fills utm_term with the adgroup's numeric ID (e.g. 123456789). That same number is stored as the adgroup ID on the ads side. You want to match sessions to the exact adgroup that served them.
In the Ads panel, select Meta as the channel to match.
In the Analytics panel, select the relevant UTM sources.
In the When block of the Analytics side, click +Add condition.
Select field
utm_term, operator Matches regex, value^\d+$. This means: only apply this step whenutm_termis a number.In the Then block of the Analytics side, select Field value →
utm_term. No modifier needed.On the Ads side, leave the When block empty — no condition, all ads are included.
In the Then block of the Ads side, select Field value →
Ad Group ID. No modifier needed.
Example 4: When campaigns don't all follow the same UTM structure
Your Meta account has campaigns set up at different times, each with a slightly different UTM structure. Instead of one rule trying to handle everything, you create 3 steps in priority order. Spyne applies the first step that matches a given entry and ignores the rest.
In the Ads panel, select Meta as the channel to match.
In the Analytics panel, select Meta (include all variants: Meta, meta, META) as the UTM source to match.
Step 1 — adgroup ID match
Click + Add step. In the When block of the Analytics side, click + Add condition. Select field
utm_term, operator Matches regex, value^\d+$.On the Ads side, leave When empty. In Then, select Field value →
sourceAdgroupId.In the Then block of the Analytics side, select Field value →
utm_term
Step 2 — exact campaign name match
Click + Add step. In the When block of the Analytics side, add a condition: field
utm_campaign, operator Contains, value__.On the Ads side, leave When empty. In Then, select Field value →
sourceCampaignName. No modifier.In Then of the Analytics side, select Field value →
utm_campaign. No modifier.7
Step 3 — fallback with cleanup
Click + Add step. Leave When empty on both sides — this is the catch-all fallback.
In Then of the Ads side, select Split value →
sourceCampaignName, delimiter__, segment 3, then add these modifiers in order using + Add action:Replace
" "(space) → leave empty (removes spaces)Replace
-→ leave emptyReplace
&→ leave emptyLowercase
Trim
In Then of the Analytics side, select Field value →
utm_campaign. Then add the same 5 modifiers (Replace space, Replace-, Replace&, Lowercase, Trim).
How to test rules and check the results?
Click Test (top right) to verify your data. Results will appear above the rules section.
Matched: Data matched between Ad platforms and Analytics.
Unmatched: Data is missing or disconnected.
Note: Click any status in the table to see specific details.
Matched The link is successful. You can view details for Accounts, Campaigns, Ad Groups, or Ads.
Unmatched in Analytics Analytics cannot find a match for your Ad platform data. Check your UTM tags (
source,medium,campaign, orid).Unmatched in Ad Platforms Ad platforms cannot find a match for your Analytics data. Check your Account, Campaign, Ad groups or Ads.
Reorder rules and steps, Add notes
Switch on the toggle “Reorder rules and steps”
Now you can reorder by moving up and down.
The rule priority is what determines which rule to apply when multiple rules could apply. You specify priority by moving individual rules up or down in the list of rules. Rules at the top of the list take priority over rules further down the list. When processing all individual Campaigns, the first rule to be encountered will be applied and following rules will be dismissed.
Add notes to provide context and share them with other users.
How to save mapping?
Click on "Save mapping" if you have made changes.
Or, click on "Discard changes" if you do not want to save the changes.




























