Expand my Community achievements bar.

Join expert-led sessions on Real-Time CDP & Journey Optimizer designed to boost your impact.

Mastering Real-Time Personalization: A Marketer’s Guide to AEM Content Fragments and Adobe Journey Optimizer

Avatar

Employee

7/2/25

Introduction: The New Standard for Agile Marketing

In today’s hyper-personalized digital landscape, marketers are expected to deliver relevant, timely, and consistent content across multiple channels. But managing this at scale—especially with real-time updates—can be daunting.

Enter the powerful integration of Adobe Experience Manager as a Cloud Service (AEM) Content Fragments with Adobe Journey Optimizer (AJ... This duo empowers marketers to:

  • Create structured, reusable content
  • Personalize it dynamically using customer data
  • Update it in real time across all campaigns

Let’s explore how this works, and then dive into a detailed, real-world use case to bring it all to life. 

What Are AEM Content Fragments?

AEM Content Fragments are channel-neutral, structured content blocks stored in JSON format. They allow marketers to manage content independently of design, making them ideal for omnichannel delivery.

Why They Matter to Marketers

  • Efficiency: Author once, reuse everywhere.
  • Personalization: Dynamically insert content using profile or contextual data with the help of placeholders.
  • Governance: Centralized control over content and offers.
  • Real-Time Updates: Instantly reflect changes across all journeys.

Real-World Use Case: Personalized Flash Sale Campaign in Retail

Let’s walk through a detailed example of how a fashion retailer like LUMORA Collective can use AEM and AJO to run a personalized flash sale campaign.

LUMORA Collective is a global fashion powerhouse known for its diverse portfolio of clothing brands, each catering to a unique audience and style.

Brands under LUMORA Collective:

  1. VYNA

    • Style: Urban streetwear
    • Target: Gen Z and young millennials
    • Tagline: “Own the moment.”
  2. Elaré

    • Style: Modern minimalism and elevated basics
    • Target: Professionals and fashion-forward adults
    • Tagline: “Effortless elegance.”
  3. WildLoom

    • Style: Boho-chic and festival-inspired fashion
    • Target: Free-spirited creatives and travelers
    • Tagline: “Wear your wild.”

Objective

LUMORA plans ahead of the year for two types of Flash sales:

  1. End of Season Flash sales (EOS)
  2. Black Friday Flash sales

The marketer goal is to send personalized flash sale alerts to customers based on their preferred product category and browsing history during both of these planned flash sales campaign.

Step-by-Step Implementation

 

Step 1: Create a Content Fragment in AEM

Screenshot 2025-06-27 at 6.52.07 PM.png

 

 

 

 

 

  1. Access AEM and go to Tools >  Content Fragment Model
  2. Create a new Content Fragment Model with fields like: 
    • fragment_name
    • description
    • brand
    • title
    • body1
      body2
      cta
  3. Navigate to AEM home and under 'Navigation' access 'Content Fragments'

Screenshot 2025-06-27 at 6.54.51 PM.png

 

 

 

 

 

 

  4. Click 'Create' button to create Content Fragment by selecting the previously created Content Fragment model

Screenshot 2025-06-27 at 7.08.14 PM.png

 

 

 

 

 

5.  Author content fragments for each brand and as shown below

 

Brand: VYNNA, EOS Flash sales Content Fragment

{
fragment_name: "VYNA_EOS_flash_sales"
description: "JSON content for Flash sale alerts"
brand: "VYNA"
banner_image: "imagelink"
title: "Hey {{customerName}},your street style just got hotter. "
body1: " Flash Sale: Get {{discount}} off on {{productCategory}} at VYNA "
body2: "Shop {{productName}} now"
cta: {{ctaLink}}
}

 

Brand: Elaire, EOS Flash sales Content Fragment

{
fragment_name: "Elaire_EOS_flash_sales"
description: "JSON content fro Flash sale alerts"
brand: "Elaire"
banner_image: "imagelink"
title: "Hi {{customerName}},elevate your wardrobe with timeless pieces from Elaré. "
body1: " Enjoy {{discount}} off on our curated {{productCategory}} collection"
body2: "Featured for you: {{productName}}. Explore the Collection"
cta: {{ctaLink}}
}

 

Brand: WildLoom, EOS Flash sales Content Fragment

{
fragment_name: "WildLoom_EOS_flash_sales"
description: "JSON content fro Flash sale alerts"
brand: "Elaire"
banner_image: "imagelink"
title: "Hey {{customerName}},your next adventure deserves a new look   "
body1: "  Flash Sale: {{discount}} off on {{productCategory}} at WildLoom  "
body2: "We picked this just for you: {{productName}} 
        Ends soon – don’t miss it! Shop the Vibe"
cta: {{ctaLink}}
}

 

 

Step 2: Tag the Fragment for AJO (In order to allow listing of AEM Content Fragments within the AJO editing experience)

 

  1. Go to Tools > Tagging.
  2. Create a tag using the format:
    ajo-enabled:{AJO-OrgId}/{AJO-SandboxName}
  3. Assign this tag to your Content Fragment.

Screenshot 2025-06-27 at 7.09.20 PM.png

 

 

 

 

 

Step 3: Access and Use the Fragment in AJO

  1. In AJO, create a new Campaign or Journey.
  2. Add action node to a journey, click 'Edit Content' / Add channel to a campaign action and click 'Edit Content' 
  3. Open the AJO WYSIWIG editor, drag and drop a structure and add text component
  4. In any text field, click the Personalization icon or open the HTML editor.

Screenshot 2025-06-27 at 7.10.06 PM.png

     

 

 

 

 

 

 

5. Use the AEM Content Fragment selector to browse and select your tagged fragment.

Screenshot 2025-06-27 at 7.10.14 PM.png

 

 

 

 

 

 

 

 6. Use filters to find only approved fragments.

Screenshot 2025-06-27 at 7.13.43 PM.png

 

 

 

 

 

 

 

7. Select the required Content Fragment and click select to include into AJO editor

8. Use the preview icon to view the content inside selected AEM Content fragment

Screenshot 2025-06-27 at 7.13.51 PM.png

 

 

 

 

 

Step 4: Add AEM CF and Map Placeholders to Data

  1. Access the AEM Content Fragment attributes and plug in to the HTML content. LUMORA plans to send out the flash sales campaign at a personalized level based on the preferredCategory of each profile.

Screenshot 2025-06-27 at 7.14.09 PM.png

 

 

 

 

 

 

 

if profile.preferredCategory = "VYNA"
{{fragment id='aem:391418cd-0da1-4568-a5ac-8c02a38cee91?repoId=author-p22655-e59471.adobeaemcloud.com' result='cf'}} ------------ fragment: VYNA_EOS_flash_sales
else
if profile.preferredCategory = "Elaire"
{{fragment id='aem:391419cd-0da1-4009-a5ac-8c02a38cfd22?repoId=author-p22655-e59471.adobeaemcloud.com' result='cf'}} ------------ fragment: Elaire_EOS_flash_sales
else
if profile.preferredCategory = "Wildoom"
{{fragment id='aem:391419cd-0da1-4009-a5ac-8c02a38cfd22?repoId=author-p22655-e59471.adobeaemcloud.com' result='cf'}} ------------ fragment: WildLoom_EOS_flash_sales
 
 
<html>
<css>
...
</css>
 
 
{{{cf.banner_image}}}
{{{cf.title}}}
{{{cf.body1}}}
{{{cf.body2}}}
 
{{{cf.cta}}}
 
</html>

      2. Map each placeholder to a data source, within the fragment helper.

Screenshot 2025-06-27 at 7.14.20 PM.png

Mapping of placeholders with string/profile/contextual attributes can be done using an intuitive form based UI experience. Follow the steps below:

  1. Enable 'Pills' from the bottom right corner of the editor
  2. Click on the 'Pill' AEM content fragment in the editor
  3. Right rail opens up listing a form view with all placeholder labels which can be mapped to any value 

Updated content with placeholder mappings:

if profile.preferredCategory = "VYNA"
{{fragment id='aem:391418cd-0da1-4568-a5ac-8c02a38cee91?repoId=author-p22655-e59471.adobeaemcloud.com' result='cf' customerName = profile.person.name.firstName productCategory = profile.interests.category productName = profile.lastViewedProduct.name discount = "30%" ctaLink = "https://brand.com/sale"}} ------------ fragment: VYNA_EOS_flash_sales
else
if profile.preferredCategory = "Elaire"
{{fragment id='aem:391419cd-0da1-4009-a5ac-8c02a38cfd22?repoId=author-p22655-e59471.adobeaemcloud.com' result='cf' customerName = profile.person.name.firstName productCategory = profile.interests.category productName = profile.lastViewedProduct.name discount = "30%" ctaLink = "https://brand.com/sale"}} ------------ fragment: Elaire_EOS_flash_sales
else
if profile.preferredCategory = "Wildoom"
{{fragment id='aem:391419cd-0da1-4009-a5ac-8c02a38cfd22?repoId=author-p22655-e59471.adobeaemcloud.com' result='cf' customerName = profile.person.name.firstName productCategory = profile.interests.category productName = profile.lastViewedProduct.name discount = "30%" ctaLink = "https://brand.com/sale"}} ------------ fragment: WildLoom_EOS_flash_sales
 
 
<html>
<css>
...
</css>
 
 
{{{cf.banner_image}}}
{{{cf.title}}}
{{{cf.body1}}}
{{{cf.body2}}}
 
{{{cf.cta}}}
 
</html>

 

 

Step 5: Preview and Test

  • Use AJO’s preview tools to test how the message renders for different profiles.
  • Make sure all mappings resolve correctly.
  • The above content will render as below.

Previews show the different variations applied based on the profile.preferredCategory

Screenshot 2025-06-12 at 11.05.49 PM.png

 

 

 

 

 

 

 

 

 

 

 

Screenshot 2025-06-12 at 10.57.04 PM.png

 

 

 

 

 

 

 

 

 

 

Screenshot 2025-06-12 at 11.02.29 PM.png

 

 

 

 

 

 

 

 

 

Step 6: Publish and Monitor

  • Once validated, publish the journey.
  • Any updates made to the Content Fragment in AEM (e.g., changing the discount or product name) will reflect instantly across all campaigns using it.

 

Step 7: Real-time updates to live journey

  • In order to make any modifications to the content accessed from AEM Content Fragments in the live journey, follow the below steps
  • Navigate to Adobe Experience Manager and open the AEM CF to be modified
  • Make necessary modifications to the text or image in the AEM CF and publish again
  • The modifications will be automatically percolated to all AJO journeys/campaigns accessing the AEM CF

Screenshot 2025-06-27 at 7.21.17 PM.png

 

 

 

Extended Use cases:

Use case 1:

LUMORA Collective runs Flash sales campaigns not only for End of Season sales, but also Black Friday sales. In order to curate their Black Friday sales, they can easily swap the older EOS fragments with BlackFriday fragments with no further changes needed at the authoring.

Additional to the End Of Season Flash Sales Content Fragment, LUMORA also have created a Black Friday Flash Sales Content Fragment (both of the AEM Content Fragments belonging to the same fragment model)

Brand: VYNNA, Black Friday Flash sales Content Fragment

{
fragment_name: "VYNA_Black_Friday_flash_sales"
description: "JSON content for Flash sale alerts"
brand: "VYNA"
banner_image: "imagelink"
title: "Hey {{customerName}},your street style just got hotter this season "
body1: "Flash Sale: This Black Friday get {{discount}} off on {{productCategory}} at VYNA "
body2: "Shop {{productName}} now"
cta: {{ctaLink}}
}

Use case 2: 

LUMORA Collective plans to curate and run campaigns for their new Summer Linen collection based on user location and language.

Locations: New York, Toronto, Dubai, Barcelona, Tokyo

Languages: English, French, Spanish, Japaneese

Total variants: 5 (locations) X 4 (languages) = 20 variants

In order to cater to the above use case, LUMORA can create unique AEM Content Fragments which can be accessed, utilized and re-used in AJO content authoring editor based on conditional logic.

For example, there are 4 different AEM Content Fragments created with unique content: Lumora_Summer_English, Lumora_Summer_French, Lumora_Summer_Spanish, Lumora_Summer_Japaneese

Conditional logic based on location and language can be added within AJO content editor to choose from the unique variants for each combinations. Some of the combinations could be defined as below:

{
if ((profile.location=="New York" AND profile.preferredLanguage="English") OR (profile.location=="Dubai" AND profile.preferredLanguage="English") OR profile.location="New York" OR profile.preferredLanguage="English")
--------- fragment 'Lumora_Summer_English'
else if ((profile.location=="Toronto" AND profile.preferredLanguage="French") OR profile.preferredLanguage="French")
 --------- fragment 'Lumora_Summer_French'
else if ((profile.location=="Barcelona" AND profile.preferredLanguage="Spanish") OR profile.preferredLanguage="Spanish")
 --------- fragment 'Lumora_Summer_Spanish'
else if ((profile.location=="Tokyo" AND profile.preferredLanguage="Japaneese") OR profile.preferredLanguage="Japaneese")
 
}

Step 7: Swap the existing AEM Content Fragment to a new one

  • Click the menu option shown on the selected AEM CF from the middle panel and click swap AEM Content Fragment
  • Select the fragment to be added from the listing (in this case VYNA_Black_Friday_flash_sales)
  • No further modifications required to render the content as expected

Screenshot 2025-06-12 at 11.10.21 PM.png

 

 

 

 

 

Real-Time Updates: Why They Matter

With AEM + AJO, marketers can:

  • Update offers or content centrally in AEM
  • Avoid re-authoring content in every campaign
  • Respond instantly to inventory changes, market trends, or customer behavior

This is especially powerful for:

  • Flash sales
  • Crisis communications
  • Seasonal promotions
  • Regulatory updates (e.g., in healthcare or finance)

Industry Use Cases: Beyond Retail

Travel: Pre-Trip Upsells

Scenario: A travel agency wants to upsell hotel upgrades before departure.

  • Create a fragment with destination, travel dates, and add-ons.
  • Personalize based on booking data.
  • Update offers in real time as availability changes.

The fragment could include placeholder such as name, destination to be added to the content for personalization.

Hi {{name}}, enhance your trip to {{destination}} with a luxury hotel upgrade or a guided city tour!

Hospitality: Loyalty-Based Offers

Scenario: A hotel chain sends tier-based loyalty offers.

  • Use AEM to manage loyalty-tier content fragments.
  • Personalize offers in AJO based on loyalty status.
  • Update seasonal promotions centrally.

The fragment could include placeholder such as name, destination to be added to the content for personalization.

Hi {{name}}, as a {{loyaltyTier}} member, enjoy 20% off your next stay at any of our resorts!

Healthcare: Post-Visit Follow-Ups

Scenario: A provider sends post-visit care instructions.

  • Create a fragment with care plan and appointment details.
  • Map to patient profiles in AJO.
  • Update care instructions centrally as protocols evolve.

The fragment could include placeholder such as name, destination to be added to the content for personalization.

Hi {{name}}, your care plan includes {{carePlan}}. Your next appointment is on {{appointmentDate}}.

Cross-Industry: Offer Personalization at Scale

Scenario: A brand wants to insert dynamic offers into campaigns.

  • Use AEM to manage all offers as fragments.
  • Map placeholders to user behavior or segmentation data.
  • Update offers instantly across all journeys.

The fragment could include placeholder such as name, destination to be added to the content for personalization.

Special offer just for you: {{offerTitle}} – Save {{discount}} on {{product}} until {{expiryDate}}!

 


Best Practices for Marketers

  • Standardize Fragment Models: Align with your brand’s content strategy.
  • Use Tags for Governance: Helps in organizing and filtering.
  • Test Thoroughly: Always preview before publishing.
  • Collaborate with Developers: For advanced personalization logic.
  • Leverage Real-Time Updates: Keep content fresh and relevant.

Conclusion: From Fragment to Fortune

The integration of AEM Content Fragments with Adobe Journey Optimizer is a game-changer for marketers. It enables:

  • Personalized, omnichannel experiences
  • Centralized content and offer management
  • Real-time agility and responsiveness

Whether you're in retail, travel, hospitality, or healthcare, this integration empowers you to deliver the right message to the right person—at the right time.