# Launch and measure

Test every journey on your own phone before real players get its messages, then check whether it works.

## Test each journey before you launch it

A journey has no test mode, so once it is running, real players who match its entry get its messages. Testing on your own phone first catches a missing event, an empty segment, or a wrong message before players see it.

Run through this list for each journey:

1. Install the version of your game that includes the Pushwoosh SDK on your phone, and log in with a test account. If you do not have one, ask your developers for a test version. The phone must register in the application where the journey runs. To send test messages from presets, also register it as a [test device](/product/first-steps/start-with-your-project/test-your-integration/test-devices/).
2. Play the game and do what the journey needs, for example complete a level. Then open **Audience** → **User Explorer**, find the test device, and check **Events history**. The events must be there with the expected attributes, or the segment and the journey do not see them.
3. If the journey starts from a segment, open it in **Audience** → **Segments** and refresh its size to see whether it counts any players.
4. Launch the journey for your test players only. Build a test segment from your test User IDs with the **User ID** filter. If the journey starts from a segment, use the test segment as its entry. See [How to test a journey with a test segment](/product/first-steps/start-with-your-project/test-your-integration/#how-to-test-a-journey-with-a-test-segment).

   <Aside type="caution" title="Important: journeys that start on an event">
   If the journey starts on an event (a [Trigger-based entry](/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/)), every player who triggers the event enters it, including real players, and the entry has no segment filter. To keep real players out of the messages, use one of these:

   * Right after the entry, add a [Condition split](/product/customer-journey/journey-elements/flow-controls/segment-split/) on your test segment and leave its **All other users** branch empty. Real players enter but leave the journey at once without messages, and they count in its entries. Remove the split before the real launch.
   * [Clone the journey to a test application](/product/customer-journey/journey-settings/#clone) and run it there with a phone that is registered in that application. Events the test application lacks are created there, but check the segments and the content of the clone.
   </Aside>

5. Start the journey on the test phone: do the action that the entry waits for. Check that the message arrives, and follow the test player with [Find user path](/product/statistics-and-analytics/journey-statistics/analyze-user-path/).
6. After a day, check how many players entered the journey. See [Read the journey statistics](#read-the-journey-statistics).

## Read the journey statistics

Journey statistics show whether players enter a journey, get its messages, and reach its goal. To see them:

1. Open the journey on the canvas. The statistics panel on the left shows the whole journey.
2. For numbers on each element, open Canvas settings (the gear icon in the bottom-right corner) and turn on **Show metrics**. See [Journey element statistics](/product/statistics-and-analytics/journey-statistics/journey-element-statistics/).

For what each metric means, see [Overall journey statistics](/product/statistics-and-analytics/journey-statistics/overall-journey-statistics/).

In the first week after launch, look for these signals:

| If you see | It usually means | What to do |
| --- | --- | --- |
| No entrances | The entry segment is empty or the entry event does not arrive | Repeat steps 2 and 3 of [Test each journey before you launch it](#test-each-journey-before-you-launch-it) |
| Far fewer messages sent than entrances | Many players can't get push, or frequency capping and the silence period hold messages back | Check **Frequency capping** in **Communications**, add an in-app or email branch after a [Reachability check](/product/customer-journey/journey-elements/flow-controls/reachability-check/), and check your [delivery rules](/tutorials/industry-playbooks/mobile-games/prepare-for-communication/#set-delivery-rules-before-you-message-players) |
| Many drop-offs | Players left the journey because of a problem, such as a device that was not found or an invalid push preset | Expand the **Drop-offs** block on the element to see the reasons |
| Messages are opened, but few players reach the goal | The message works, but the offer or the moment does not | Test another text or offer with an [A/B/n split](/product/customer-journey/journey-elements/flow-controls/abn-split/) |

<Aside type="tip" title="Journey does not behave as expected?">
If a journey does not behave as expected, follow one player through it with [Find user path](/product/statistics-and-analytics/journey-statistics/analyze-user-path/), and look up why players leave a journey or skip a message in [Drop-off and skip reasons](/product/troubleshooting/drop-offs-in-customer-journey/).
</Aside>

Journey statistics count goal conversions, not revenue. To compare revenue, use [Conversion events](/product/audience-data-and-segmentation/events/conversion-events/).

## Measure results

To measure whether a journey changes player behavior, use the three tools below, from simplest to strongest.

* **Conversion goals:** every journey in this playbook has one. The goal can be reached within the period you set, up to 30 days after the player leaves the journey. See [Conversion goals](/product/customer-journey/journey-settings/#conversion-goals).
* **Holdout Split:** hold back 1% to 20% of the players who reach a [Holdout Split](/product/customer-journey/journey-elements/flow-controls/holdout-split/) element and compare their goal rate with everyone else. The **Goal uplift vs holdout** report updates once a day.

  <Aside type="tip" title="Where to place a Holdout Split">
  * Put it right after the entry, before any message. Connect only the **In journey** branch and leave **Holdout** empty: held-out players leave the journey there and get nothing.
  * The journey needs a goal, because the report compares goal rates between the two groups.
  * To measure one part of a journey, put another Holdout Split in front of that part.
  </Aside>

* **Control group:** by default, holds out a share of the players from all marketing messages in the application, so you can measure the combined effect of your messaging. Set it up before you launch. See [Set up a control group before you launch](/tutorials/industry-playbooks/mobile-games/prepare-for-communication/#set-up-a-control-group-before-you-launch). To read the results, see [Analyze control group impact](/product/audience-data-and-segmentation/control-groups/analyze-control-group-impact/).
## Common pitfalls

These are the mistakes that most often leave a segment empty or a journey silent in a mobile game. Check them before you launch a journey.

| Pitfall | What happens | What to do |
| --- | --- | --- |
| A guest who plays on two devices | Until the player logs in, each device has its own User ID, so one player counts as two | [Identify players by User ID](/tutorials/industry-playbooks/mobile-games/collect-player-data/#identify-players-by-user-id) |
| iOS push permission prompt | iOS shows it only once, so a player who declines on the first launch can't be asked again | [Ask for push permission at the right moment](/tutorials/industry-playbooks/mobile-games/prepare-for-communication/#ask-for-push-permission-at-the-right-moment) |
| Repeating events such as `Level completed` | They fire many times a day and start the journey again and again | Set a campaign entry limit. See [Best practices for every journey](/tutorials/industry-playbooks/mobile-games/build-the-journeys/#best-practices-for-every-journey) |
| `PW_ApplicationOpen` | It fires each time the game comes to the foreground, not only on cold launches, so open counts run higher than sessions | [Segments by events](/tutorials/industry-playbooks/mobile-games/build-the-segments/#segments-by-events) |
| Purchases | On iOS, only products configured in App Store Connect are tracked, and on Android the game sends purchases from code | [Default events](/tutorials/industry-playbooks/mobile-games/collect-player-data/#default-events) |
| Store subscriptions | Without `appAccountToken` on iOS or `getSubscriptionAccountId()` on Android, subscription events are not recorded | [Track subscriptions from the stores](/tutorials/industry-playbooks/mobile-games/collect-player-data/#track-subscriptions-from-the-stores) |
| The Unity plugin | It has no Message Inbox, so a Unity game can't show App Inbox messages | Use push or in-app instead. See [Live event and VIP announcements](/tutorials/industry-playbooks/mobile-games/build-the-journeys/loyalty-and-win-back/#live-event-and-vip-announcements) |