---
title: "Customer triggers, step by step"
description: "Step-by-step Shopify Flow tutorials for customer tags, note, account state, marketing consent and the opt-in name, email, phone and address triggers."
canonical: "https://docs.workflow-trigger-extensions.app/customer-trigger-tutorials"
---

# Customer triggers, step by step

Eleven triggers for changes to a customer record. Seven of them work on data every store can use freely (tags, note, account state, marketing consent). Four read personal data - name, email, phone, address - and are opt-in on top of the permission.

**On this page:** [Customer Update](#customer-update), [Customer Tags Added](#customer-tags-added), [Customer Tags Removed](#customer-tags-removed), [Customer Note Changed](#customer-note-changed), [Customer State Changed](#customer-state-changed), [Customer Email Marketing Consent Changed](#customer-email-marketing-consent-changed), [Customer SMS Marketing Consent Changed](#customer-sms-marketing-consent-changed), [Customer Name Changed](#customer-name-changed), [Customer Email Changed](#customer-email-changed), [Customer Phone Changed](#customer-phone-changed), [Customer Address Changed](#customer-address-changed)

> [!TIP]
> **New to Shopify Flow?**
> Every example follows the same five moves: pick the trigger, add a condition, add an action, turn the workflow on, check Event History. [Your first workflow, step by step](https://docs.workflow-trigger-extensions.app/first-workflow-tutorial.md) shows each of them with screenshots.

![Shopify Flow's trigger picker inside Workflow Trigger Extensions, searched for Customer](https://cdn-dev.eu.codecreationlabs.cloud/crm-tool/uploads/SjJ78gKLnLlocopCui3Cs62dJbGZ7F1n/2108ef51eafad2a8.png)
*Where you find them: in Shopify Flow choose Select a trigger, open Workflow Trigger Extensions and search for "Customer".*

## Customer Update

Fires on every save of a customer record. It carries `changes`: the tracked fields that changed (tags, note, account state) with the value before and after.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- One workflow for several kinds of customer edits, branching on `changes.fields`.
- Sync every customer change to a CRM.

### What Customer Update sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `payload` | Text | JSON object containing the GID of the customer that was updated (e.g. {"id":"gid://shopify/Customer/123"}) |
| `changes` | Object | Which tracked fields changed (tags, note, account state), with the old and new value of each |
| `changes.fields` | List of text | Names of the tracked fields that changed |
| `changes.items` | List of objects | Old and new value per changed field |
| `changes.items (each).field` | Text | The field that changed: tags, note or state |
| `changes.items (each).oldValue` | Text | The value before the update. Long values are shortened |
| `changes.items (each).newValue` | Text | The value after the update. Long values are shortened |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Forward tracked customer changes to a CRM

1. Pick **Customer Update** as the trigger.
2. Add a **Condition**: `changes.fields` **Not empty and exists**.
3. Add **Send HTTP request** to your CRM with `{{customer.id}}` and a loop over `changes.items` (`field`, `oldValue`, `newValue`).
4. Turn the workflow on.

> [!NOTE]
> **Good to know**
> - Shopify updates a customer record on every order (order count, total spent), so this trigger is far busier than it looks. Narrow it with **Which changes fire this** on the Triggers page, or use the field triggers below.
> - Personal data never appears in `changes`. Name, email, phone and address have their own opt-in triggers.

## Customer Tags Added

Fires when at least one tag is added to a customer. `addedTags` holds only the new ones.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Start onboarding when staff or another app tags a customer `wholesale` or `vip`.
- React to tags written by loyalty, subscription or review apps.

### What Customer Tags Added sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose tags changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `addedTags` | Text | Comma-separated list of tags that were added to the customer |
| `removedTags` | Text | Comma-separated list of tags that were removed from the customer in the same update (may be empty) |
| `currentTags` | Text | Comma-separated list of all current tags on the customer |
| `previousTags` | Text | Comma-separated list of all previous tags on the customer before this update |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Welcome a new wholesale customer

1. Pick **Customer Tags Added** as the trigger.
2. Add a **Condition**: `addedTags` **Includes** `wholesale`.
3. Add **Send internal email** to the account manager with `{{customer.displayName}}`, or **Send HTTP request** to your email tool to start the welcome series.
4. Turn the workflow on.

> [!NOTE]
> **Good to know**
> **Includes** is a text search on a comma-separated list, so `vip` also matches `vip-gold`.

## Customer Tags Removed

Fires when at least one tag is removed from a customer. `removedTags` holds the ones that went away.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Revoke a benefit when a membership tag disappears.
- Notify the team when a subscription app removes its `active-subscriber` tag.

### What Customer Tags Removed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose tags changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `addedTags` | Text | Comma-separated list of tags that were added to the customer in the same update (may be empty) |
| `removedTags` | Text | Comma-separated list of tags that were removed from the customer |
| `currentTags` | Text | Comma-separated list of all current tags on the customer |
| `previousTags` | Text | Comma-separated list of all previous tags on the customer before this update |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Follow up when a subscriber tag is removed

1. Pick **Customer Tags Removed** as the trigger.
2. Add a **Condition**: `removedTags` **Includes** `active-subscriber`.
3. Add **Add customer tags** with `winback` and **Send internal email** to retention.
4. Turn the workflow on.

## Customer Note Changed

Fires when the note on a customer is added, changed or cleared.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Route notes written by support to the account owner.
- Parse a keyword from the note (`#callback`) and start a task.

### What Customer Note Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose note changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `oldNote` | Text | The previous note on the customer (empty if the note was not set before) |
| `newNote` | Text | The new note on the customer (empty if the note was cleared) |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Create a callback task from a note

1. Pick **Customer Note Changed** as the trigger.
2. Add a **Condition**: `newNote` **Includes** `#callback`.
3. Add **Send internal email** or a request to your task tool with `{{customer.displayName}}` and `{{newNote}}`.
4. Turn the workflow on.

> [!NOTE]
> **Good to know**
> A cleared note arrives as an empty `newNote`; a first note has an empty `oldNote`.

## Customer State Changed

Fires when the account state of a customer changes between `disabled`, `enabled`, `invited` and `declined`.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Greet customers when they activate their account.
- See who declined an account invitation.

### What Customer State Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose account state changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `oldState` | Text | The previous account state (disabled, enabled, invited, or declined) |
| `newState` | Text | The new account state (disabled, enabled, invited, or declined) |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Tag customers who activated their account

1. Pick **Customer State Changed** as the trigger.
2. Add a **Condition**: `newState` **Equal to** `enabled`.
3. Add **Add customer tags** with `account-active`.
4. Turn the workflow on.

> [!NOTE]
> **Good to know**
> This refers to classic customer accounts. Stores on new customer accounts see far fewer state changes, because there is no invite and activate step.

## Customer Email Marketing Consent Changed

Fires when a customer's **email** marketing consent changes. `consentState` is the new state: `subscribed`, `not_subscribed`, `pending`, `unsubscribed` or `redacted`.

| | |
| --- | --- |
| **Fires from** | Shopify webhook |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Keep an external email tool in step with Shopify, in both directions.
- Record unsubscribes for compliance.

### What Customer Email Marketing Consent Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose email marketing consent changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `consentState` | Text | The new email marketing consent state: subscribed, not_subscribed, pending, unsubscribed, or redacted |
| `optInLevel` | Text | The opt-in level: single_opt_in, confirmed_opt_in, or unknown (may be empty) |
| `consentUpdatedAt` | Text | ISO-8601 timestamp when the customer last updated this consent (may be empty) |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Remove unsubscribed customers from an external list

1. Pick **Customer Email Marketing Consent Changed** as the trigger.
2. Add a **Condition**: `consentState` **Equal to** `unsubscribed`.
3. Add **Send HTTP request** to your email tool's unsubscribe endpoint with `{{customer.id}}`.
4. Turn the workflow on.

> [!NOTE]
> **Good to know**
> - The event carries the customer as a reference and the consent values, not the email address. Read `customer.email` from the reference if your workflow needs it.
> - `optInLevel` tells single from confirmed (double) opt-in, which matters in some countries.

## Customer SMS Marketing Consent Changed

Fires when a customer's **SMS** marketing consent changes.

| | |
| --- | --- |
| **Fires from** | Shopify webhook |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Mirror SMS consent into an SMS provider.
- Stop SMS flows right after an opt-out.

### What Customer SMS Marketing Consent Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose SMS marketing consent changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `consentState` | Text | The new SMS marketing consent state: subscribed, not_subscribed, pending, unsubscribed, or redacted |
| `optInLevel` | Text | The opt-in level: single_opt_in, confirmed_opt_in, or unknown (may be empty) |
| `consentUpdatedAt` | Text | ISO-8601 timestamp when the customer last updated this consent (may be empty) |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Tag SMS subscribers

1. Pick **Customer SMS Marketing Consent Changed** as the trigger.
2. Add a **Condition**: `consentState` **Equal to** `subscribed`. Under **Then** add **Add customer tags** `sms-subscriber`.
3. Under **Otherwise** add **Remove customer tags** `sms-subscriber`.
4. Turn the workflow on.

## Customer Name Changed

Fires when the first or last name of a customer changes. It carries the **current** name.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Keep names in a CRM, an ERP or a loyalty tool current.

### What Customer Name Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose name changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `firstName` | Text | The customer's current first name |
| `lastName` | Text | The customer's current last name |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Push a changed name to the ERP

1. Pick **Customer Name Changed** as the trigger in Flow.
2. Add **Send HTTP request** with `{{customer.id}}`, `{{firstName}}` and `{{lastName}}`.
3. Turn the workflow on.

> [!NOTE]
> **Good to know**
> - This is an **opt-in, protected data** trigger. The values are encrypted at rest and decrypted only to hand them to your workflow. See [Permissions and data access](https://docs.workflow-trigger-extensions.app/permissions-and-data-access.md).
> - There is no old value on the four personal-data triggers, on purpose: the app keeps a fingerprint of the previous value to detect the change, not the value itself.

## Customer Email Changed

Fires when the email address of a customer changes. It carries the current address.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Update the address in tools that key on email.
- Send a security notice about the change.

### What Customer Email Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose email changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `email` | Text | The customer's current default email address |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Notify support about an email change

1. Pick **Customer Email Changed** in Flow.
2. Add **Send internal email** to support with `{{customer.displayName}}` and the admin link. Think twice before putting `{{email}}` into a channel many people read.
3. Turn the workflow on.

> [!NOTE]
> **Good to know**
> This is an **opt-in, protected data** trigger. The values are encrypted at rest and decrypted only to hand them to your workflow. See [Permissions and data access](https://docs.workflow-trigger-extensions.app/permissions-and-data-access.md).

## Customer Phone Changed

Fires when the phone number of a customer changes. It carries the current number.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Keep an SMS or telephony tool current.

### What Customer Phone Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose phone number changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `phone` | Text | The customer's current default phone number |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Sync a new phone number to the SMS provider

1. Pick **Customer Phone Changed** in Flow.
2. Add **Send HTTP request** to the provider with `{{customer.id}}` and `{{phone}}`.
3. Turn the workflow on.

> [!NOTE]
> **Good to know**
> This is an **opt-in, protected data** trigger. The values are encrypted at rest and decrypted only to hand them to your workflow. See [Permissions and data access](https://docs.workflow-trigger-extensions.app/permissions-and-data-access.md).

## Customer Address Changed

Fires when the **default** address of a customer changes. `address` is one formatted line, `addressDetails` the same address in separate fields.

| | |
| --- | --- |
| **Fires from** | Shopify webhook plus change detection |
| **Permission** | **Customer Data Access** |
| **Switched on** | Turning on a Flow workflow that uses it switches it on. Its own switch is on the app's **Triggers** page |

**Use it for**

- Re-check tax or shipping zone assignments when a customer moves country.
- Update an ERP debtor record.

### What Customer Address Changed sends to your workflow

| Variable in Flow | Type | What it holds |
| --- | --- | --- |
| `customer` | Customer (Shopify) | The customer whose default address changed. A full Shopify customer, so all of its fields and Flow's own customer actions are available. |
| `address` | Text | The customer's current default address as a single formatted line (may be empty) |
| `addressDetails` | Object | The customer's current default address as structured fields (may be empty) |
| `addressDetails.firstName` | Text | First name on the address |
| `addressDetails.lastName` | Text | Last name on the address |
| `addressDetails.name` | Text | Full name, derived from firstName and lastName |
| `addressDetails.company` | Text | Company or organization name |
| `addressDetails.address1` | Text | First line - street address or PO box number |
| `addressDetails.address2` | Text | Second line - apartment, suite, or unit |
| `addressDetails.city` | Text | City, district, village, or town |
| `addressDetails.province` | Text | Region - province, state, or district |
| `addressDetails.provinceCode` | Text | Region code (for example ON) |
| `addressDetails.zip` | Text | ZIP or postal code |
| `addressDetails.country` | Text | Country name |
| `addressDetails.countryCode` | Text | Two-letter country code (for example US) |
| `addressDetails.phone` | Text | Phone number on the address |
| `eventId` | Text | The id of this event. Search for it in the app's Event History to see exactly what was sent. |

### Example: Flag customers who moved to another country

1. Pick **Customer Address Changed** in Flow.
2. Add a **Condition**: `addressDetails.countryCode` **Not equal to** `DE` (your home market).
3. Add **Add customer tags** with `international`.
4. Turn the workflow on.

> [!NOTE]
> **Good to know**
> - This is an **opt-in, protected data** trigger. The values are encrypted at rest and decrypted only to hand them to your workflow. See [Permissions and data access](https://docs.workflow-trigger-extensions.app/permissions-and-data-access.md).
> - Only the default address is watched. Adding a second address that is not made the default does not fire.

## Next steps

- [Complete trigger reference](https://docs.workflow-trigger-extensions.app/trigger-reference.md) - every trigger on one page.
- [Choosing the right trigger](https://docs.workflow-trigger-extensions.app/choosing-the-right-trigger.md) - which one fits your case.
- [Custom triggers](https://docs.workflow-trigger-extensions.app/custom-triggers.md) - when no built-in trigger fits, write your own.
- [Event history and troubleshooting](https://docs.workflow-trigger-extensions.app/event-history-and-troubleshooting.md) - see what fired and what it carried.
- [Trigger events on a record's admin page](https://docs.workflow-trigger-extensions.app/admin-blocks.md) - the latest events of one record, on its own page in the Shopify admin.
