New: The Agentic CDP

·Read the analysis
Back to Insights

PLATFORM PORTABILITY · PART 4 · INSTRUMENTATION

October 2026 · 10 min read

Lock-In Lives in Your Tags

One Tealium tag that speaks Adobe's instrumentation language and sends it to Oracle CX. Same events, same customer IDs, new destination.

Your data layerAdobe vocabularyOne Tealium tagyour mappings, unchangedAdobeuntil parityOracle Infinitynew destination123MirrorProve parityCut overbeside Adobebusiness measuresper property

Teal stays yours: the data layer and its mappings. The destination changes once the numbers agree.

In February I argued that Oracle has a structural opening against Adobe in enterprise CX (Oracle CX: The Next Platform War). That analysis left out the most practical objection: moving off Adobe means moving your instrumentation.

Lock-in rarely lives in the contract. It lives in your tags: years of AppMeasurement variables and success events, Heartbeat media calls, visitor ID logic and XDM-shaped Web SDK events. That work is why “let’s look at other platforms” rarely survives the first meeting.

Lock-in rarely lives in the contract. It lives in your tags.

So I built the missing piece: one Tealium tag that understands the Adobe instrumentation model and sends it to Oracle CX. Your data layer and your Tealium mappings keep their Adobe vocabulary. Only the destination changes.

What I Built

The tag is a single Tealium template, not a family of tags. It’s built as a drop-in replacement for Tealium’s existing Oracle CX template, so wt.* parameter mappings, the E-Commerce extension and transaction event types carry over. On top, it adds four capabilities modeled on Adobe’s stack:

  • An analytics layer for AppMeasurement’s core variables. Page variables, eVars and props, list and hierarchy variables, context data, success events with values and serialization, product-level merchandising variables, and s.tl-style link tracking. It doesn’t cover plug-ins or the full range of Adobe’s eVar expiration and allocation settings.
  • Heartbeat-style media tracking. The same Tealium video calls the Adobe Heartbeat tag listens for, sent to Oracle Infinity as video sessions with ad breaks, chapters, quartiles, quality-of-service data and 10-second beacons.
  • An identity service in the spirit of Adobe’s Visitor ID Service. A first-party visitor ID shared by every tag instance, customer IDs by namespace with authentication state, cross-domain hand-off and in-browser email hashing.
  • A Web SDK-style event model. XDM-shaped objects flattened into Infinity parameters, identityMap-style identities, an alloy-style onBeforeEventSend hook, and one hit sent to several Infinity accounts, much like sending to several report suites.
Architecture. Your data layer, with Tealium mappings written in Adobe vocabulary, and your video players, through Tealium video events or the Adobe media API via a shim, feed one Tealium template with four layers: analytics, media tracking, identity and consent, and an event model. Every hit lands in Oracle Infinity first. Unity and Responsys are fed from Infinity server-side, and the tag loads Eloqua's script.

Every hit lands in Oracle Infinity first. In this design, Unity and Responsys get their data server-side from Infinity rather than from the browser, so the tag puts identity keys on every hit once it has them: wt.dcsvid and a hashed email in wt.email_sha256. Eloqua is the one destination here with its own browser script, so the tag loads it, tracks the page view in your opt-in mode, and carries the Eloqua visitor GUID onto later Infinity hits.

Built to be reversible and consent-first: 1 Tealium template, so rollback is pasting the old one back; 0 bundled vendor libraries; 0 Oracle calls before consent, with hits held while consent is pending; 0 raw email addresses sent, because the address is hashed with SHA-256 in the browser or not sent at all.

What About Web SDK?

Adobe has its own answer to tag sprawl. Its Web SDK replaces AppMeasurement, the Visitor ID Service and the Target and Audience Manager libraries with one library, which sends a single payload to Adobe’s Edge Network. If the goal is fewer Adobe libraries, Web SDK gets you there.

It consolidates the code, not the dependency. Every event still goes to Adobe’s Edge Network and is routed by Adobe datastreams. Adobe’s event forwarding can pass that data on to other destinations, but it runs on Adobe’s Edge Network, so it stops when Adobe does.

