Retail media on a new e-commerce platform
Coles' new website needed ads served, tracked and measured through a third-party provider, behind a business line worth $100m a year, without slowing the teams building the site.
The problem
Retail media is advertising sold on a retailer's own channels: sponsored products and placements in front of shoppers. When Coles built a new e-commerce platform, retail media had to come with it, and it was a more complex piece than it looks from the shelf.
Two things had to change at once. The way the front end got its data had to stop being a bottleneck, and ads had to flow from a third-party provider onto the site, with what happened next flowing back.
Constraints
- A platform being built at the same time. The ad capability was delivered into an e-commerce platform that was itself new.
- Revenue at stake. Retail media supported $100m a year, so the date and the specification were fixed.
- Complex access patterns. Which ads could appear where, and for whom, had to be expressed in the third-party provider's own structures, not just in Coles' code.
- Measurement is the product. An ad shown but not tracked is an ad nobody can bill for or learn from.
- Many parties. The third-party provider, internal engineering and vendor resources all had to line up.
What I did
Replaced the BFF with a GraphQL layer. Front-end data came through a backend-for-frontend, so every new screen meant a request to an API team and a wait while they built it out, waterfall style. I initiated and led the move to an omni-channel GraphQL layer, so UI developers could define their own access patterns against one schema and get much shorter feedback loops. The same layer hydrated ad products with full product data, so sponsored products sat naturally in the page.
Built the path from the site to the ad provider. The e-commerce platform talked to an ad service, which connected to the third-party ad provider. I led that integration:
- Structuring access patterns in the provider. The rules for which ads could appear in which placements were modelled in the third party, so the provider could serve the right ad for each slot.
- Tracking. Once an ad was shown, the impression and engagement events had to go back to the provider reliably, because that event data is what the business runs on. They streamed back through a proxy we ran.
- Fixed tenancy ads. Alongside the ads served by the provider, we delivered fixed tenancy placements, booked for a set period, within Adobe Experience Manager (AEM), the platform's content management system.
- Observability. We hand-rolled monitoring of ad saturation and engagement on Azure and Sentry, so the team could see how many ads shoppers were seeing and how they responded.
Alongside the build, I managed architecture, engineering and vendor resources against the product goals, and provided technical analysis and roadmap advice, including evaluating tenders.
Resolved a P1 outage, fast. When production went down, the cause sat across containers, Linux and the build pipeline rather than in any one team's code. Finding it quickly took broad knowledge of the whole stack, not depth in a single layer.
Architecture
Serving an ad and tracking it are two different paths.
The ad service answers with which products to promote in each placement. The GraphQL layer hydrates those ad products with the same product data as the rest of the page, so a sponsored product looks and behaves like any other, and each channel gets exactly the shape it asked for.
Events go back the other way through a streaming proxy that we ran, rather than straight from the browser to the third party. That kept the event flow under Coles' control and gave us one place to watch it.
Outcome
- Ad capability delivered to specification and on schedule.
- Supporting $100m a year in retail media revenue.
- UI developers shaping their own data access instead of queuing for an API team.
- Visibility of ad saturation and engagement across the site.