---
title: Lab 2. On-Board Revenue Campaign
slug: aida-hol/lab-2-on-board-revenue-campaign
docTags: 
createdAt: 2026-05-18T10:55:47.098Z
---

:::hint{type="info"}
**Focus area**
Adobe Journey Optimizer

**Features**
Orchestrated Campaign

Ad Hoc Targeting

Data driven email activation

Multiple messages per profile

Content Optimization

**Difficulty**
Easy
:::

## Use case description

In the travel cruise industry, customers typically confirm their bookings more than 16 months before the departure date. This extended lead time provides significant opportunities to promote onboard services and enhance the overall cruise and travel experience.

As a Marketer of a cruise company, I want to increase the average revenue per cruiser by promoting onboard services before the departure date

- **Right people**: Target people whose lead times > 16 months
- **Right time**: Roll out proposals gradually, at different intervals between the booking date and the departure date
- **Right message**: Optimize messaging based on booking details (number of passengers, loyalty status vs. first-timer cruisers, presence of children) and customer behavior (clicks and page views)

## Resources

**Relational data model**
Data engineers have designed a relational data model and populated it with sample data.

There are 3 main entities: **Booking**, **Cruise&#x20;**&#x61;nd **Customer**

Each entity has been described with a **Relational&#x20;**&#x73;chema.

The relationships between entities have been defined with these cardinalities:&#x20;

- 1 customer has booked 0..N booking(s)
- 1 cruise has been booked in 0..N booking(s)

The Entity Relational Diagram is visible in `Data management > Schemas > Relationships `

![Relational data model](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/OSn9lREaJfAKPf3KHn2lS_image.png "Relational data model")

**Email template**

A Web Agency has provided an email template named **\[Example] Simple Text-led Email Template&#x20;**&#x61;vailable in the Content template library in `Content Management > Content template > All template` folder.

## Solution Design

This page describes a solution based on **Orchestrated Campaign&#x20;**&#x70;rocessing data solution.

A marketer uses a visual web interface to define the key tasks required to automate booking data processes and promote onboard services to enhance the overall cruise and travel experience.

Every day, these tasks will be executed:

- Filter the booking records where departure date is in the future
- Calculate lead times
- Keep only the records where lead times > 16 months and exclude the others
- Calculate the booking age and the number of days before departure date
- Segment the records by booking age and departure date
- Optimize the message with booking data and customer behavior (page views)

The following sections outline the activities a marketer needs to perform to automate this marketing flow.

First, create a new **Orchestrated Campaign** flow:

- In the menu on the left side, under **Campaigns**, click on **Orchestration** tab
- Click on the **Create campaign** button
- Select **Orchestration - Marketing and Transactional** and click o&#x6E;**&#x20;Confirm**
- Set the name to `[your name] Pre Cruise - OnBoard Revenue Campaign- Lead times > 16 months`
- Click on **Save**

## Step 1 - Right People

:::hint{type="info"}
**Goal**
Filter the bookings with a departure date greater than today

Keep records whose lead times is greater than 16 months

**Highlight**

Build audience, Enrichment, Split
:::

### Filter booking records

- Click on the + icon to display the list of activities



::Image[]{src="https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/V2IJwvmO7lER0x3nZyjWQ_image.png" size="50" width="339" height="356" darkWidth="339" darkHeight="356" position="center" showCaption="false"}

- Select the **Build audience** activity
- Set the Targeting dimension to **booking**
- Click on **Create audience** button
- Click on **Add condition**
- Select the attribute `Cruise > Departure date`, click on **Confirm**
- Set the operator to `on or after`
- Select th&#x65;**&#x20;Presets** radio button and set the value to `Today`
- Click on **Calculate&#x20;**&#x74;o get a count of records

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/nG2-gPUmFF8dSLQ0rVLOA_image.png)

- Click on **Confirm**
- Click on **Start&#x20;**&#x74;o start queries in a simulation mode

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/x-vFYWzgDy9Qzyk8iEbh7_image.png)

- Click on the **Result&#x20;**&#x62;ox in the green transition link and click on **Preview results** button to see the results

### Calculate lead times

