# Build the journeys

Each recipe on the pages of this section is one journey. The journeys and their message texts are examples. Build the ones you need and replace the texts with your store's tone and offers. To open the canvas, see [Start creating your first journey](/product/customer-journey/getting-started/#start-creating-your-first-journey). For the canvas basics, see the [Customer Journey overview](/product/customer-journey/pushwoosh-journey-overview/).

<Aside type="tip" title="Let AI Assistant create the journeys">
[AI Assistant](/product/pushwoosh-ai/ai-assistant/) can create the journeys from these recipes in your application. Send it the link to the recipe page and name the journey you need. It creates the journey right away, as a draft that doesn't affect shoppers until you launch it. Check the draft before you launch it.
</Aside>

## Choose the journeys to build

Shoppers move through similar stages. Use this table to pick the journeys for the stage where you lose them.

| Stage | What is happening | Journeys |
| --- | --- | --- |
| New | The shopper created an account and has not ordered | <ul><li>[Welcome and first order](/tutorials/industry-playbooks/ecommerce/build-the-journeys/browse-and-cart/#welcome-and-first-order)</li></ul> |
| Browsing | The shopper looks at products | <ul><li>[Reminder about viewed products](/tutorials/industry-playbooks/ecommerce/build-the-journeys/browse-and-cart/#reminder-about-viewed-products)</li><li>[Wishlist back in stock](/tutorials/industry-playbooks/ecommerce/build-the-journeys/browse-and-cart/#wishlist-back-in-stock)</li></ul> |
| Buying | The shopper put a product in the cart | <ul><li>[Cart abandonment](/tutorials/industry-playbooks/ecommerce/build-the-journeys/browse-and-cart/#cart-abandonment)</li></ul> |
| After the order | The shopper ordered | <ul><li>[Order status updates](/tutorials/industry-playbooks/ecommerce/build-the-journeys/after-purchase/#order-status-updates)</li><li>[Review request after delivery](/tutorials/industry-playbooks/ecommerce/build-the-journeys/after-purchase/#review-request-after-delivery)</li><li>[Second order offer](/tutorials/industry-playbooks/ecommerce/build-the-journeys/after-purchase/#second-order-offer)</li></ul> |
| Loyal | The shopper orders again and again | <ul><li>[Early access for loyal customers](/tutorials/industry-playbooks/ecommerce/build-the-journeys/loyalty-and-win-back/#early-access-for-loyal-customers)</li></ul> |
| Leaving | The shopper stopped ordering | <ul><li>[Win-back for inactive customers](/tutorials/industry-playbooks/ecommerce/build-the-journeys/loyalty-and-win-back/#win-back-for-inactive-customers)</li></ul> |

Start with Welcome and first order, Cart abandonment, Order status updates, and Win-back. Reminder about viewed products and Wishlist back in stock need more data, so add them later.

## Prepare the content for the journeys

Every message element in a journey uses ready content, so create the content before you build the journey. Each recipe lists what it needs under **Content to prepare**. Create the content in **Content**:

* **Push:** [push presets](/product/content/push-presets/). A preset can also open a screen of your app, such as the cart, with a [deep link](/product/messaging-channels/push-notifications/advanced-push-features/deep-linking/).
* **In-app:** [in-app templates](/product/content/in-apps/).
* **Email:** [email content](/product/content/email-content/).

### Personalize the content

There are four ways to put data into a message:

* **Event data:** to put a value from the event that started the journey into a message, such as the product name, add a placeholder to the preset, turn on **Personalise message with event attributes** on the push or email step, and under **Overwrite personalization** map the placeholder to the event attribute. In-app elements do not take event attributes. You can also insert it with a Liquid placeholder. See [Dynamic Content and Liquid Templates in journeys](/product/customer-journey/journey-elements/dynamic-content-and-liquid-templates-in-journeys/).
* **Shopper data:** to put a value stored on the shopper into a push, such as the `favorite_category` tag, add a [Dynamic content](/product/personalization/dynamic-content/) placeholder to the text.
* **Products:** to fill a push with products from your feed, use a [Product catalog](/product/content/product-catalog/) and a [product recommendations push preset](/product/content/push-presets/build-push-content-from-a-feed/).
* **Language:** to send each shopper the message in their own language, add the languages to the push or in-app content. Pushwoosh picks the version by the device's Language tag, which the SDK sets from the OS locale, so you do not need a custom language tag. See [Multi-language messaging](/product/personalization/multi-language/).

## Best practices for every journey

Apply these to every journey in this playbook:

| Practice | Why |
| --- | --- |
| Set a silence period | A push should not reach a shopper in the middle of the night. The period blocks messages in each shopper's device timezone, for example 22:00 to 08:00. Learn more: [Silence period](/product/customer-journey/journey-settings/#silence-period) |
| Limit how often a shopper enters | A shopper who is in a journey does not enter it again, but once the journey ends, the next `Product added to cart` or the next segment check starts it again, so one shopper could get the same reminder again and again. Learn more: [Campaign entry limit](/product/customer-journey/journey-settings/#campaign-entry-limit) |
| Choose the message type on every message element | A journey that starts on an event does not preselect the type, and the element shows **Message type not selected** until you choose one. Learn more: [No preselected message type](/product/messaging-channels/marketing-vs-transactional/#no-preselected-message-type) |
| Use Marketing message for reminders, offers, and win-back | A marketing message follows the limits you set: [frequency capping](/tutorials/industry-playbooks/ecommerce/prepare-for-communication/#set-delivery-rules-before-you-message-shoppers), silence periods, and [control groups](/tutorials/industry-playbooks/ecommerce/prepare-for-communication/#set-up-a-control-group-before-you-launch). Transactional messages skip frequency capping and control groups, but not silence periods, so keep them for service messages such as order status. Learn more: [Choosing the right message type](/product/messaging-channels/marketing-vs-transactional/#choosing-the-right-message-type) |
| Add a conversion goal | The conversion rate of the goal in **Performance** shows how many shoppers did the action you chose, usually `Order placed`. Learn more: [Conversion goals](/product/customer-journey/journey-settings/#conversion-goals), [Measure results](/tutorials/industry-playbooks/ecommerce/launch-and-measure/#measure-results) |
| Stop the journey when the shopper orders | A reminder that arrives after the order annoys the shopper. In the conversion goal, choose `Order placed` and select **End journey after this event**. To end the journey on an event that is not a conversion, add it under **Settings** → **Cancel events** |
| Plan for shoppers without push | A shopper who has not allowed notifications gets no push. Add a Reachability check and send an in-app message or an email instead. In-app messages reach only shoppers who use the app, not your website. Learn more: [Reachability check](/product/customer-journey/journey-elements/flow-controls/reachability-check/), [Ask for push permission at the right moment](/tutorials/industry-playbooks/ecommerce/prepare-for-communication/#ask-for-push-permission-at-the-right-moment) |
| Check who a segment journey takes in | A journey that starts from a segment takes in only devices with a push token. The token arrives when the app asks for push permission, even if the shopper declines, so these shoppers enter and get the in-app message. Shoppers the app has not asked yet do not enter |
| Set an expiration on in-app messages | A journey in-app appears the next time the shopper opens or returns to the app, as **Show in-app** is set to **On next app launch** by default. Set **In-app expiration**, for example 1 day, to keep old messages from appearing days later. To reach shoppers outside the app, use a push. Learn more: [In-app expiration](/product/customer-journey/journey-elements/channels/in-app/#select-template-and-set-expiration) |
| Test every journey before you launch it | A journey has no test mode, so once it is running, real shoppers who match its entry get its messages. Learn more: [Test each journey before you launch it](/tutorials/industry-playbooks/ecommerce/launch-and-measure/#test-each-journey-before-you-launch-it) |
| Set delivery rules before you launch | They limit how often a shopper hears from you across all journeys. Learn more: [Set delivery rules before you message shoppers](/tutorials/industry-playbooks/ecommerce/prepare-for-communication/#set-delivery-rules-before-you-message-shoppers) |