---
title: "Shopify Flow triggers - Workflow Forms"
description: "The three Workflow Forms triggers in Shopify Flow - Form submitted, Form submission rejected and Form submission status changed - with their variables."
canonical: "https://docs.workflow-forms.app/shopify-flow-triggers"
---

# Shopify Flow triggers

Workflow Forms adds three triggers to Shopify Flow. Build a workflow on one of them to email your team, tag a customer, create a task or send the data to another system.

| Trigger | Starts when |
| --- | --- |
| **Form submitted** | A visitor submits a form on your store and the submission is stored |
| **Form submission rejected** | A submission is refused (invalid, spam, too many attempts, plan limit) |
| **Form submission status changed** | A submission is marked read, archived or new again in the inbox |

## Set up a workflow

1. Open **Shopify Flow** (the app's **Help** page has a shortcut, or an install link if Flow is not on your store yet).
2. Create a workflow and choose **Form submitted** under Workflow Forms as the trigger.
3. Add a condition on **Form handle** if the workflow is for one form only. The trigger starts for every form.
4. Add your actions and turn the workflow on.

## Form submitted

| Variable | What it holds |
| --- | --- |
| **Form handle** | The handle of the form, for example `contact` |
| **Form title** | The form's title |
| **Submission ID** | Workflow Forms' id of this submission |
| **Email** | The value of the form's first email field (empty when the form has none) |
| **Customer ID** | The id of the logged-in customer, empty for a guest |
| **Locale** | The storefront language the form was filled in, for example `de` |
| **Marketing consent** | True when the visitor checked a consent box marked as email marketing consent |
| **Data** | All submitted values as JSON, keyed by field handle |

### Reading a value from Data

**Data** is one JSON text with every value under its field's handle:

```json
{ "name": "Alex", "email": "alex@example.com", "message": "Hello", "newsletter": true }
```

A Checkbox or Consent checkbox is `true` or `false`, Checkboxes is a list, everything else is text. Fields hidden by a condition are not in it.

To use a single value in a later step, read it with Flow's **Run code** action or with the `json` filter in a Liquid text field. This is why field handles never change: your workflows depend on them.

### Good to know

- **Customer ID** is text, not a customer object, because most visitors are guests. To work with the customer, look them up by the id or by **Email** in a later step.
- **Marketing consent** only tells your workflow what the visitor checked. Workflow Forms does not subscribe anyone itself; do that in the workflow.
- There is no built-in email notification per submission. A workflow with **Form submitted** and a send-email action is the way to get one.
- Shopify Flow refuses a trigger payload of 50,000 bytes or more. Such a submission is stored and shown as **Not sent to Flow**.
- If Flow does not accept a submission, nothing is lost: it stays in your inbox and can be sent again. See [The submissions inbox](https://docs.workflow-forms.app/submissions-inbox.md).

## Form submission rejected

Starts when a submission is refused and therefore not stored.

| Variable | What it holds |
| --- | --- |
| **Form handle** | The handle of the form |
| **Reason** | `validation`, `spam`, `rate_limit` or `quota` |
| **Details** | What was wrong, without the submitted values: field errors as JSON, or the spam check that matched |
| **Locale** | The storefront language, for example `de` |

| Reason | Meaning |
| --- | --- |
| `validation` | A value was invalid or missing, or the email domain is blocked |
| `spam` | A spam check matched. See [Spam protection](https://docs.workflow-forms.app/spam-protection.md) |
| `rate_limit` | Too many submissions from one visitor in a short time |
| `quota` | Your plan's submissions are used up. See [Plans and pricing](https://docs.workflow-forms.app/plans-and-pricing.md) |

The trigger is throttled: it starts at most once per form and reason every 5 minutes, so a wave of spam does not start hundreds of workflow runs. It is a signal that something is happening, not a count. **Details** never carries a submitted value.

A typical use: notify yourself when the reason is `quota`, so you can act before more submissions are refused.

## Form submission status changed

Starts when a submission's inbox status changes, from its page or with a bulk action.

| Variable | What it holds |
| --- | --- |
| **Form handle** | The handle of the form |
| **Submission ID** | The submission that changed |
| **Status** | `NEW`, `READ` or `ARCHIVED` |
| **Previous status** | The status before the change |

A typical use: when a return request is archived, tag the customer or post to your team chat.

## Testing

Send your form once on your storefront (the editor's **Test like a visitor** mode sends nothing). Then check the workflow's run in Shopify Flow, or use **Send to Flow again** on an existing submission to repeat the trigger without filling the form in again.

## Next steps

- [The submissions inbox](https://docs.workflow-forms.app/submissions-inbox.md) - statuses and sending again.
- [Fields and the field library](https://docs.workflow-forms.app/fields-and-the-field-library.md) - handles and marketing consent.
- [Save submissions as metaobjects](https://docs.workflow-forms.app/save-submissions-as-metaobjects.md) - use submissions elsewhere in Shopify.
