- Adobe Launch is the execution layer — measurement design must come first
- Always use separate report suites for development and production
- Data elements should read from a structured data layer, never scrape the DOM
- One rule per use case — never one monolithic rule with 20 conditions
- s.t() is for page views, s.tl() is for link tracking — never mix them
- Always clear variables between beacons to prevent value bleeding
- What Adobe Launch actually is
- Before you open Adobe Launch
- Implementation architecture overview
- Step 1 — Create your Launch property
- Step 2 — Install extensions
- Step 3 — Build your data layer
- Step 4 — Create data elements
- Step 5 — Create the page load rule
- Step 6 — Create event tracking rules
- Step 7 — QA and validation
- Common mistakes to avoid
Adobe Launch — now officially called Adobe Experience Platform Tags — is the standard way to deploy Adobe Analytics on web properties. Done right, it gives you a clean, maintainable implementation that scales as your product and team grow. Done wrong, it becomes a tangle of conflicting rules that nobody dares to touch.
I have implemented Adobe Analytics with Launch across global enterprise properties in retail, financial services, and media. This guide covers the full process the way it is actually done at scale — not the simplified version in Adobe's documentation.
What Adobe Launch actually is
Adobe Launch is a tag management system (TMS) built on Adobe's Experience Platform infrastructure. It lets you deploy and manage tags — Adobe Analytics, Adobe Target, third-party pixels, custom JavaScript — without requiring code deployments from your engineering team every time something changes.
Four core concepts govern everything in Launch:
- Extensions — pre-built integrations for specific tools (Adobe Analytics, Adobe Target, ECID Service)
- Data Elements — variables that read values from your data layer, cookies, page elements, or JavaScript
- Rules — the logic that determines when tags fire and what data they send
- Libraries — compiled bundles of your extensions, data elements, and rules that get deployed to your environments
The relationship between these four is what most teams get wrong. Rules without proper data elements are fragile. Data elements without a clean data layer are unreliable. Understanding this dependency chain is the foundation of every good implementation.
Before you open Adobe Launch
Jumping into Launch before defining your measurement plan. The implementation will need to be rebuilt. I have seen this at every major enterprise I have worked with — and the cleanup always costs far more than doing it right the first time.
Before creating a single data element or rule, you need clear answers to these four questions:
- What business questions does this analytics implementation need to answer?
- What user behaviors map to those questions?
- What variables — eVars, props, events — will carry that data?
- What does the data layer look like and who owns maintaining it?
If you cannot answer all four, stop. Build your measurement plan first. Launch is fast to configure — measurement design is not something you can rush.
Implementation architecture overview
Before writing a single rule, it helps to see how all the pieces connect. Here is the full architecture of a well-structured Adobe Analytics + Launch implementation:
The flow is linear — your website feeds the data layer, Launch reads the data layer via data elements, rules trigger the Adobe Analytics extension, and beacons hit your report suite. Everything downstream depends on every layer above it being clean.
Step 1 — Create your Launch property
Log into experience.adobe.com and navigate to Data Collection. Create a new property with these settings:
- Name it clearly — use your domain or brand name, not something generic like "Production Tag"
- Platform: Web
- Enter your primary domain
- Leave "Return an empty string for undefined data elements" checked — this prevents JavaScript errors when data elements cannot find their source values
Create three environments immediately: Development, Staging, and Production. Each gets its own embed code. Never use your production embed code during development — this is the most common way test data pollutes live reports.
Step 2 — Install extensions
Go to Extensions → Catalog. Install these two in order:
Experience Cloud ID Service — Install this first. Configure your Adobe Organization ID. The ECID extension must initialize before Adobe Analytics fires on every page. Control this through rule ordering.
Adobe Analytics — In the extension configuration:
- Report Suite ID: use your development suite here. Production suite goes in a separate environment config.
- Tracking server: use your custom CNAME (e.g. metrics.yourcompany.com) if available, otherwise your company.sc.omtrdc.net domain
- Library Management: choose "Load library" — not "Manage the library for me". The latter limits version control in production environments.
The extension config is not the place to set eVars or events. All variable assignments belong in rules. Extension-level variable config is invisible during rule debugging and creates maintenance nightmares when you need to audit what is being sent.
Step 3 — Build your data layer
Before creating data elements, your development team needs a data layer on the site — a structured JavaScript object that exposes page and user context consistently across every page type.
// Push on every page — values change per page type window.digitalData = { page: { name: "Home", // e.g. "Checkout:Step 1" type: "homepage", // e.g. "product", "checkout" section: "marketing", // e.g. "shop", "account" language: "en-IN" }, user: { loginStatus: "logged-out", // or "logged-in" userId: "" // hashed ID when authenticated }, products: [] // populated on product/cart pages };
Define the schema in a shared specification document before any development begins. Both your development team and analytics team sign off on it. Changes to the schema go through a documented change process — not a quick Slack message.
Step 4 — Create data elements
Data elements read values from your data layer and make them available inside rules. For every Analytics variable you need to populate, create a corresponding data element.
| Data Element Name | Type | Path / Source | Used for |
|---|---|---|---|
| DL - Page Name | Data Layer | page.name | eVar1, prop1 |
| DL - Page Type | Data Layer | page.type | eVar2 |
| DL - Page Section | Data Layer | page.section | eVar3, channel |
| DL - Login Status | Data Layer | user.loginStatus | eVar10 |
| DL - User ID | Data Layer | user.userId | eVar20, visitorID |
Use a consistent naming convention. I prefix data elements by source type: DL - for data layer, JS - for JavaScript variables, Util - for utilities. This makes it immediately obvious what each data element does when you are debugging at midnight.
Step 5 — Create the page load rule
The page load rule fires Adobe Analytics on every page and sends your core page-level variables. This is the most important rule in your entire implementation.
In the Set Variables action, assign your data elements to Analytics variables:
eVar1 = %DL - Page Name% eVar2 = %DL - Page Type% eVar3 = %DL - Page Section% eVar10 = %DL - Login Status% eVar20 = %DL - User ID% prop1 = %DL - Page Name% channel = %DL - Page Section%
Never combine them. Separate actions make debugging straightforward — you can see exactly which action failed, and you can insert additional Set Variables actions between them without restructuring your rule.
Step 6 — Create event tracking rules
For every user interaction — button clicks, form submissions, video plays, file downloads — create a separate dedicated rule. One rule per event type. Never one rule with 20 conditions trying to handle everything.
- Increments page view count
- Use on actual page views only
- Resets visit activity timer
- Used in: page load rules
- Does not increment page views
- Use for all interaction events
- Requires link name parameter
- Used in: click, submit, custom rules
Using s.t() on a button click inflates your page view count. Using s.tl() on a real page view means the visit is not counted correctly. This is one of the most common errors I find during Adobe Analytics audits.
A typical click tracking rule structure:
// Event: Core — Click // Condition: CSS Selector matches ".btn-cta" // Action 1: Adobe Analytics — Set Variables eVar5 = "CTA Click" eVar6 = %DL - Page Name% events = "event5" // your CTA click event // Action 2: Adobe Analytics — Send Beacon s.tl(this, 'o', 'CTA Click') // Action 3: Adobe Analytics — Clear Variables // Prevents variable bleeding into the next beacon
Step 7 — QA and validation
Build your library and publish to the Development environment. Use the Adobe Experience Platform Debugger Chrome extension to validate each of the following:
| Check | What to verify | Status |
|---|---|---|
| Launch library loads | Script tag present and 200 response | ✓ |
| ECID generated | AMCV cookie present with valid value | ✓ |
| Page view beacon fires | One s.t() call per page, not more | ✓ |
| Variable values correct | eVars match data layer values on each page type | ✓ |
| No duplicate beacons | Single network request per interaction | ✓ |
| Report suite correct | Dev suite in dev, prod suite in prod | ✓ |
| Event rules fire correctly | Only when trigger condition is met | ✓ |
Defects caught in development take minutes to fix. Defects caught in production require weeks of data reconciliation and erode stakeholder trust in analytics. The QA checklist is not optional.
Common mistakes to avoid
After inheriting dozens of Adobe Analytics implementations, these are the errors I see most consistently:
- Sending data to production during development. Always use a separate development report suite. No exceptions.
- Configuring variables in the extension instead of rules. Extension-level config is invisible during rule debugging and makes auditing nearly impossible.
- One monolithic rule for everything. Rules with 20 conditions are impossible to debug and impossible to hand over to another team member.
- No data layer — scraping values from the DOM. CSS selector-based data elements break every time developers change the page markup. They break silently, without errors, often going undetected for weeks.
- Missing Clear Variables actions. Without clearing variables between beacons, values bleed from one interaction into the next. The resulting eVar persistence issues are extremely difficult to diagnose retroactively.
- No documentation. The next person to touch this implementation — whether that is a colleague, a new hire, or you six months from now — needs to understand every rule and data element without asking questions. Document as you build.