---
title: "Ready-made Shopify actions - Workflow Suite"
description: "Tag, update, publish, cancel, fulfil and more with simple forms: the ready-made Shopify actions of Workflow Suite and the fields they take."
canonical: "https://docs.workflow-suite.app/shopify-actions"
---

# Ready-made Shopify actions

Ready-made actions change your store through a simple form: no GraphQL, no JSON. Each one asks for the resource and a few fields, and tells you which permission it needs.

## Add one

1. Press **+** and, in **Add a step**, select **Shopify**. The window **Add a Shopify action** opens, with the ready-made actions at the top. They carry the badge **Simple form**.
2. Or type what you want to do into **Search steps**, for example `add tags` or `cancel`.
3. Fill in the form. Every text field takes variables.

## The actions

**Tags and metafields**

| Action | What it does |
| --- | --- |
| Add product tags, Add order tags, Add customer tags | Adds one or more tags. Tags it already has are left alone |
| Remove product tags, Remove order tags, Remove customer tags | Removes tags. Tags it does not have are ignored |
| Set product metafield, Set order metafield, Set customer metafield | Creates or overwrites one metafield. For a variant, pass the variant's id to Set product metafield |
| Delete product metafield, Delete order metafield, Delete customer metafield | Deletes one metafield. Nothing happens when it does not exist |

**Products and inventory**

| Action | What it does |
| --- | --- |
| Set product status | Sets a product to active, draft or archived |
| Update product details | Changes title, vendor, product type or description. Fields left empty stay as they are |
| Publish product to a sales channel, Unpublish product from a sales channel | Makes a product available on one sales channel, or removes it |
| Update variant price | Sets the price and, optionally, the compare-at price of one variant |
| Adjust inventory quantity | Adds to or subtracts from the available quantity of an item at a location |
| Set inventory quantity | Sets the available quantity to an exact number |
| Add product to a collection, Remove product from a collection | For manual collections. Shopify processes this in the background |

**Orders and fulfillment**

| Action | What it does |
| --- | --- |
| Update order note | Replaces the note, or adds a line to the existing one |
| Cancel order | Cancels an order, optionally refunding the payment and restocking the items. This cannot be undone |
| Mark order as paid | Records the outstanding amount as paid |
| Archive order, Unarchive order | Closes or reopens an order |
| Complete draft order | Turns a draft order into an order |
| Send draft order invoice | Emails the invoice of a draft order to its customer |
| Hold fulfillment order, Release fulfillment order hold | Puts a fulfillment order on hold, or releases every hold on it |

**Customers and discounts**

| Action | What it does |
| --- | --- |
| Update customer note | Replaces the note, or adds a line |
| Send customer account invite | Emails the invitation to activate the account. Only for stores with classic customer accounts |
| Create discount code | Creates a code for a percentage or a fixed amount off the whole order. Use the code in a later step, for example in an email |

The messages to Slack, Discord and Teams and **Post JSON to a URL** are ready-made actions too. See [Slack, Discord and Teams messages](https://docs.workflow-suite.app/slack-discord-teams.md) and [HTTP request](https://docs.workflow-suite.app/http-request.md).

## The id field

Every action asks which resource to change: **Product id**, **Order id**, **Customer id** and so on. A GID or a plain numeric id both work. For the resource of the event, pick:

```liquid
{{ event.payload.admin_graphql_api_id }}
```

For a resource a query step found, pick its id from that step, for example `steps.variant.output.productVariants.nodes[0].id`.

## Tags field

**Tags** takes one tag, or several separated by commas. A variable works too: a list from an earlier step, or a value of the event such as the vendor.

> [!NOTE]
> **Permissions**
> An action that misses a permission shows **This action needs a permission** with a button to the Permissions page. Grant it once and every workflow can use it. See [Permissions and store data access](https://docs.workflow-suite.app/permissions-and-store-data-access.md).

## What happens when it runs

- In a **preview**, an action changes nothing. It lists the inputs it would have run with.
- Shopify can reject a change, for example a price that is not a number. The step then fails with Shopify's message, and the run ends as Failed.
- An action that could not be started for a temporary reason is tried again automatically. An action that ran and failed is not repeated. See [Automatic retries](https://docs.workflow-suite.app/automatic-retries.md).
- Later steps read what the action returned as `steps.<id>.output`. The variable picker lists the fields, for example the code of **Create discount code**.
- A change your workflow makes comes back from Shopify as an event. Loop protection recognises that echo. See [Loop protection](https://docs.workflow-suite.app/loop-protection.md).

## When there is no ready-made action

The same window lists every mutation of the Shopify Admin API below the ready-made actions. See [Every Shopify mutation and query](https://docs.workflow-suite.app/shopify-mutations-and-queries.md).
