Campaign tracking answers the question that justifies a marketing budget: which effort actually caused this conversion? Without it you know purchases happened but not which ad, email, or campaign drove them. With it done properly, you can attribute every success event, a purchase, a registration, a download, a lead, back to the specific creative that started the journey, even when the conversion lands days later. That is what makes it possible to drive qualified traffic, lower cost per conversion, measure return on ad spend, and understand how different audiences respond. This article covers how that attribution thread is captured and connected, from the tracking code on arrival to the credit assigned at conversion, plus the channel-level reporting that sits alongside it.
The thread from click to conversion
The marketing funnel runs from a strategy, a text ad, a banner, an email, a referral, through an entry page, then browsing, and finally a success event. The tracking code is the thread that connects the first stage, which ad was clicked, to the last, which success event occurred. Capture that code and the two ends of the funnel are joined. Miss it and they are two disconnected halves, and no amount of conversion data tells you what caused the conversions.
Two ways to record a tracking code
There are two methods for getting a campaign code into Adobe Analytics. The first, less common one is to hard-code it on a dedicated landing page, which suits offline ads like radio, print, or TV that send people to a vanity URL with no query string. A radio spot tells listeners to visit a specific page, and that page’s template sets the campaign directly.
// Hard-coded on the campaign's dedicated landing pages.campaign = "radio_spot_xyz";
Every load of that page counts as a click-through for the campaign. The limitation is obvious: if the page is used for anything else, you cannot separate the traffic sources, so this is best reserved for single-campaign landing pages.
The far more common method embeds the tracking code in the destination URL of the ad, as a query string parameter, with each creative getting a unique value.
Text ad: https://www.summitoutdoors.com/page.html?src=ppc_123Banner ad: https://www.summitoutdoors.com/page.html?src=bn_456
Here src is the parameter name and the value after it is the unique code for that creative. The parameter name is your choice, src, cid, trackcode, whatever you like, but it must be consistent across every campaign and must match exactly what you configure in Launch or the plug-in. Get that name wrong in one place and the campaign data simply never arrives.
Extracting the code on arrival
When a visitor lands, the code is sitting in the URL and you need to pull it out and put it into s.campaign. A simple Launch data element of the query-string-parameter type does this for straightforward cases. The more robust pattern uses the getQueryParam plug-in together with getValOnce, which protects against double-counting, and it lives in the doPlugins function inside the Analytics extension’s custom code.
s.usePlugins = true;s.doPlugins = function(s) { s.campaign = s.Util.getQueryParam('src'); s.campaign = s.getValOnce(s.campaign, 'campaign_cookie', 30);};
The first line tells AppMeasurement to run doPlugins before it compiles the image request. Inside it, getQueryParam reads the src value from the URL into s.campaign, and then getValOnce passes that value through a thirty-day check that returns an empty string if the same code has already been seen, so a refresh or a Back-button return to the landing page does not count a second click-through. The reason this belongs in doPlugins is timing: AppMeasurement calls it just before building the beacon, after all other variables are set, which is exactly when getValOnce needs s.campaign to have been evaluated. The net effect is that the code is captured once on arrival and then available to credit every conversion in the persistence window, without inflating the click count.
How credit is assigned across visits
The crucial thing to understand about s.campaign is that it is a special built-in conversion variable, an eVar, and like all eVars its value persists after it is set. That is what lets a conversion be attributed to a campaign even when it happens on a later visit. Picture a visitor clicking a banner on Monday, browsing, adding to cart, but not buying, then returning via a bookmark on Wednesday and completing the purchase. Was Monday’s banner responsible? Yes, if you want last-touch attribution, because s.campaign persists across the gap and credits the banner.
Two Admin settings govern this behaviour, both under the conversion variables configuration. Allocation decides which campaign code gets the credit when several are set: most recent gives it to the last code before conversion, original value gives it to the first and refuses to let later codes overwrite it, and linear splits credit equally across all codes in the window. Most implementations use most recent, crediting whatever the visitor last interacted with. Expiration decides how long the value survives, and the options run from a single page view or visit through a day, week, or month, to custom windows or never. The key subtlety is that expiration is measured from when the value was set, not from the start of the visit, so an eVar set at 7:15 on Monday with week expiration lives until 7:15 the following Monday. Choosing the window means knowing your conversion cycle: a retail site where most purchases happen same session needs far less than a B2B product with a thirty-day sales cycle.
Keep internal and external campaigns apart
This is the distinction that protects your whole attribution model. External campaigns drive traffic from outside the site, paid search, banners, email, social, and they belong in s.campaign. Internal campaigns drive traffic from one part of your own site to another, a homepage banner or an internal promo, and they belong in a separate custom eVar. The reason to separate them is decisive. If both share s.campaign, the internal promotion value overwrites the external code when the visitor clicks it, and with most-recent allocation the internal promo steals credit for a conversion that the paid ad actually originated, which quietly destroys your return-on-ad-spend reporting.
WRONG, both in s.campaign:arrives via paid search -> s.campaign = "ppc_summer"clicks homepage banner -> s.campaign = "homepage_ski_promo" // overwritespurchases -> credit goes to the internal promoCORRECT, tracked separately:s.campaign = "ppc_summer" // external attribution preserveds.eVar5 = "homepage_ski_promo" // internal promotion tracked on its own
With them separated, the purchase credits the paid search externally and the homepage banner internally, and neither cannibalises the other.
Channel-level attribution alongside campaigns
Campaign codes are only one of Adobe’s attribution tools, and they pair with three others. The Campaigns report attributes by the s.campaign values you set. Marketing Channels is a separate, rule-based framework that classifies every visit’s entry point into standardised buckets without relying on tagging. Advertising Analytics imports paid search impressions, clicks, and costs directly from the ad platforms. And Attribution IQ provides advanced modelling, first touch, last touch, linear, time decay, and more. Both Marketing Channels and Advertising Analytics must be switched on by an Admin before they appear.
Marketing Channels deserves attention because it gives a view independent of your campaign tagging. When you first enable it, Adobe offers an Auto Setup wizard, and you should use it, because if you decline it is not offered again and you must configure everything by hand. The wizard creates default channels: paid and natural search distinguished by whether the URL matches a paid-search detection rule, email and display identified by a query string parameter you specify, affiliate from a list of partner domains, social networks from Adobe’s maintained list, internal for visits whose referrer matches your own URL filters, direct for typed or bookmarked traffic, and referring domains for everything else, with anything unmatched recorded as no channel identified. During setup you tell it the query parameter names for email and display, the affiliate domains, and any niche social networks to add.
The detail that trips people up here is processing rule order. Rules are evaluated in sequence and the first match wins, after which no further rules are checked, so more specific rules must come before general ones. If referring domains is evaluated before paid search, every paid click is misclassified as a referring domain and the paid search channel stays permanently empty. A sensible order runs natural search, email, paid search, display, social, internal, direct, and finally referring domains as the catch-all.
Advertising Analytics
Advertising Analytics fills the gap between what Adobe measures and what the ad platform knows. On its own, Analytics sees the visitors who arrived, but not the impressions, total clicks, cost, quality score, or average position from Google, Bing, or Yahoo. Importing that data brings all of it into Adobe, and the Paid Search Performance template in Analysis Workspace combines it with your conversion data for genuine cross-platform analysis. It does have prerequisites worth checking before you promise it: a Select, Prime, or Ultimate SKU, administrator access, report suites mapped to your IMS organisation, edit-level credentials on the ad accounts, and a modern browser, since older Internet Explorer fails during account setup.
Choosing the right tool and settings
The decision flows from where the traffic comes from. Traffic from outside the site uses s.campaign, with the query string method for online ads and the hard-coded landing page for offline ones. Traffic from inside the site uses a separate eVar, kept apart from s.campaign to protect external attribution. If you want channel-level attribution without relying on tagging, enable Marketing Channels and configure the processing rules. And if you need cost and impression data from the ad platforms, enable Advertising Analytics on a qualifying SKU.
The allocation and expiration settings then follow the use case. Last-touch campaign attribution pairs most-recent allocation with a month or visit expiration, while first-touch uses original-value allocation with a longer window. A short-cycle email campaign suits a week, a long B2B cycle suits ninety days or never, internal promotions usually expire at the end of the visit, and standard ROAS analysis on paid search sits comfortably at most-recent allocation with a month-long window.
Conclusion
The recurring mistakes are worth committing to memory. Tracking internal campaigns in s.campaign overwrites the external code and corrupts all paid-media attribution, so internal promos always go in their own eVar. Skipping getValOnce on query-string extraction means every refresh or Back-button return counts another click, inflating every campaign’s apparent effectiveness. Configuring Launch to look for the wrong query parameter name means s.campaign never populates and the data is simply lost. Ordering the Marketing Channel processing rules badly, with a catch-all ahead of a specific rule, empties the specific channel. Declining the Auto Setup wizard forces a far more laborious manual configuration that Adobe will not let you redo. And setting an expiration shorter than your real conversion cycle means the campaign that started a multi-visit journey gets no credit for the eventual purchase. Avoid those, document your parameter name, allocation, and expiration choices in the SDR, and campaign tracking will give you attribution you can actually trust your ad budget to.
See you soon.
[…] Tracking the Campaign Conversion in Adobe Analytics […]
[…] Tracking the Campaign Conversion in Adobe Analytics […]