Data layer design (ACDL)
Purpose: Decouple your site from analytics tracking.
Who this page is for
| Audience | Why it matters to you |
|---|---|
| Implementation engineers | This is how you structure data |
| Front-end developers | Data layer is your job |
Data layer design
A data layer is a JavaScript object that holds data before it's sent to analytics. It decouples your site from analytics.
Why have a data layer?
Without it:
// Your page code knows about analytics
s.pageName = "Product";
s.prop1 = "electronics";
s.eVar1 = "summer_campaign";
s.t(); // analytics call directly in page
If you change analytics, you change your page code. Messy.
With a data layer:
// Your page pushes data to a neutral layer
window.adobeDataLayer = [{
page: { name: "Product", category: "electronics" },
campaign: { name: "summer_campaign" }
}];
// Tags/Web SDK reads from data layer and sends to analytics
// Your page doesn't care about analytics
If you change analytics, only the mapping changes. Your page is untouched.
ACDL structure
Adobe recommends the Adobe Client Data Layer (ACDL) structure:
window.adobeDataLayer = [{
page: {
name: "Product Detail",
title: "iPhone 15 Pro",
url: "/product/iphone15",
category: "Electronics"
},
user: {
id: "user123",
segment: "premium_member",
isAuthenticated: true
},
cart: {
items: 1,
value: 999.99,
currency: "USD"
},
event: "pageLoad"
}];
Standard data layer objects
| Object | Purpose | Example |
|---|---|---|
| page | What page is this? | name, title, category, url |
| user | Who is this? | id, segment, isAuthenticated |
| cart | What's in the cart? | items, value, currency |
| product | What product? | id, name, price, category |
| event | What happened? | pageLoad, addToCart, checkout |
Events in the data layer
Push a new event object when something happens:
// User adds item to cart
window.adobeDataLayer.push({
event: "addToCart",
product: {
id: "prod123",
name: "iPhone 15",
price: 999.99
}
});
// Tags/Web SDK detects the event and sends it
Mapping to Web SDK
In Adobe Tags, create a rule that listens to the data layer:
Trigger: Data element change (when adobeDataLayer updates) Action: Send event to Web SDK with XDM from data layer
// In the action, extract from data layer and send
alloy("sendEvent", {
xdm: {
web: { webPageDetails: { name: _dl.page.name } },
eventType: _dl.event
}
});
Best practices
- Push data before the event: Push page/user data, then push event
- Use consistent naming: Follow ACDL naming conventions
- Don't populate analytics variables: The data layer doesn't know about prop1, eVar1. It's neutral.
- Keep it flat: Don't nest too deep; it's harder to access
- Document your data layer: Publish a data layer spec for your developers
---
Next: Adobe Tags — data elements and rules