CJA vs Adobe Analytics for implementers
last verified · against Adobe CJA / Adobe Analytics comparison docs as of 2026-07
CJA vs Adobe Analytics for implementers: report-time processing on AEP datasets, XDM instead of eVars and props, connections, data views, and identity stitching.
What this is
Customer Journey Analytics (CJA) processes data at report time from Adobe Experience Platform (AEP) datasets, where classic Adobe Analytics processes data at collect time into report suites. This reference maps the concepts, limits, and identity mechanics an implementer must translate: eVars/props/events to XDM schema fields, report suites to connections and data views, and visitor identity to Person ID and stitching.
Model and processing
| Aspect | Adobe Analytics (classic) | Customer Journey Analytics |
|---|---|---|
| Processing time | Collect-time (most processing runs immediately after collection) | Report-time on already-stored data |
| Data store | Report suites; collected in-solution via AppMeasurement / tags | AEP datasets |
| Unit of analysis | Visitors / Visits / Hits | Persons / Sessions / Events (renamable) |
| Custom variables | eVars, props, events | Do not exist; XDM schema fields define dimensions and metrics |
| Variable limits | 250 eVars, 75 props, 1,000 events per report suite | Unlimited dimensions and metrics; no cardinality caps |
| Value length | eVar 255 bytes, prop 100 bytes | No equivalent byte cap stated |
| High cardinality | Low-Traffic bucketing at 2,000,000 (low) / 2,100,000 (high) uniques per suite per calendar month, monthly reset | All unique values retained at full granularity; no Low-Traffic |
| Persistence | eVar persists (default last allocation, visit-level expiry); props do not persist |
Data view persistence settings, 90-day max |
| Reporting container | Report suites / virtual report suites | Data views (up to 5,000 metrics + 5,000 dimensions each) |
| Ingest / report logic | Processing rules + VISTA | Data Prep (ingest-time) + Derived Fields (report-time, retroactive) |
| Classifications | Classifications + Classification Rule Builder | Lookup Datasets (Analytics Classifications Connector) + report-time substrings |
| Bulk export | Data Warehouse; Data Feeds | Full Table Export; Data Access API / Destinations (no post-process columns) |
| Identity | Adobe Analytics ID (AAID), via the Analytics source connector | Schema-defined Person ID / ECID |
| SQL access | None | Data Distiller (SQL) |
| Data scope | Web / mobile; single or merged report suites | All XDM data types; merges multiple report suites and datasets |
Reporting-surface renames
The terms an implementer meets first when rebuilding reports.
| Adobe Analytics | Customer Journey Analytics |
|---|---|
| Visitors | People |
| Visits | Sessions |
| Hits | Events |
| Virtual report suites | Data views |
| Segments | Segments (called “Filters” in earlier CJA) |
| Calendar Events | Annotations |
| Entries / Exits | Session Starts / Ends (calculated differently) |
| eVars / props / events | XDM fields projected into data-view components |
Classic Adobe Analytics limits (for reference)
| Item | Value |
|---|---|
| eVars per report suite | 250 (eVar1..eVar250, query-string v1..v250) |
| props per report suite | 75 |
| Success / custom events per report suite | 1,000 |
| eVar value length | 255 bytes |
| prop value length | 100 bytes |
| eVar reporting column | Persistent post_evar |
| eVar default behavior | Persistence beyond the hit, last allocation, visit-level expiry |
| prop default behavior | No persistence |
| Low-Traffic thresholds | 2,000,000 low / 2,100,000 high uniques per suite per month; global reset each calendar month |
The comparison page restates the 75 props / 250 eVars figures but not the
1,000-event limit; the 1,000-event figure comes from Adobe’s product
description. Confirm contract-specific limits before quoting. Low-Traffic
thresholds are adjustable and were historically 500,000 — treat the numbers as
account- and dimension-specific.
Connection and datasets
A CJA connection defines which AEP datasets are ingested.
| Item | Value |
|---|---|
| Datasets per connection | Up to 100 |
| Foundation package | 1 event dataset + up to 99 profile / lookup / summary datasets |
| Event dataset | Time-series (e.g. web visits, transactions) |
| Profile dataset | CRM data about persons |
| Lookup dataset | Reference / enrichment |
| Summary dataset | Aggregated |
| Sandbox | Must select the AEP sandbox that contains the datasets |
| Person ID | Chosen from the identities defined in each dataset’s XDM schema |
| Person ID case | Case sensitive (abc123 and ABC123 are different values) |
| Row with no Person ID | The event record is skipped entirely |
| Merge behavior | Each dataset’s Person ID column merges into a single Person ID column, regardless of name |
| Same person | Matching Person ID across datasets |
| Same session | Matching Person ID with timestamps within 30 minutes |
| Event resolution | By timestamp to millisecond precision |
Data views
Data views are the CJA equivalent of virtual report suites and become the report-time governance surface.
| Capability | Detail |
|---|---|
| Capacity | Up to 5,000 metrics and 5,000 dimensions per data view |
| One XDM field to many components | Create both a metric and a dimension from a single field |
| Multiple metrics from one field | Different attribution models or lookback windows |
| Configuration | Custom component IDs, metric formatting / currency, session length, persistence, attribution defaults, included / excluded values |
| Nature | Report-time and non-destructive |
| Persistence | Data-view setting, 90-day max |
| Attribution default | Same Touch for dimensions (Adobe Analytics commonly used Last Touch) |
Migration mapping (feature to implementation)
| Adobe Analytics feature | CJA implementation |
|---|---|
| Processing rules / VISTA | Data Prep (ingest-time) + Derived Fields (report-time, applied retroactively) |
| Classifications | Lookup Datasets (importable via the Analytics Classifications Connector) |
| Classification Rule Builder | Report-time string manipulation (substrings) |
| Data Warehouse | Full Table Export |
| Data Feeds | Experience Platform Data Access API and Destinations (no post-process columns) |
| Marketing Channels (Web SDK data) | Derived Fields |
| Marketing Channels (source-connector data) | Flows from Analytics |
None of these carry over automatically; each is manual migration work.
Identity and stitching
| Item | Value |
|---|---|
| ECID | Generated by the Edge Network; identifies a device, not a person |
| ECID cookie | First-party kndctr_ cookie (set whether first-party or third-party collection is used) |
identityMap |
Carries additional identifiers (CRM IDs, hashed emails) alongside the ECID |
| Primary identity | Designate a person-level namespace as primary when available |
| Client retrieval | getIdentity command returns the ECID; ECID can also be mapped to custom XDM fields via Data Prep |
| Stitching | Graph-based (GBS) | Field-based (FBS) |
|---|---|---|
| When | Identity Service / identity graph is available | Standalone CJA, no Identity Service access |
| Persistent ID | Device / cookie ID (e.g. ECID), present on every row | Present on every row |
| Person ID | Stable ID from a chosen namespace, present on some rows | On some rows; single namespace only |
| Resolution | Queries the AEP Identity Service identity graph | Field rekey, no graph |
| Passes | Live (each event as collected) + Replay (lookback: daily 24-hour, weekly, biweekly, or monthly) | Single-step rekeying only (no multi-hop) |
| Tie-break | Lexicographically first ID / namespace when multiple primary identities exist | Case-sensitive matching; cannot combine / concatenate fields |
| Fallback | Persistent ID used when the person-ID lookup fails | — |
| Hard limit | — | Max 50,000 user transitions per device before stitching halts |
Web SDK and datastream
| Item | Value |
|---|---|
| Payload: XDM object | Conforms to an XDM schema (optionally the Adobe Analytics ExperienceEvent field group); the Edge Network translates it into an Adobe Analytics format |
| Payload: data object | Geared to existing AppMeasurement implementations for easier migration |
| Payload: context data | Unmapped fields, then mapped to Analytics variables via Processing rules |
| Datastream | Server-side SDK config referenced by datastreamId; fans out to AEP, Adobe Analytics, Target, Audience Manager, event forwarding, edge destinations; changeable without touching site code |
| Default edgeDomain | edge.adobedc.net |
| First-party edgeDomain | A subdomain of data.adobedc.net via CNAME (e.g. example.data.adobedc.net using the IMS / Tenant value), or a customer-owned domain under the Adobe-managed certificate program |
Schema design (durable fields, not slots)
| Do | Avoid |
|---|---|
Model stable, self-describing fields (search.term, content.category, user.membershipTier) |
Recreating eVar1..eVar250 / prop1..prop75 numbered slots |
| Store each value once | Locking a CJA-bound schema into the Adobe Analytics ExperienceEvent field group |
| Create many components (dimensions / metrics) from one XDM field in data views | Baking attribution / persistence into the schema |
| Apply attribution, lookback, and persistence at the data-view level | — |
| Use standardized field groups where they fit; extend with custom fields | — |
Adobe advises against numbered slots but publishes no single prescriptive
eVarX to XDM field-path mapping; any concrete mapping is an implementer choice,
not an Adobe-specified rule.
Feature support notes
| Area | Status in CJA |
|---|---|
| Custom session length | Set in Data View Session Settings |
| New vs Repeat Sessions | 13-month lookback |
| Metric deduplication | Person or session level; dedup IDs are not applied automatically and must be configured explicitly for conversion events |
| Alerts | Daily / weekly / monthly only (no hourly) |
| Not supported | Activity Map, Contribution Analysis, Triggers, People metric via Cross-Device Coop, Segment Comparison, A4T panels |
Support status is a moving target; re-check the live comparison page at build time.
Gotchas
- Person counts drop and events silently vanish — cause: the Person ID must come from a schema identity, and any event row with no value for it is skipped; casing splits one person into many (
abc123!=ABC123) — fix: carry a value on every row (use ECID as the always-present primary identity), normalize casing before ingestion, and stitch to backfill person IDs rather than dropping anonymous rows. - Conversion events double-count — cause: CJA deduplicates at the person or session level, and dedup IDs are not applied automatically — fix: configure deduplication IDs for conversion metrics in the data view and validate at the intended level before trusting the numbers.
- Attribution differs from the old reports — cause: CJA defaults dimensions to
Same Touch, whereas Adobe Analytics commonly relied on Last Touch (eVar last-allocation), and attribution now lives in the data view — fix: set attribution model, lookback, and persistence per component in the data view (persistence 90-day max) to match intended behavior. - A field was ingested with the wrong data type — cause: XDM schema is mandatory before ingestion, and once a dataset is populated with a wrong field type it must be deleted and recreated — fix: design and validate schema field types up front; use Data Prep to cast / validate on ingestion and treat type choices as hard to reverse.
- Processing rules, VISTA, bot rules, and classifications did not carry over — cause: none are replicated automatically — fix: rebuild ingest logic in Data Prep, report-time logic in Derived Fields, classifications as Lookup Datasets, and Marketing Channels via Derived Fields for Web SDK data.
- Calculated metrics and segments are missing — cause: calculated metrics are not auto-ported and segments (earlier called “Filters”) must be rebuilt against XDM fields, not eVars / props / events — fix: recreate them against data-view components; expect manual work, not a lift-and-shift.
- High-cardinality dimensions explode — cause: Adobe Analytics buckets values over roughly 2,000,000 uniques per month as Low-Traffic; CJA applies no bucketing and keeps every unique value — fix: use Derived Fields to normalize / trim values (e.g. strip query strings) and design data views and filters for full cardinality.
- Stitching links to the wrong person — cause: graph-based matching is timestamp-agnostic and picks the lexicographically first namespace on multi-identity or shared-device rows; field-based supports only single-step rekeying and halts after 50,000 transitions per device — fix: validate with the CJA stitching tooling, keep the person ID to a single namespace, set namespace priorities where supported, and account for the per-device transition cap.
- A fresh Web SDK schema on the Analytics field group makes later CJA migration painful — cause: the Adobe Analytics ExperienceEvent field group recreates numbered
eVar/propslots inside XDM — fix: for CJA-bound builds, model durable fields (search.term,content.category) and populate any Analytics variables you still need via datastream mapping or Derived Fields.
Quick recipes
Configure the datastream with a first-party edge domain:
alloy("configure", { datastreamId: "ebebf826-a01f-4458-8cec-ef61de241c93", orgId: "ADB3LETTERSANDNUMBERS@AdobeOrg", // default is edge.adobedc.net; a first-party CNAME reduces ad-blocker // interference and keeps the kndctr_ ECID cookie first-party edgeDomain: "example.data.adobedc.net"});Send durable, self-describing XDM fields instead of numbered slots:
// Model each value once; data views project it into many components.// Custom fields live under your tenant namespace in the schema.alloy("sendEvent", { xdm: { search: { term: "running shoes" }, content: { category: "footwear" }, user: { membershipTier: "gold" } }});Carry a persistent ID on every row plus a person ID on some rows (for stitching):
// ECID (persistent, device-level) is added automatically on every row.// Add a single-namespace person ID on authenticated rows as the primary// identity so anonymous-then-authenticated journeys resolve to one person.alloy("sendEvent", { xdm: { identityMap: { CRMID: [{ id: "crm-000123", authenticatedState: "authenticated", primary: true }] }, web: { webPageDetails: { name: "account:home" } } }});Retrieve the ECID client-side:
alloy("getIdentity").then(function (result) { // ECID identifies a device, stored in the first-party kndctr_ cookie console.log(result.identity.ECID);});Normalize casing before a value becomes a Person ID:
// Person ID matching is case sensitive: abc123 and ABC123 do not merge.// Apply one consistent rule before the value enters CJA.var email = rawEmail.trim().toLowerCase(); // e.g. before hashingvar crmId = rawCrmId.trim(); // keep casing rule stable// then set the value on identityMap for the chosen namespaceRelated
Sources
Adobe Experience League pages these values were read from:
- Customer Journey Analytics overview (B2C) (read 2026-07-20)
- Comparison with Adobe Analytics — overview (read 2026-07-20)
- Customer Journey Analytics Feature Support (CJA vs AA) (read 2026-07-20)
- Create or edit a connection (read 2026-07-20)
- Combined event datasets (read 2026-07-20)
- Graph-based Stitching (read 2026-07-20)
- Field-based Stitching (read 2026-07-20)
- Data views (CJA) (read 2026-07-20)
- Architect your schema for use with CJA (read 2026-07-20)
- Implement Adobe Analytics with the Web SDK — overview (read 2026-07-20)
- Datastreams overview (read 2026-07-20)
- Identity data in the Web SDK — overview (read 2026-07-20)
- edgeDomain (Web SDK configure command) (read 2026-07-20)
- Low-traffic value in Adobe Analytics (read 2026-07-20)
- eVar (dimension) (read 2026-07-20)
Flagged rather than guessed: the 1,000-event limit is from Adobe’s product
description, not the comparison page; the Low-Traffic thresholds are adjustable
(historically 500,000); the 90-day data-view persistence maximum and the AEP
Identity Service guardrails were not each re-verified on a dedicated reference
page; and there is no official one-to-one eVarX to XDM field-path mapping.
Changelog
- — Initial version, verified against official documentation.