---
title: "Triggers: every way a flow can start"
description: Every trigger a flow can start from (contact, list, email, date, manual, WordPress, forms, webhook, shops) with its settings.
url: "https://hiveplugins.com/docs/hive-mail-triggers/"
updated: "2026-10-28"
category: Hive Mail
---

# Triggers: every way a flow can start

A trigger is the first card of a flow. To choose one, select the trigger card (or click a button on **What starts this flow?**) and open **What starts the flow** in the right panel. A setting marked "(any when empty)" accepts every event when blank. Changing the trigger clears its settings.

A flow reacts only to events that happen while it is **On**. To bring in existing people, see [Re-entry, existing contacts, and editing a live flow](/docs/hive-mail-re-entry-existing-contacts-and-editing-live-flows/). Form and shop triggers appear only while that plugin is active on your site.

![The What starts this flow? card on a new flow, with one button per trigger and its group underneath](https://hiveplugins.com/wp-content/uploads/2026/10/hivemail-automation-trigger-dropdown-01.webp)

## Contact, list, email, date and manual

| Trigger | Starts when | Settings (default) |
| --- | --- | --- |
| **Contact is created** | A contact is created by any route. | **Only from this source (optional)**: must match exactly, for example `form`, `import`, `api`, `admin`. |
| **Contact subscribes** | A contact becomes subscribed (created subscribed, confirmed or re-subscribed). | None. |
| **Status changes** | A contact's status changes. | **To (any when empty)**: Subscribed, Pending, Unsubscribed, Transactional, Bounced or Complained. |
| **A field changes** | A custom field's value changes. | **Field (any when empty)**. |
| **Tag is added** / **Tag is removed** | A tag is added or removed. | **Tag (any when empty)**. |
| **Joins a list** / **Leaves a list** | A contact is added to or removed from a list. | **List (any when empty)**. |
| **Opens an email** | A person opens an email (scanners and Apple Mail privacy loads are ignored). | **Campaign (any when empty)**. "Any campaign" also counts your flows' own emails. |
| **Clicks a link in an email** | A person clicks a link (clicks in the first 3 seconds are ignored). | **Campaign (any when empty)**. |
| **Unsubscribes** | A person unsubscribes. | None. |
| **A date in a field comes round** | Every year on the day a date field falls. | **Date field** (required, date-type fields only); **Days after the date (negative = before)**, -365 to 365 (empty means 0); **At**, time of day in the site's timezone (empty means 09:00). |
| **Added by hand (or from a segment)** | Only when someone adds the person. | None. |

- The date trigger is checked hourly and counts month and day only.
- **Added by hand**: use **Add people…** on the Flows list, **Add to a flow** on a contact's profile, or the API. The flow must be On.
- For a welcome series use **Contact subscribes**, not **Contact is created** (a contact can stay pending).

![The date trigger with its Date field, Days after the date and At settings](https://hiveplugins.com/wp-content/uploads/2026/10/hivemail-automation-trigger-date-02.webp)

## WordPress

| Trigger | Starts when | Settings |
| --- | --- | --- |
| **WordPress: a user registers** | A user account is created. | **Role** (Any role), **Subscribe new contacts** (off) |
| **WordPress: a user logs in** | Someone logs in. | **Role**, **Subscribe new contacts** |
| **WordPress: a user gets a role** | A role is set or added. | **The new role**, **Subscribe new contacts** |
| **WordPress: a post is published** | A post changes to published (revisions, autosaves and attachments ignored). | **Post type** (Post), **Category** (Any category), **Tell the people on this list (everyone subscribed when empty)** |

- Tick **Subscribe new contacts** only if your registration form already asked permission to email. Otherwise people stay pending and marketing emails skip them. An existing contact's status is never changed.
- The login trigger starts at most once per person per day under "Once per thing"; choose "Every time" to start at each login.
- The post trigger is not about one person: everyone on the list is added as a background job, one run each. In its emails you can type `{{post_title}}`, `{{post_url}}`, `{{post_excerpt}}`, `{{post_id}}` and `{{post_type}}` (they are not in the merge-tag menu).

## Form plugins

Fluent Forms, WPForms, Contact Form 7 (after its mail is sent), Gravity Forms and Elementor forms each have a trigger, "{plugin}: a form is submitted". For a guided set-up use [Connect a form you already use](/docs/hive-mail-connect-a-form-you-already-use/). These settings are shared with the incoming webhook:

| Setting | What it does (default) |
| --- | --- |
| **Form (any form when empty)** | The form's ID, as the form plugin shows it. |
| **Email field** | The field holding the address. Empty means Hive Mail finds it (automatic). |
| **Keep these on the contact** | Up to 20 rows mapping a field name to First name, Last name, Phone, Company, Country (2 letters) or a custom field. First and last name are found automatically. |
| **Permission to email** | "Subscribe when a consent box is ticked" (default), "The form itself asks for permission: subscribe everyone who sends it", or "Do not subscribe anyone: keep them pending". |
| **Consent box field** | The checkbox that proves consent. Required for the first rule. |
| **Ask pending contacts to confirm by email (double opt-in)** | Follows **Settings > Compliance** by default. |
| **Add them to this list (optional)** / **Give them this tag (optional)** | List to join, tag to add. |
| **When they are already a contact** | "Fill in only the details they have not got yet" (default) or "Update their details with what they just sent". |

Nobody who unsubscribed, bounced or complained is subscribed again by a form, and nobody on the do-not-email list is added. A submission without a usable email is ignored. Passwords, tokens and card-like fields are never kept. `{{form_id}}` and `{{form_title}}` work in the emails.

## Incoming webhook

**Webhooks > An incoming webhook arrives** starts a flow when another tool (Zapier, Make, a checkout, a form service) posts to the flow's own address. The flow must be **On**. The **Address and secret** panel shows the **Address (send a POST here)**, the **Secret (to sign requests)**, **Show an example request** (a ready `curl`) and the contact settings above.

- **New address and secret** replaces both at once. The old address stops working immediately.
- **Refuse requests that are not signed** (off): sign the body with HMAC-SHA256 and send `X-HiveMail-Signature: sha256=<signature>`.
- Post JSON such as `{"email":"jane@example.com","first_name":"Jane"}`. The reply is `ok: true` with `status: enrolled` or `not_enrolled`. A wrong address answers 404. Limits: 64 KB body, 300 requests a minute per flow, the same body for the same person within an hour is ignored.

Full contract: [Webhooks and API keys](/docs/hive-mail-webhooks-and-api-keys/).

## WooCommerce

| Trigger | Starts when |
| --- | --- |
| **WooCommerce: an order is placed** | A customer places an order, paid or not. |
| **WooCommerce: an order is processing** | An order is paid and waiting to be fulfilled. |
| **WooCommerce: an order is completed** | An order is completed. |
| **WooCommerce: an order is refunded** | An order becomes fully refunded. |
| **WooCommerce: an order is cancelled** | An order is cancelled. |
| **WooCommerce: a customer's first order** | A customer's first order is paid. |
| **WooCommerce: a product or category is bought** | A paid order contains this product (or variation) or a category item. Fill in **Product (any when empty)** or **Category (any when empty)**; with both empty the flow shows "Choose the product or the category this flow is about." and cannot be switched on. |
| **WooCommerce: a customer account is created** | Someone creates an account. No settings. |
| **WooCommerce: a cart is abandoned** | A cart with an email sees no order for the waiting time. Setting: **Only carts worth at least (0 = any)**. See [Abandoned cart recovery](/docs/hive-mail-abandoned-cart-recovery/). |
| **WooCommerce: an order is still waiting for payment** | An order is pending payment or failed and still unpaid after the waiting time. |

The order triggers (all but the account and cart ones) share **Only orders of at least (0 = any)**, in the shop's currency, and **Add buyers who are not contacts yet** (on). Those buyers become transactional contacts: they get the flow's transactional emails, never marketing. In emails use `{{order_number}}`, `{{order_total}}` and `{{order_date}}`.

The payment-waiting trigger has **Minutes to wait before reminding** (5 to 720, default 30). Anyone who pays meanwhile is never emailed; one reminder goes out per order and flow, as a transactional email. Use `{{order_pay_url}}` for the pay link.

## Easy Digital Downloads

| Trigger | Starts when | Extra setting |
| --- | --- | --- |
| **Easy Digital Downloads: a purchase is complete** | A purchase is marked complete. | None |
| **Easy Digital Downloads: a customer's first purchase** | A customer's first purchase is complete. | None |
| **Easy Digital Downloads: a purchase is refunded** | A purchase is refunded. | **Only when the whole purchase is refunded** (on) |
| **Easy Digital Downloads: a download is bought** | A complete purchase has this download or category item. | **Download (any when empty)** or **Download category (any when empty)**; fill in one |

All four have **Only purchases of at least (0 = any)** and **Add buyers who are not contacts yet**. A free download counts as a purchase of 0; enter 1 to leave those out. `{{download_name}}` also works in emails. EDD has no abandoned-cart triggers.

![The settings of the WooCommerce trigger for an order that is still waiting for payment](https://hiveplugins.com/wp-content/uploads/2026/10/hivemail-automation-trigger-woo-05.webp)

## What "Once per thing" means

For the flow's **Who can enter again** setting, see [Re-entry, existing contacts, and editing a live flow](/docs/hive-mail-re-entry-existing-contacts-and-editing-live-flows/). "Once per thing" means once per tag, list, email message, form submission, post, or order or cart. For Status changes, Tag is removed, Leaves a list, A field changes, Unsubscribes and role changes every event is new.

> **Warning:** Do not use **Change status** to subscribe people who never asked for email.

Next: [Steps](/docs/hive-mail-steps/), [Automation integrations](/docs/hive-mail-automation-integrations/).
