Adobe Target

Adobe Target developer for hire

I build Adobe Target variation code as a single minified JS and CSS bundle from my own build rig, with single-page-app handling, anti-flicker, and accessibility solved in code before it ever reaches Target. Target is common on enterprise and AEM-stack sites, where the platform is locked down and the bar for engineering review is high. In Target itself I set the audience and targeting and drop the bundle into the activity's custom code, and conversion tracking runs through GA4. The hard parts are handled in code, not left to the tool, so the build ships clean and passes engineering review. Available for direct briefs and as overflow capacity for CRO agencies running Adobe Target programmes.

Why most Adobe Target variation code breaks, and how I avoid it

Most Adobe Target tests that fail in production fail for the same reasons: the variant assumes the DOM is ready when it runs, it never re-applies after a single-page-app route change, it sets a React input in a way the framework ignores, or it shifts layout after first paint and wrecks Core Web Vitals. These are not Adobe Target problems. They are client-side engineering problems that show up on every testing tool, and they are where a marketer-led build or a generalist falls down.

I solve them before Adobe Target is involved. The variant is built and tested as real code, so by the time it goes into Target it already survives a hostile DOM, re-applies on route changes, sets framework inputs correctly, and ships with the accessibility patterns the brief leaves out. Target then does the one job it is good at: deciding who sees the test and where.

What I actually touch in Adobe Target

Deliberately little, and that is the point. Adobe Target loads through at.js and is common on enterprise and AEM-stack sites, where the platform holds the audiences and the targeting. My variant is one minified JavaScript file and one CSS file that go into Target's custom-code delivery for the activity or experience. I configure the audiences and targeting in Target, map the goal, and let conversion tracking run through GA4, or the client's Adobe Analytics where that is the system of record, rather than rebuilding measurement inside the tool. The less bespoke logic lives in Target's UI, the less there is to break on a publish, and the easier the test is to hand over and reason about.

The engineering baked into every variant

Single-page-app route changes

Adobe Target's at.js evaluates on load. On a React, Vue, or Next.js site, a route change after that happens client-side with no fresh page load, so a naive variant either persists onto pages it should not or breaks because the elements it expected are gone. My bundle watches for URL changes and re-runs the variant logic on each one, with a short settle so the framework's render pass finishes before the variant mounts. I cover the failure mode in why experiments stop firing on SPA route changes.

Anti-flicker without tanking Core Web Vitals

The variant hides only the elements it is about to change, with a timeout failsafe, rather than blanking the whole page. That stops the flash of original content without the page-wide hide that most setups reach for and that wrecks LCP. The full tradeoff is in stopping A/B test flicker without tanking Core Web Vitals.

React and framework-controlled inputs

Setting input.value directly does not fire React's onChange, so form state and visual state drift apart and the test measures nothing useful. The bundle uses the native input descriptor so the framework registers the change. The pattern is below, and explained in full in setting a React controlled input from an A/B test.

// Bypass React's overridden value setter so onChange actually fires
const setReactInputValue = (input, value) => {
  const nativeSetter = Object.getOwnPropertyDescriptor(
    window.HTMLInputElement.prototype,
    "value"
  ).set;

  nativeSetter.call(input, value);
  input.dispatchEvent(new Event("input", { bubbles: true }));
};

Late-rendering elements and accessibility

Targets that mount late (lazy carousels, async recommendations) are handled with an element-wait utility rather than a fixed delay, so the change applies whenever the element appears. See targeting elements that render late. Any new modal or interactive component ships with a focus trap, ARIA roles, and keyboard parity by default, so the variant passes accessibility review instead of failing it on handover. The patterns are in accessible A/B test variants.

Built with my own rig

The reason Adobe Target only ever sees a single clean bundle is that I do not author variants by hand in the tool. I build them in a CRO-specific rig that turns out one minified JS and one CSS per experiment, with a shared helper library for the patterns above, sub-200ms builds, and a stack mode for testing how multiple experiments interact. It is the same output regardless of platform, which is why an Adobe Target build, a Convert build, and an Optimizely build all reach the same engineering bar. The full write-up is in abtestrig, the CRO build tool I built.

How I work on Adobe Target projects

Briefs start with a short intake: scope, hypothesis, audience, expected lift, leading indicator. The variant is built to your engineering conventions where they exist and to pass review where they do not, self-QA'd cross-browser, and run through an accessibility pass before handover. The handover doc covers the Adobe Target audiences and targeting, the goal and GA4 mapping, and how the bundle is organised.

I work UK and EU business hours, every business day, live on Slack and email through your working day. For North American clients, UK afternoons overlap with morning standups on the East Coast.

Hire an Adobe Target developer

For Adobe Target variation builds, overflow capacity for CRO agencies, or to discuss a specific test idea. I respond within one UK business day.