Moving to Web SDK is also a migration of its own: a datastream, usually XDM schemas, and remapped variables. If you’re re-instrumenting anyway, decide first where the data should go. The tag takes either vocabulary: AppMeasurement-style mappings, as described below, or XDM-shaped data and identityMap-style IDs, with the gaps listed under Where It Stands.

Before and after. Today your data layer feeds either three Adobe libraries (AppMeasurement, Heartbeat and Visitor ID) or one Web SDK library, both sending to Adobe Experience Cloud. With the tag, the same data layer feeds one Tealium template, with AppMeasurement-style analytics, Heartbeat-style media, Visitor ID-style identity and Web SDK-style events, sending to Oracle CX.

How the Mapping Works

The tag reads the same Tealium mappings you would write for Adobe. Map a variable to pageName, eVar12 or contextData.member_tier, or set event5 when a value matches, and the tag knows what to do with it.

Adobe conceptWhat the tag doesWhere it lands in Infinity
Page variables: pageName, channel, campaign, purchaseIDMaps them to Infinity's standard parameterswt.ti, wt.cg_n, wt.mc_id, wt.tx_i
eVars, props, lists, hierarchiesSends them as custom dimensions, with eVar-style persistence for the session or the visitorwt.z_evar12, wt.z_prop4
Context dataSends custom parameters with normalized keyswt.z_c_member_tier
Success events, values, serializationCounts events with their values; a serialized event or a repeat order ID counts once per browserwt.z_event5, wt.z_events, wt.tx_e
Merchandising variablesSends per-product values aligned with the product listwt.z_pn_evar3 beside wt.pn_sku
Link tracking (s.tl)Records link type (download, exit or custom), name and URLwt.z_link_type, wt.z_link_name, wt.z_link_url
Heartbeat and Media SDK sessionsBuilds media sessions with ads, chapters, quartiles and quality of servicewt.clip_* and wt.z_clip_* (next section)
Visitor ID Service, customer IDsKeeps a first-party visitor ID, namespaced customer IDs and a hashed emailwt.z_vid, wt.dcsvid, wt.email_sha256, wt.z_cid_crm
Web SDK: XDM, identityMap, onBeforeEventSendFlattens XDM into parameters, takes identityMap-style fields, and runs an alloy-style hook that can edit or cancel a hitwt.xdm_web_webpagedetails_name
A4T-style experiment exposureStamps experiment, variant and ID, vendor-neutralwt.z_exp_name, wt.z_exp_variant, wt.z_exp_id

Serialization here is a client-side stand-in for Adobe’s server-side de-duplication, so it holds per browser, not across devices.

A purchase, end to end. Here is an order confirmation page whose mappings were written for Adobe:

Data layer                                Mapping
page_name      "checkout:confirmation"    pageName
site_section   "checkout"                 channel
member_tier    "gold"                     eVar12
tealium_event  "purchase"                 purchase (event)
order_id       "ORD-10042"                order ID, via Tealium's E-Commerce extension

Reload the confirmation page and the hit still goes, flagged wt.z_dup_order=1 and without wt.z_purchase or wt.tx_e, so it shouldn’t count as a second purchase.

Media: Where Most Migrations Stall

Page analytics is the easy part. Video is where migrations stall, because media measurement is a state machine: sessions, ad pods, chapters, pauses that end sessions, and beacons that count time spent.

The tag meets players where they are:

  • Players that already feed the Adobe Heartbeat tag. This tag reads the same Tealium video calls and built-in video variables, such as video_name and video_current_playhead, so the player doesn’t change. Two setup differences: bare event names such as play and pause need mapping to video_play and video_pause, which the Heartbeat tag does on its own, and custom media mappings need re-pointing.
  • Players that call Adobe’s media API directly. A small media shim exposes the method surface of MediaHeartbeat 2.x and Media SDK 3.x for JavaScript. It can replace the Adobe tracker, wrap it so Adobe and Oracle both get every call, or patch Adobe’s globals so existing player code tees without edits. When wrapped, an Adobe failure can’t block Oracle.