Every day, the flow calculates the number of days between the booking date and the departure date using a function called `DaysDiff(date1, date2)`

This calculated field will be calculated and added to the target using an Enrichment activity

Follow these tasks:

- Click on the + icon to display the list of activities&#x20;
- Select **Enrichment**
- Click on the **+ Add enrichment** data button
- Click on **Edit expression** button
- Click on **Fx &#x20;**(Helper functions) icon and set this expression

:::BlockQuote{indent="1"}
DaysDiff(\[target/cruise/@departureDate],\[target/@bookingDate])
:::

- Click on **Confirm** button
- Set the Label to `Lead times in days`
- Click on the **Resume&#x20;**&#x62;utton

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/hVZDwlx6dKWG4yYrkuJSD_image.png)

- Click on the **Result&#x20;**&#x62;ox in the green transition link and click on **Preview results** button to see the results

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/elAofnpJNzXK2ZV7Seeaj_image.png)

### Keep the records where lead times > 16 months

- Click on the + icon to display the list of activities&#x20;
- Select the **Split&#x20;**&#x61;ctivity
- Define the subset
  - Set the transition label to `Continue with "16 months lead times"`
  - Set the filter to `lead times in days > 488`
- Enable the **Generate complement&#x20;**&#x6F;ption and set the label to `Exclude - Not the right people`
- Click on **Resume**

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/ax9-CYbIWoCEMsXNwz1zb_image.png)

## Step 2 - Right Time

:::hint{type="info"}
**Goal**
The flow will run every day.

Every day, calculate the booking age (in days) and the number of days before the departure date.

Split the records into segments that align with the optimal marketing timing:&#x20;

- 5 days after booking
- 7 days after booking
- ... days after booking
- 15 days after booking
- 3 days after before departure
- 2 days before departure

**Highlight**

Enrichment, Split
:::

### Calculate the booking age and number of days before departure

One possible way is to follow these steps:

- Go back to the Enrichment activity&#x20;
- Click on **Add enrichment data** button and edit this expression:

:::Paragraph{indent="1"}
`DaysOld([target/@bookingDate])`
:::

- Click on **Add enrichment data** button and edit this expression:

:::Paragraph{indent="1"}
`DaysDiff([target/cruise/@departureDate], GetDate())`
:::

- Set the Label to `Days Before Departure`

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/bbgGsB9K0S0rVh2fB_tS9_image.png)

### Define segments that align with the optimal marketing timing

- Go to the first transition of the Split activity and add another Split
- Set the label to `Segment by booking age or departure date`
- Define optimal marketing timing segments:
  - 5 days old
  - 7 days old
  - 9 days old
  - ...
  - 3 days before departure date
  - 2 days before departure date
- Enable the **Generate complement&#x20;**&#x6F;ption and set the label to `Exclude - Not the right time`

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/rHESEZUCwYUww8usIGfIs_image.png)

- Add an End activity to the exclusion transition paths
- Click on the **Restart&#x20;**&#x62;utton to simulate data

:::hint{type="success"}
**Robust and short-lived process**

This flow starts every day, executes in a few minutes, stops and do the cleanup. This is a robust design that works very well in production. The flow design does not rely on the Wait activity, yet it still enables precise timing of communications.
:::

## Step 3 - Right Message

:::hint{type="info"}
**Goal**
Deliver message to people who have booked

Optimize messaging based on booking details (number of passengers, loyalty status vs. first-timer cruisers, presence of children) and customer behavior (clicks and page views)

**Highlight**

Change dimension, Channel activity, Optimize messaging with Targeting rules
:::

### Change  dimension

Select individuals based on booking data. Communications should be delivered to people, not to bookings.

Follow these steps:

- Go to the transition named `5 days old`&#x20;
- Add a **Change dimension** activity
- Set the New target dimension to `customer`
- Set the label to `Find people from bookings`

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/VTR66cllEaTDmAdt-wTcx_image.png)

:::hint{type="warning"}
**Notes about "Change dimension"**

The **Change dimension** activity allows you to change the targeting dimension as you are building an audience. It shifts the axis depending on the data template and the input dimension. For example, you can switch from the booking dimension to the customer dimension.

