> ## Documentation Index
> Fetch the complete documentation index at: https://help.the-meridian.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Testing a flow

A test run is a dry run of the saved flow: every step is traced and shown with what it would have done, and nothing is sent, written, metered or recorded, unless you explicitly ask for one email.

## Before you can test

The test runs the **saved** flow, so save first; testing is disabled while you have unsaved changes or an empty canvas. The same validation that gates activation gates testing, so you fix a broken flow before tracing it.

## Choosing what to test against

**Pick a store**: search the stores that installed your app by name or myshopify domain. The picker shows each store's status and plan, and warns when a store has no email on record, since send steps will trace as blocked.

**Or define a custom store**: a synthetic store with the attributes you set: subscription status, plan name, monthly and total revenue, total charges, whether there's an email on record, and the values of any custom fields your flow reads. No connected store needed, which makes it the way to probe one branch, or to test anything at all on a brand-new app.

If the trigger carries [variables](/automation-variables), the test asks for them too: a plan name, a charge name, an event quantity. Leave one empty to trace an event that didn't carry it, which is how you check an *is empty* branch.

## Reading the trace

Each step gets a badge saying what happened:

| Badge | Meaning |
| - | - |
| **Triggered** | The flow started from this trigger |
| `"actual" equals "expected"` | How a condition compared, and therefore which branch was taken |
| **Would send to …** | The recipient a send step resolved to: one address, a count, or the store's contacts |
| **Would post to #…** | The channel a [Send Slack message](/send-slack-message) step would post into |
| **Would set / would clear …** | The custom field write a populate step resolved to |
| **Blocked: no email on record** · **no recipients configured** · **email content not saved** · **email no longer exists** · **email delivery unavailable** | Why a send step couldn't have gone out |
| **Blocked: Slack not connected** | The app has no live Slack workspace connection, so the post couldn't have gone out. Connect one in [app settings](/app-settings) |
| **Skipped: store uninstalled** · **unsupported action** · **no custom field chosen** · **value does not fit the field type** | Why a step wouldn't have run |

Conditions are traced with the same semantics the engine uses, so the branch you see is the branch production takes.

## Sending one email for real

Optionally, pick an email step and give an address: while the test runs, **that step really sends**, to you. Leave the address empty and the whole run stays a trace. It's the way to check the rendered email, merge variables and all, without sending anything to a merchant.

## Replaying

**Replay** re-runs the trace against the same subject, so you can change a condition, save, and see the branch move.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.