Either way, Infinity receives sessions in its own video vocabulary. That means load, play, pause, resume, seek, buffer and bitrate events; ad break, ad and chapter events; quartiles for on-demand video; a beacon every 10 seconds by default; then complete or stop. A few details matter more than they look:

  • Time played is counted, not inferred from the playhead. The tag accrues wall-clock time only while video is playing, ads included, so pauses, buffering and seeks don’t inflate it.
  • Skipped quartiles aren’t credited. Seek past the halfway mark, and the 25% and 50% markers are recorded as passed but never sent.
  • Ads don’t advance the content playhead. Ad events are labeled as ads, and the program’s position holds while an ad plays, provided the player keeps reporting the program’s position during the break.
  • Long pauses end the session, as in Adobe. Thirty minutes by default, configurable.
  • Quality of service rides along. Bitrate, frames per second, dropped frames and startup time travel with each event.
The states of one media session: load, playing, paused, buffering, seeking, ad break, complete and stop. Time played accrues only while playing, ad breaks included. A beacon goes every 10 seconds, 30 minutes paused ends the session, and skipped quartiles are not sent. The tag sends 21 event types across these states.

Adobe shops lean on the Visitor ID Service more than they realize. It is what makes the analytics tag, the media tracker and the marketing tags agree on who someone is. The tag runs one shared identity and consent service for every tag instance on the page:

  • A first-party visitor ID in a cookie on your own domain. The cookie isn’t written while consent is pending, an opt-out deletes it, and a cross-domain hand-off link is valid for five minutes.
  • Customer IDs by namespace, each with authenticated, logged-out or ambiguous state and a primary flag. They can come in the Visitor API’s shape or as Web SDK identityMap-style fields.
  • Email hashed in the browser. The address is trimmed, lowercased and hashed with SHA-256 before anything is sent. If the browser can’t hash it, the email isn’t sent at all.
  • Identity keys on every hit. wt.dcsvid comes from a visitor ID you pass in or your primary customer ID, wt.email_sha256 from the hash, and the tag’s own first-party ID travels as wt.z_vid. The tag also picks up the Responsys recipient ID from email click-throughs and carries the Eloqua visitor GUID.
  • Consent as a gate. Consent is in, out or pending, with a default you choose; for opt-in regimes, start at pending. Pending hits are held, up to 100, then sent on opt-in or dropped on opt-out, which also clears the visitor cookie. Oracle’s collection library doesn’t load until consent is in, and Eloqua’s opt-in follows the same switch.

Run It Alongside Adobe First

Nobody should switch analytics vendors in one release. The tag is built to run beside Adobe until the numbers agree.

Three steps. 1. Mirror: the Oracle tag runs beside Adobe on the same data layer. 2. Prove parity on orders, revenue, video starts and time played, not raw hit counts; if the numbers do not agree, fix and re-check. 3. Cut over one property at a time, media first and identity last. Adobe keeps reporting until cutover.
1

Mirror

Add the tag to your Tealium profile next to the Adobe tags, on the same data layer, with your Adobe mappings copied across. Players that call Adobe’s media API get the shim in wrap mode, so Adobe keeps every call. Keep your other tags’ load rules off the shim’s video events, and your Adobe reports don’t change.

2

Prove parity on business measures

Compare page views, visits, orders and revenue for the site, and video starts, time played and ad starts per title per day for media. Don’t compare request counts: the two products batch and beacon differently by design, so raw hits won’t match even when the measurement does.

3

Cut over one property at a time

When a property’s numbers hold within the tolerance you agreed up front, switch off its Adobe tags, media first and identity last, and move players on the shim from wrap mode to replace mode, a small player change. Before you do, give Oracle its own consent rule, so nothing depends on a tag you’re removing.

Most of this is Tealium configuration, so most steps are a publish you can roll back.

Where It Stands

Short version: the code exists, and live validation doesn’t yet.

What exists

