Bring Your Own Markup (BYOM) is a powerful feature of Adobe Experience Manager (AEM) Edge Delivery Services that allows you to programmatically generate HTML pages from a dynamic HTTP endpoint. Rather than relying on authored content or documents, BYOM enables automated page rendering from APIs, product databases, or other backend systems - while still using the same semantic blocks and styling shared across your AEM site.
In this post, we’ll explain how BYOM works, how it fits into the AEM Edge Delivery Services rendering pipeline, and how to integrate it cleanly using Adobe App Builder.
Key Points
BYOM is ideal for building dynamic, API-driven pages in AEM Edge Delivery Services - without sacrificing performance or consistency.
In this post, we’ll walk through:
What BYOM is and how to think of it as an “HTML API”
How BYOM fits into the Edge Delivery Services publication flow
Key configuration steps using SiteConfig and Adobe App Builder
Why semantic HTML blocks matter and how to structure them
Benefits of sharing markup between authored, document-based, and BYOM pages
Great article, @LarsAuffarth. Thanks for sharing. Server-side HTML generation was something I was very much missing in the EDS approach. It is great to see that we now have an option for such common use cases like PIM and commerce integrations.
@LarsAuffarth Great write-up, Lars! The BYOM approach seems especially powerful for scenarios where content needs to stay in sync with external APIs or product catalogs. One thing I’m curious about, when using BYOM with App Builder, what are some best practices you recommend for handling caching at the edge so that pages stay performant while still reflecting near real-time data?
Great question! In our setup, static product data (like name, description, etc.) stays in sync viawebhook-triggered updates - as soon as the backend changes, the edge content is refreshed automatically and served directly from the CDN.
Fordynamic data(e.g., price, reviews, CTA links), we use asplit rendering approach:
The static page is delivered from the CDN as mentioned above, anddynamic data is then injected client-side after being fetched via an edge worker.
The edge worker caches the response with a5-minute TTLand runs on demand when a request comes in and no cached result exists, then serves cached responses for subsequent requests.
This pattern works well for our use case and the product family we serve, but the exact TTL and caching strategy will vary depending on the nature of the data and business requirements.