This step is **required&#x20;**&#x74;o prepare the target in order to let the product deliver messages (email, push, SMS, direct mail). The engineers are working to improve the process and this step will become optional soon.
:::

### Optimize messaging by aligning content with the target&#x20;

Follow these steps:

- Click on the + icon to add an **Email** activity
- Set the category to `Marketing`
- Click on **Edit email** button
- In the **Actions&#x20;**&#x74;ab, set the channel to `config-email-customer-bookings-marketing`

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/XTTM9ZrUG_bbdgkiSi_Hu_image.png)

- In the **Optimization&#x20;**&#x73;ection, click on **Create targeting rules** button
- Click on **Create rule** button&#x20;
- Go to the **Audiences&#x20;**&#x74;ab&#x20;
- Drag and drop the audience named `Loyal customer`

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/JPkCUDycESZCx6JU6snKh_image.png)

- Rename the rule to `Loyal customer`
- Enable the fallback content that matches a first-time cruiser variant
- Go to the **Content&#x20;**&#x74;ab and apply the `[Example] Simple Text-led Email template` content template for the 2 variants
  - Story 1 optimized for Loyal cruiser

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/pUYmIvOHqzt2q5uf7CCsb_image.png)

:::Paragraph{listStyleType="disc" indent="2"}
Story 1 optimized for First-Time cruiser&#x20;
:::

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/BPzbqBuH3E5b-HQWw2J6x_image.png)

:::hint{type="success"}
**Optimize messaging is about align content to target**

Optimizing messaging involves aligning content with the target audience to ensure relevance, engagement, and a more personalized customer experience.
:::

### Prioritization of messages

At times, multiple messages may be scheduled for delivery on the same day, creating potential conflicts. Marketers must therefore define priorities to ensure that the most relevant message is delivered to each target.

- Copy and paste the activities to design the 2nd segment (7 days old)
- Set the label of the message to `S2.1 Children, S2. Loyal, S2. First-Time`
  1. Deliver the Story 2.1 variant for passengers with children
  2. Deliver the Story2 - Loyal for loyal customers
  3. Deliver the Story2 - First-Time for the others

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/CoWPooZMQhdLUGg-2uTrV_image.png)

- Copy and paste the activities to design the 3rd segment (9 days old)
- Set the label of the message to `AT2. Interest in S2, S3`
  1. Deliver the Action Trigger 2 (AT2) story for customers who have an interest in story 2, that means customers who have clicked and viewed a page proposed by the stories delivered 2 days before, who belongs to this audience
  2. Deliver the Story 3 message for the other cases (fallback message)

![](https://api.archbee.com/api/optimize/1Jp0iolWv35Z_mkI7oUiT/wCEyn_2w0wpwHGymq_rrs_image.png)

:::hint{type="info"}
**Prioritization of messages**

This design offers a framework to manage the prioritization of messages scheduled on the same day.&#x20;

It also supports the use of the Fork activity to enable the delivery of multiple messages within the same day, giving marketers full control over the number of communications sent.
:::

:::hint{type="success"}
**Congratulations** on successfully completing the exercise!&#x20;

This lab focused on these topics:

- Multi-Entity & Relational Data Processing
- Orchestrated Campaign Spirit
- Define segments that align with marketing timing
- Optimize messaging by aligning content with target
:::

## Appendix - Guardrails

**[Channel activities limit](https://experienceleague.adobe.com/en/docs/journey-optimizer/using/campaigns/orchestrated-campaigns/guardrails)** - An Orchestrated campaign supports a maximum of **10 channel activities** (Email, SMS, Push, or Direct mail). Only channel activities count toward this limit. Targeting and flow control activities do not count (for example, Build audience, Wait, Split, Enrichment, Reconciliation, Fork, End, or Test).&#x20;

**[Message content size for journey publication](https://experienceleague.adobe.com/en/docs/journey-optimizer/using/get-started/essentials/guardrails):** When publishing journeys that contain email messages, the total message content size must not exceed **2MB** after backend processing. During publication, the system automatically processes message content by patching links, images, and applying transformations, which increases the payload size beyond the authored content size.&#x20;

