Builder actions
After the trigger, a workflow is a sequence of actions. They live in the library that opens when you click the + on a canvas node, split into tabs. Clicking an action already on the canvas opens its settings in the side panel.
Only the actions of the integrations enabled under Joinotify → Settings → Integrations show up — the Telegram one, for example, only exists with the Telegram integration switched on.
WhatsApp messages
Every WhatsApp action asks for the sender (one of the account's numbers) and the
recipient, which takes a phone number or a placeholder such as {{ wc_billing_phone }}.
| Action | What it sends |
|---|---|
| WhatsApp: Text message | Text with formatting, emoji and placeholders |
| WhatsApp: Media message | An image, video, audio or document, with a caption |
| WhatsApp: Template message | A Meta-approved template — the only kind that starts a conversation |
| WhatsApp: Reply buttons | Text with up to three quick reply buttons |
| WhatsApp: Option list | A menu with sections and options |
| WhatsApp: Link button | Text with a button that opens a URL |
| WhatsApp: Location | A point on the map, with a name and address |
| WhatsApp: Contact card | A contact card the customer can save |
| WhatsApp: Sticker | A sticker |
| WhatsApp: Reaction | An emoji in reply to a message |
The 24-hour window
Free-form text, media and interactive messages only reach someone who wrote to the number in the last 24 hours. Outside that, only the Template message is delivered. The builder warns on the steps that depend on the window, and the WhatsApp 24-hour window condition lets the workflow choose on its own. The full concept is in The 24-hour window.
Template message
The action lists the account's approved templates, with language, category and a preview, and asks for a value for each template variable — fixed text or a trigger placeholder. Since 2.6.0 it covers everything Meta offers in a template:
- Image, video or document header — the file comes from a link, a placeholder or the media library. The action will not save without it, because Meta refuses the send. A document goes out with its file name.
- Location header — latitude and longitude, with an optional name and address.
- URL button — the variable completes only what comes after the button's fixed address. For a
link to your own site, use the
remove_home_urlmodifier or{{ wc_first_product_review_path }}— see Modifiers. - Copy-code button of a marketing template, filled with the coupon you provide.
- Code button of an authentication template, which repeats the code from the body when left empty.
- Limited-time offer — the expiration takes a date, a timestamp or a relative time such as
+2 days. - Carousel — each card asks for its own header file, variables and buttons.
The variable values go out on a single line, as WhatsApp requires: line breaks become commas and HTML markup is removed, so a multi-line address or a WooCommerce price does not get the template refused by Meta.
Workflow control
| Action | What it does |
|---|---|
| Delay | Pauses the workflow for an interval (seconds to years) or until a fixed date and time |
| Condition | Splits the workflow into two paths, true and false |
| Loop | Repeats the body actions once for each item of a collection |
| Stop automation | Ends the workflow at that point |
Delays depend on WP-Cron — see Minimum requirements.
Condition
The available conditions depend on the trigger: order status and total, purchased products, payment and shipping method, user role and metadata, form fields and whatever else the trigger registers.
WhatsApp 24-hour window
Offered on every trigger since 2.6.0. At the moment the workflow reaches it, it asks the platform whether a recipient's window is open, closed or unknown (when the platform could not be asked). It takes the recipient — a phone number or a placeholder — and the sender number whose window is read.
The typical use is to send free-form text on the "open" path and an approved template on the other:
graph LR;
A["Order completed"] --> B{"Window open?"};
B -- "yes" --> C["Text message"];
B -- "no" --> D["Template message"];
Loop
Walks a collection — the order's digital files, the purchased items — and runs the body actions
once per item, with the {{ loop_* }} placeholders described in
Placeholders.
Integrations with other systems
| Action | What it does |
|---|---|
| Send webhook | Sends the trigger's data, or a JSON of your own, to a URL — n8n, Zapier, Make, an ERP |
| HTTP request | Calls any public API and keeps the response for the next actions |
Both are described in Webhooks and HTTP requests.
Contacts
In the library's Contacts tab, since 2.5.0:
| Action | What it does |
|---|---|
| Save contact | Creates or updates the contact on your Joinotify account: name, e-mail, tags, fields and consent |
| Tag contact | Adds and removes tags on a contact |
They need the Joinotify Cloud sync switched on and go through its queue, so the workflow never waits on Joinotify and a failure is retried. Neither of them starts a Joinotify Cloud flow.
The contact is the trigger's customer or user only when the phone or e-mail typed in the action is theirs; anyone else becomes a separate lead. Marketing consent should only be ticked when the trigger means the person agreed — a form with a consent checkbox, for example — and it goes out with the evidence of where and when.
WooCommerce
| Action | What it does |
|---|---|
| Discount coupon | Creates a WooCommerce coupon, whose data is available in the {{ joinotify_coupon_* }} placeholders |
Artificial intelligence
| Action | What it does |
|---|---|
| WhatsApp: AI message | Writes the message with the AI model from an instruction of yours |
| AI: Smart variable | Generates a text the following actions use as {{ ai:NAME }} |
AI goes through the WordPress AI Client: the provider and its credentials are set up once under Settings → Connectors, in WordPress itself, and Joinotify uses whatever is there. The plugin has not stored an OpenAI or Anthropic key since 2.3.1.
The builder also generates a whole workflow from a text description. That generator never uses the HTTP request action.
Other channels
| Action | What it sends |
|---|---|
| Telegram: message | A text message through a Telegram bot |
| Send e-mail (Resend) | An e-mail with attachments via Resend |
Both need the integration enabled and the service's credential under Settings → Integrations.
Removed actions
| Action | Removed in | Why |
|---|---|---|
| Group actions | 2.3.0 | The official WhatsApp API does not send to groups |
| PHP Snippet | 2.3.1 | It relied on eval(). Steps already saved with it no longer run |
Test before activating
The builder sends the workflow to a test number, set in the builder itself. When WhatsApp refuses the send, the notice shows the reason Meta gave — closed window, refused template, invalid number — instead of a generic error.
Your own action
Any plugin can register an action, with its settings form, with PHP alone — see Developer resources.