PRISM
The white-label grocery platform behind Hannaford, Food Lion, Stop & Shop and GIANT — one omnichannel experience for every banner, across delivery, pickup, and in-store.
How a click-and-collect expansion pulled online grocery into the stores — and PRISM merged the banner content sites and the Peapod commerce engine into one white-label platform, so every brand kept its feel and every shopper got one experience.
across all banners
a single shared engine
2018 → 2025
ATG monolith retired
What is PRISM?
What is Hannaford PRISM?
PRISM is the white-label grocery platform Peapod Digital Labs built for Ahold Delhaize USA. It put the online shopping of Stop & Shop, Giant Food Stores, GIANT, Martin's, Food Lion and Hannaford, plus Peapod, on one shared engine, so each banner kept its own look while sharing delivery, pickup and the banner websites.
Which stores run on PRISM?
Six store banners plus Peapod: Stop & Shop, Giant Food Stores, GIANT and Martin's from the Ahold side, and Food Lion and Hannaford from the Delhaize side, together serving more than 20 million shoppers a week.
What was Peapod’s role in PRISM?
Peapod was the online grocery delivery brand serving the Ahold markets and Chicago, and its commerce engine was the starting point. PRISM merged that engine with the banner content sites into one white-label platform. In 2019 the whole Peapod storefront, web plus both mobile apps, was run by one ten-person team on an Oracle ATG monolith.
Is this the official Hannaford or Food Lion website?
No. This is a personal case study by an engineer who worked on PRISM from 2019 to 2023. It is not affiliated with Hannaford, Food Lion or Ahold Delhaize. For questions about an order, a charge or your account, contact the store’s customer service.
A merger, a wake-up call, and barely anyone online.
When Ahold and Delhaize USA merged in 2016, the company became a portfolio of much-loved grocery banners — Stop & Shop, Giant Food Stores, GIANT, and Martin's on the Ahold side, Food Lion and Hannaford on the Delhaize side. But the corporate merger moved far faster than the technology behind it.
Amazon's acquisition of Whole Foods was the wake-up call. Looking hard at its own digital footprint, the company saw that only a small fraction of its in-store shoppers ever bought online. Peapod — the one US delivery brand — ran a strong delivery service across the Ahold markets and Chicago, but pickup barely registered, and each banner's website lived in a different world from the store and the cart. The demand was coming; the platform to meet it wasn't there yet.
The scale of the gap was easiest to see from inside Peapod. In 2019 the entire digital storefront — web plus both mobile apps — was carried by one ten-person team: three frontend engineers, three backend, three QA, and a single dev manager. The site was a true monolith — frontend and backend in one codebase on Oracle ATG (Dynamo), with an AngularJS 1.4 UI written in ECMAScript 5 and built by Grunt tasks — so every UI tweak rode the same release train as core commerce logic. The "native" apps were hybrids: thin iOS and Android shells wrapping a WebView, wired to the web code through a JavaScript context bridge.
Meet shoppers where they already are.
The first move wasn't a rebuild — it was a bet on pickup. Delivery was strong but expensive to scale; pickup could grow by meeting customers at the stores they already visited every week. So the company pushed click & collect pickup points out across the banners, and it worked. Success raised the bar: a pickup order, a delivery order, and an in-store run all had to feel like one brand and one account. But that experience was split across two teams that had never shared a codebase — one running the banner websites (recipes, coupons, weekly ads, store locator), the other running eCommerce (product, cart, checkout). Four constraints shaped what came next:
PRISM: one white-label platform, every brand.
PRISM brought the two worlds together on one white-label platform. The banner content — recipes, coupons, weekly ads, store locator — and the commerce engine — catalog, cart, checkout — became one experience, themed per brand. White-labeling was the heart of it: the same platform serves a Giant shopper Giant's experience and a Food Lion shopper Food Lion's — one engine, rendered in each brand's own skin. And the granularity ran deeper than the brand: pricing and promotions were set per store, not per banner — the shopper's home store decided the price and the deals, so what they saw online matched the shelf. Delivery, click & collect pickup, and in-store all flow through the same platform, so a capability built once shows up everywhere.
The GraphQL gateway entered where it was needed first: the new native apps. Rather than hand-rolling per-banner REST integrations for iOS and Android, the apps spoke to a well-typed graph that resolved brand-correct content, catalog, pricing, and fulfillment per request. The web storefront still consumed the existing service APIs at the end of my tenure — but the north star was explicit: one GraphQL layer serving web and native alike, and every schema decision was made with that convergence in mind.
Unifying the banners and modernizing the stack were the same move — and the backend escaped its monolith by strangler, not big-bang rewrite. First, the ATG Dynamo stack was stabilized: scaled up with blue-green deployment support, so the team could deploy confidently while everything else changed around it. A Kotlin / Spring template engine was stood up next, decoupling the frontend teams from the monolith so both sides could build in parallel. Then a Router (gateway) took charge of API versioning while Site Config, the feature-toggle service, let the frontend flip each endpoint from v1 (ATG Dynamo) to v2 (the modernized service) one at a time — with an instant path back if anything regressed. Endpoint by endpoint the traffic drained, until ATG Dynamo could be decommissioned entirely, replaced by a full set of modern RESTful services.
The frontend moved in two deliberate steps: first a strangler migration from AngularJS 1.4 to Vue — every new feature landed in Vue while legacy screens were ported over — then a second migration from the Vue SPA to a micro-frontend architecture on Nuxt, so each product area could build, test, and ship its slice of the storefront independently. Mobile made its own journey in parallel: the WebView-and-bridge hybrid apps were rebuilt in React Native — which is where in-store capabilities like deli ordering first landed — and then went fully native, Swift on iOS and Kotlin on Android, integrated through the GraphQL gateway as the graph's first production consumers.
The organization grew to match. The ten-person Peapod team became four product-aligned frontend pillars — Explore for discovery (CMS, search, ads, product, shopping lists), Transact & Serve (cart, checkout, payments), Loyalty (coupons, promotions, weekly ads), and Mobile (native iOS and Android) — 40+ engineers in two squads per pillar, distributed across three campuses with Chicago as headquarters. The micro-frontend split mirrored that map: each pillar owned its slice of the storefront, not a fork of a codebase.
How the pieces fit.
Channels on top, domain services below, and PRISM in the middle translating between brand-aware storefronts and shared infrastructure. This is the north-star architecture: the native apps were the first channels on the graph, while the web storefront still consumed the existing service APIs — with convergence onto the single GraphQL layer as the endgame.
The capabilities that made it real.
The migrations were the foundation — but the platform never stopped shipping product on top of them: retail media, payments, recommendations, and a pandemic response, live across every banner.
Banner-aware schema
One GraphQL contract that resolves the right banner — and the right store's pricing and promotions — per request. Built for the native apps, designed for every channel.
In-store deli ordering
Order ahead from the app while shopping the aisles — mobile became part of the store trip, not just ordering from home.
Accessibility by default
Every PR tested by hand with VoiceOver, WCAG issues auto-detected during development, and an annual UsableNet audit keeping the bar honest.
Sponsored items & banners
A retail-media layer that evolved from Criteo to Quotient to Epsilon — responsive ads served across every channel, in-store and online.
Apple Pay + SNAP EBT
One-tap Apple Pay on the web, and SNAP EBT acceptance that opened online grocery to the households that needed it most.
In-house recommendations
From vendor ML products to the in-house data science team — powering substitutions, semantic search, and "you might like."
COVID-19 response
Slot control to absorb overnight demand spikes, and contactless delivery shipped when lockdowns hit.
SEO storefronts
Model-store products and categories rendered crawlable, so search engines could discover the catalog before a shopper ever signed in.
Router + Site Config
A versioning gateway plus feature toggles flipped each endpoint from ATG v1 to modernized v2 — and back — one at a time.
End-to-end observability
Datadog RUM and APM traces from storefront to service, so a slow checkout points to its own root cause.
What changed for shoppers and teams.
Consolidation usually means a worse experience for everyone. The win here was a single engine that let every banner ship faster — without flattening what made each one distinct.
The growth the engine carried.
A platform earns its keep in the business numbers, not the architecture diagram. Over PRISM's life the banners' U.S. online sales grew more than 6×, the store-first fulfillment network expanded 5×, and online groceries went from a niche to a core habit — all served through the one shared engine. When COVID nearly doubled demand overnight in 2020, the platform's slot control and contactless delivery are what let the banners absorb it.
2018 → 2025 (6.2×)
2018 → 2025 (5.0×)
total net sales, 2020 → 2024
The boundary is the whole design.
The hardest decisions weren't about GraphQL or Vue. They were about where to draw the line between shared and owned. Push too much into the shared engine and every banner waits on one team; push too little and you're back to seven codebases wearing a trench coat.
PRISM worked because the shared layer owned exactly the things that should never differ — the contract, the release machinery, the accessibility floor — and let each banner own what made it itself. That single judgment call, more than any framework, is what let eight squads across three campuses move like one team.
Want the deeper architecture story?
This case study reflects my personal recollection of work at Peapod Digital Labs (2019–2023) and is written in a personal capacity. It is not affiliated with or endorsed by Ahold Delhaize. Business figures are drawn from Ahold Delhaize's public annual reports and investor materials. Some internal details are simplified or generalized. All trademarks belong to their respective owners.