the unified tag; the media shim; a proxy that passes app media calls to Adobe unchanged while copying them to Oracle; and a server-side translator that turns Adobe media API payloads into Infinity video events, for apps and connected TV. The translator passes a 14-check test suite on synthetic data and has known gaps to fix; the tag itself has no automated tests yet.

What hasn’t happened

any of it sending data to a live Infinity account. Until it does, a short list stays open: how Infinity treats the tag’s video event codes, the consent gate end to end, fan-out to several accounts, the hash case email matching expects, and where late-arriving events land.

What isn’t built

Nielsen, Activity Map-style automatic click capture, mobile lifecycle metrics, and player-state tracking such as mute and full screen. Two gaps for teams on Web SDK: its Analytics fields, whether in XDM or the data object, aren’t yet treated as eVars, props and events, and its streaming media component isn’t covered.

Migration map. Covered: AppMeasurement core variables, Heartbeat media sessions, Visitor ID Service and customer IDs, and Web SDK XDM, identityMap and consent. Partial: eVar persistence and de-duplication, approximated in the browser. Rebuild: AEP profiles and segments, as Infinity streams into Unity. Gap: Target and A4T, where only an experiment stamp carries over.

That gap is the reason for the ask at the end of this post.

Swapping the destination isn’t the prize. What you can do once the data lands is.

What Comes After the Tag

On Oracle, the aim is for behavioral data to sit next to what it needs to meet: customer profiles in Unity, orders and subscriptions in the database, and models running on the same infrastructure as the data. I mapped what a full move onto Oracle Cloud Infrastructure involves, workstream by workstream, in the OCI migration roadmap. Its CDP workstream moves collection from Adobe to Oracle; this is the tag for that step, and the safe route is the one above: mirror, prove parity, cut over.

The data path. The tag collects web, app and video behavior; Oracle Infinity and Unity unify it into streams, profiles and segments; OCI Object Storage lands it; Oracle AI Database stores and searches it; OCI AI infrastructure learns from it. Scores and audiences flow back to Unity for activation in Responsys and Eloqua. The database and AI steps are design work.

It is also the prerequisite for something bigger. INBI argues that infrastructure will increasingly observe behavior directly, from delivery logs, API calls and server events. The client tag is how you get there.

An inference model needs ground truth to learn from and to be scored against. That ground truth comes from the client: a tag reporting what was actually played, clicked and bought, for sessions the infrastructure also logged. So the tag becomes the calibration instrument.

As server-side and inferred signals prove they match it, the client sends less. In the end it reports only what only the device knows: what was on screen, whether a video was paused or just buffered ahead, what happened offline.

Three sources, the client tag, first-party servers and inference from logs, feed one event contract that serves reports, profiles and models. The client keeps only what the device alone knows: what was on screen, paused or buffered, and what happened offline.

The goal is one event contract through all of it, so reports read the same parameters whether the source is the browser, your servers or a model.

Looking for Design Partners

I’m looking for two or three teams to take this onto a live Oracle Infinity account with me. The best fit:

  • You run Oracle Infinity, ideally with more of Oracle CX, behind Tealium iQ.
  • Adobe is still in place, or was recently, so there’s a baseline to prove parity against.
  • Someone on your side owns the Tealium profile and can give us a development environment.

You get the tag set up on your development profile, a side-by-side parity check against your Adobe numbers, and a say in what goes into v1. The work gets the live validation it needs.

If that’s your stack, get in touch.

Next in the series

Part 5 · Convergence

The Hardest Part of One Streaming App Is the Data

Five data decisions under a single streaming service.

Evaluating your CX or CDP stack?

Get vendor-neutral guidance

We advise across 15+ CX and CDP platforms, including Oracle, Adobe and Salesforce, backed by a directory of nearly 7,000 integrations.

Independent · Architecture-led · No platform affiliation

Talk to an expert

Disclosure: CdpHub is independent and is not affiliated with, endorsed by or sponsored by Adobe, Oracle or Tealium. Product names are trademarks of their owners and appear here only to describe compatibility. The tag is a CdpHub build, not an Adobe, Oracle or Tealium product.

We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies. Learn more