A Next.js 16 demo on AEM, Journey Optimizer and Real-Time CDP
How I led the build of a digital agency's Adobe Summit booth demo: a hotel website and a contact-center agent workspace in one Next.js codebase, personalised live by Journey Optimizer from what a caller says.
By Laurentiu NichiteanPublished Updated
The Business Challenge
The agency needed a working demo for its booth at Adobe Summit 2026 (Las Vegas, 20–22 April) showing AEM, Real-Time CDP and Journey Optimizer working together: a guest calls the contact center, and moments later the hotel website changes for that guest.
The team was allocated part-time, direction was loose and the timeline was tight. The demo had to be editable by marketers in Universal Editor, and it could never show a broken page in front of booth visitors.
What I Built
One Next.js 16 App Router codebase serves both experiences, in four layers:
- Content from AEM, edited in Universal Editor: Server Components fetch AEM content through GraphQL persisted queries: AEM Author with an IMS token in draft mode, Publish with Next.js cache tags otherwise, plus an on-demand revalidation endpoint for publish events.
- A network-layer proxy: handles optional Basic Auth, detects Universal Editor authoring sessions and mints tokens, so the same app works for authors and booth visitors.
- Voice to structured intent: in the agent workspace, speech transcription and an LLM return structured JSON (intent, sentiment, entities), streamed to Real-Time CDP so Journey Optimizer can act on it.
- Personalisation that always renders: Journey Optimizer decisions render client-side behind a prehiding snippet, with a fallback chain (AJO Edge, then AEM GraphQL, then static JSON) so the page always renders.
Architecture
How a conversation in the agent workspace becomes personalised content on the Lumière Hotels website:
- Next.js 16 app
- Adobe Experience Cloud
- AI services
- Resilience
- 1The agent workspace transcribes the call; an LLM returns structured JSON: intent, sentiment and entities.
- 2The structured intent is streamed to Real-Time CDP and lands on the guest profile.
- 3The profile qualifies for an audience, and Journey Optimizer picks the journey and the offer.
- 4The hotel website receives the decision through the Edge Network and renders it behind a prehiding snippet.
- 5Page content comes from AEM through GraphQL persisted queries: drafts from Author, cached pages from Publish.
Guest Data Model
The demo brand, Lumière Hotels, is fictional, so its customer data had to be designed from scratch. I worked on the parts that connect a caller to a website visitor:
- XDM schemas for guests: a guest profile schema and the events for stays and reservations.
- Identity namespaces: ECID, email and loyalty ID, so one guest is recognised across the contact center and the website.
- Audiences: built on the unified profile, deciding which Journey Optimizer offer the site shows.
- Touchpoints
- Adobe Experience Platform
- Data model
- 1Each touchpoint carries an identity: ECID on the website, email or loyalty ID in the call and at sign-in.
- 2Identity namespaces stitch those identities into one Lumière guest.
- 3The guest profile and stay events are modelled with XDM schemas.
- 4Audiences on the unified profile decide which Journey Optimizer offer the website shows.
Vital in helping to bring the demo for Summit to completion, and drove much of the development.
He was the central connecting point of the project, integrating multiple platforms such as AEM, Next.js, call center app, AEP, AJO, and others.
Laurentiu definitely took the lead and owned the Adobe Summit project as a whole.
Outcomes
- Shown live at Adobe Summit 2026: demoed at the agency booth in Las Vegas, 20–22 April 2026, where I presented it to visitors.
- One codebase, two experiences: the hotel site and the agent workspace share content models, auth and deployment.
- Authorable by marketers: Universal Editor works on the live app, with drafts from AEM Author and cached pages from Publish.
- Documented for reuse: I wrote the technical write-up and runbook, so the demo can be rerun and extended.