WordPress Plugin
The FlowAlert plugin connects your WordPress site to FlowAlert — no custom code required. It covers six families of integration:
- WordPress itself — fatal errors (recovery mode), failed auto-updates, administrator logins, plugin & theme changes, new user registrations. No third-party plugin needed.
- Site heartbeat — the plugin checks in with FlowAlert every 10 minutes; if your site goes silent, FlowAlert pages whoever is on call.
- Forms — Contact Form 7, WPForms, Forminator, SureForms, Ninja Forms, Fluent Forms, Gravity Forms, Elementor Pro Forms, Formidable Forms, Divi, and Jetpack Forms.
- eCommerce — WooCommerce (orders, status changes, refunds, subscriptions, low/out-of-stock, failed payments) and Easy Digital Downloads.
- Bookings — Amelia, FluentBooking, LatePoint, MotoPress Hotel Booking, and Five Star Restaurant Reservations.
- Support & donations — Fluent Support and GiveWP.
Each integration is detected automatically — a detected / not detected badge appears next to its name — and each is off until you enable it.
Booking plugins that don't expose WordPress hooks (Bookly, Booknetic, BookingPress, and similar) can't be driven by this plugin. Connect those through the plugin's own webhook, the REST API, or Zapier — see Webhooks & Automation.
Installation
- In your WordPress admin go to Plugins → Add New and search for FlowAlert
- Click Install Now then Activate
Alternatively, download the zip from wordpress.org/plugins/flowalert (opens in a new tab) and install via Plugins → Add New → Upload Plugin.
Connect your API key
Go to Settings → FlowAlert:
| Field | What to enter |
|---|---|
| API Key | Your FlowAlert API key — find it in Setup → API Keys in your FlowAlert dashboard |
| API URL | Leave as https://api.flowalert.io/v1 (only change this if self-hosting) |
Click Save Settings.
The integrations section is locked until you enter an API key. Once you paste your key, all integrations become configurable.
Verify the connection
Click Send test alert. You can test before saving — the button uses the key currently in the field, not the last saved value.
If you see "✓ Test event sent!", the connection is working. Check Dashboard → Alerts to confirm the event arrived.
The test button sends a flowalert.test event. Because flowalert.* is a reserved prefix, this event will not trigger any routing rules — it is only used to confirm the connection. You still need to set up routing rules for the events your integrations actually send.
WordPress site events
The 🖥️ Site health → WordPress card needs no third-party plugin — it alerts on the operational events WordPress itself emits. Each toggle is off by default:
| Event key | Trigger | Notes |
|---|---|---|
site.fatal_error | The site hit a fatal error and entered recovery mode | Always sent as URGENT with acknowledgement required. The recovery link stays in the admin email — it is never sent through FlowAlert |
site.update_failed | A WordPress auto-update (core, plugin, or theme) failed | One aggregated alert per day |
admin.login | A user with manage_options signs in | Includes the IP; deduped to one alert per admin per hour |
plugin.activated / plugin.deactivated / theme.switched | A plugin is switched on/off or the theme changes | Records who did it — an unexpected one is a compromise signal |
user.registered | A new user account is created | Includes role and email |
All five share one Priority setting (fatal errors override it to URGENT).
Site heartbeat
Under ⚙️ General → Site Heartbeat, the plugin pings a FlowAlert heartbeat monitor every 10 minutes via WP-Cron. If the site stops checking in — host outage, fatal crash, suspended account, broken cron — the silence pages whoever is on call.
Setup is one checkbox (plugin 1.2.0+): tick Enable heartbeat and save. Using your API key, the plugin asks FlowAlert to create this site's monitor (30-minute interval, 15-minute grace) and fills the check-in URL in automatically. Enabling it on the same site again reuses the same monitor — nothing is duplicated.
Prefer manual control? Create a monitor yourself under Heartbeats → New (interval 30–60 minutes) and paste its check-in URL into the field — a pasted URL always wins over auto-setup.
WP-Cron only runs when the site receives traffic — so what about a perfectly healthy site with a quiet night? Before paging anyone, FlowAlert probes the site over HTTP: if it still answers, the silence is treated as missing traffic, not downtime, and the alert is held (it only escalates if the site stays silent for hours while serving — the sign of broken cron or PHP behind a cache). If the probe fails too, you're paged immediately with both facts. Quiet sites no longer need oversized intervals to avoid false alarms.
For traffic-independent monitoring, also flip on the Uptime check on the site's card (Dashboard → Sites): FlowAlert visits your site from the outside every few minutes and fires site.down after three consecutive failures — no plugin, cron or traffic involved. The two signals complement each other.
The heartbeat authenticates by its unguessable URL token, so it works even before an API key is entered.
Forms
The plugin integrates with eleven form plugins, each detected automatically:
| Plugin | Detected by |
|---|---|
| Contact Form 7 | WPCF7 class |
| WPForms | WPForms class |
| Forminator | Forminator_Form_Model class |
| SureForms | SRFM\Plugin_Loader class |
| Ninja Forms | Ninja_Forms class |
| Fluent Forms | FluentForm\App\Models\Form class |
| Gravity Forms | GFForms class |
| Elementor Pro Forms | ElementorPro\Plugin class |
| Formidable Forms | FrmEntry class |
| Divi (theme or Divi Builder) | ET_BUILDER_VERSION constant |
| Jetpack Forms | JETPACK__VERSION constant |
Configuring a form integration
Every form integration has the same options:
| Setting | Default | Description |
|---|---|---|
| Enable | Off | Must be checked to send alerts |
| Event key | form.submitted | The event key sent to FlowAlert. You define this — it must match the key on your routing rule |
| Priority | Normal | LOW / NORMAL / HIGH / URGENT |
| Body field key | (blank) | The form field whose value appears in the push notification body. Leave blank to auto-summarise the first few fields |
| Require acknowledgement | Off | Staff must tap Acknowledge in the app for each submission (Pro feature) |
Contact Form 7 has two additional fields:
| Setting | Default | Description |
|---|---|---|
| Title field | (blank) | CF7 field name to use as the notification title. Leave blank to use the form name |
| Detail field | your-message | Full content shown when opening the alert in the app |
When you enable an integration, the plugin automatically seeds the event type into your FlowAlert dashboard so it appears in the routing rule builder straight away.
Setting up routing rules for forms
In your FlowAlert dashboard, create a routing rule with the event key you configured above (default form.submitted):
- Event key:
form.submitted(or your custom key) - Target group: the group you want to notify
- Requires ACK: match the setting you chose in the plugin
If you have multiple form types and want them to notify different people, give each integration a different event key (e.g. booking.submitted, contact.submitted) and create a rule for each.
WooCommerce
When WooCommerce is active, the plugin sends an alert every time a new order is placed.
| Setting | Value |
|---|---|
| Event key | order.created (fixed, not configurable) |
| Trigger | New order via classic or block checkout |
| Default priority | HIGH |
| Requires ACK | Configurable |
The plugin hooks into both woocommerce_checkout_order_created (classic checkout) and woocommerce_store_api_checkout_order_processed (block checkout). Built-in deduplication ensures only one notification fires per order even if both hooks run.
Data included in every order.created event:
| Field | Value |
|---|---|
data.order_id | Order ID |
data.total | Order total (formatted to 2 decimal places) |
data.currency | Currency code |
data.billing_name | Customer full name |
data.billing_email | Customer email |
data.items | Number of line items |
data.item_names | Comma-separated product names and quantities |
data.status | Order status at time of creation |
data.site | Site home URL |
You can use these fields in routing rule filter conditions — for example, to route orders over a certain total to a different group.
Additional WooCommerce alerts
Each of these is off by default — enable them individually in the plugin settings:
| Event key | Trigger | Enable option |
|---|---|---|
order.status_changed | Any order status transition (e.g. processing → completed) | Alert on order status changes |
order.refunded | An order is fully or partially refunded | Alert when an order is refunded |
order.payment_failed | A checkout payment fails (woocommerce_order_status_failed) | Alert on failed payments |
product.low_stock | A product hits its low-stock threshold (woocommerce_low_stock) | Alert on low / out of stock |
product.out_of_stock | A product reaches zero stock (woocommerce_no_stock) | Alert on low / out of stock |
subscription.status_changed | A subscription status change (requires the WooCommerce Subscriptions extension) | Alert on subscription status changes |
Each event carries the relevant data.* fields and sets a dedupeKey, so a given transition fires once even if the underlying hook runs twice.
Failed payments and low-stock are two of the highest-value alerts you can turn on — a recovered order or a restock more than pays for the plan. They're off by default so you opt in deliberately.
Easy Digital Downloads
When Easy Digital Downloads is active, the plugin sends an alert on every completed purchase.
| Setting | Value |
|---|---|
| Event key | purchase.completed (fixed, not configurable) |
| Trigger | edd_complete_purchase action |
| Default priority | HIGH |
| Requires ACK | Configurable |
Data included in every purchase.completed event: payment_id, total, currency, customer_name, customer_email, items, item_names, site.
Create a routing rule with event key purchase.completed.
Bookings
For booking plugins that expose WordPress hooks, FlowAlert is a one-click toggle — no webhook to wire up. Enable the integration under 📅 Bookings and a booking pushes the moment it's made.
| Plugin | Detected by | Events |
|---|---|---|
| Amelia | AMELIA_VERSION constant | booking.created, booking.cancelled |
| FluentBooking | FLUENT_BOOKING_VERSION constant | booking.created, booking.cancelled |
| LatePoint | LATEPOINT_VERSION constant | booking.created |
| MotoPress Hotel Booking | MPHB_PLUGIN_FILE constant | booking.created (on confirmation), booking.cancelled |
| Five Star Restaurant Reservations | rtbInit class | booking.created (new reservation requests) |
| Setting | Default | Description |
|---|---|---|
| Enable | Off | Sends an alert when a booking is created |
| Alert on cancellations | Off | (Amelia, FluentBooking & MotoPress) also alert when a booking is cancelled |
| Priority | HIGH | LOW / NORMAL / HIGH / URGENT |
| Require acknowledgement | Off | Staff must acknowledge each booking (Pro feature) |
Each event carries the customer name, email, start time, and (where available) the service. Create a routing rule with event key booking.created — and booking.cancelled if you've enabled cancellations — and point them at your front-desk group.
Using Bookly, Booknetic, BookingPress, Simply Schedule, or another booking plugin not listed above? Those don't expose the hooks this plugin needs. Connect them via Webhooks & Automation instead — usually a few minutes in the plugin's own settings.
Support & Donations
| Plugin | Detected by | Event | Default priority |
|---|---|---|---|
| Fluent Support | FLUENT_SUPPORT_VERSION constant | ticket.created | HIGH |
| GiveWP | Give class | donation.received | NORMAL |
Both follow the same pattern as the other one-click integrations:
| Setting | Default | Description |
|---|---|---|
| Enable | Off | Sends the alert when a new ticket / donation arrives |
| Priority | (as above) | LOW / NORMAL / HIGH / URGENT |
| Require acknowledgement | Off | (Pro feature) |
- Fluent Support carries the customer, subject, and priority — route
ticket.createdto your support group and pair it with an escalation policy to enforce an SLA. - GiveWP carries the amount, currency, and donor — route
donation.receivedto your fundraising team.
Plugins that connect a different way
The one-click integrations above work because each plugin exposes a WordPress action hook the FlowAlert plugin can listen on. Some popular plugins don't — either they're closed-source (no hooks) or they keep their data in their own tables. The FlowAlert plugin can't drive these directly, but they can still reach FlowAlert through their own webhook, the REST API, or Zapier.
This isn't a one-click toggle — it's a few minutes of setup in that plugin's own settings — but no code is involved. The full step-by-step for each lives in Webhooks & Automation.
| Plugin | Why it's not one-click | How to connect |
|---|---|---|
| Bookly | Fully encapsulated core — exposes no developer hooks | Zapier (Bookly Pro includes it) or the REST API |
| Booknetic | Closed-source, no PHP hooks | Built-in Webhooks workflow action → /v1/events |
| BookingPress | No suitable booking hook | REST API / automation step |
| Simply Schedule Appointments | No suitable booking hook | REST API / automation step |
| Easy Appointments | No suitable booking hook | REST API / automation step |
| SupportCandy | Tickets stored in its own tables, no FlowAlert hook | REST API / automation step |
| Awesome Support | No suitable ticket hook | REST API / automation step |
| RestroPress | Own order store, no WooCommerce hooks | REST API / automation step |
| Uncanny Automator, WP Webhooks, SureTriggers/OttoKit | Automation hubs — they're the sender, not a data source | Add a webhook/HTTP step pointing at /v1/events |
The booking plugins that are one-click — Amelia, FluentBooking, LatePoint — are listed under Bookings above. If your plugin isn't in either list, it almost certainly connects via the webhook/REST route — see Webhooks & Automation.
Email fallback
Under General in the settings page, you can enable an email fallback. If the FlowAlert API is unreachable when an event fires, the plugin will send a plain email via wp_mail so the alert is not silently lost.
| Setting | Default |
|---|---|
| Enable fallback | Off |
| Fallback email | WordPress admin email |
Agencies & fleets
Everything above assumes one site. If you look after many — an agency with 22 client installs, a franchise, a network — the plugin and API are built to onboard the whole fleet in minutes, into one FlowAlert workspace.
Each install identifies itself on every event, so the dashboard's Sites page fills in automatically: one row per site with its health, open alerts, check-in state and uptime-check status, and every push is prefixed with the site's name ([Acme Bakery] Fatal error) once a second site appears. Uptime checks are enabled per site from the same card — worth flipping on for every client site that matters (plans cap how many sites can have it on at once: 1 on Free, 5 on Pro, 50 on Agency).
Configure via wp-config.php
Instead of pasting the API key into each site's settings screen, define it in code (plugin 1.2.0+):
define( 'FLOWALERT_API_KEY', 'fa_live_your_workspace_key' );
// Optional — only when self-hosting or pointing at staging:
define( 'FLOWALERT_API_URL', 'https://api.flowalert.io/v1' );A defined constant always wins over the saved option, and the settings screen shows the field as managed by code. This is the natural fit for provisioning tools, site templates, and hosts that template wp-config.php.
Configure via WP-CLI
The plugin stores plain WordPress options, so the whole setup scripts cleanly:
# Install, activate, connect
wp plugin install flowalert --activate
wp option update flowalert_api_key "fa_live_your_workspace_key"
# Turn on the site's own alarms + dead-man's switch
wp option update flowalert_site_fatal_enabled 1
wp option update flowalert_site_update_enabled 1
wp option update flowalert_heartbeat_enabled 1
# Enable the integrations this site uses (one option per integration)
wp option update flowalert_woo_enabled 1 # WooCommerce
wp option update flowalert_cf7_enabled 1 # Contact Form 7
wp option update flowalert_gf_enabled 1 # Gravity FormsEvery toggle on the settings screen follows the same flowalert_*_enabled pattern — enable exactly what each site runs. The heartbeat provisions itself on the next wp-admin page load (or immediately if you enable it from the settings screen).
Run it across the fleet with a loop:
for site in site-a site-b site-c; do
wp @$site plugin install flowalert --activate
wp @$site option update flowalert_api_key "fa_live_your_workspace_key"
wp @$site option update flowalert_site_fatal_enabled 1
wp @$site option update flowalert_heartbeat_enabled 1
done(@site-a style aliases come from your WP-CLI config (opens in a new tab).)
MainWP / ManageWP
From a management console, the recipe is the same two steps:
- Bulk-install the FlowAlert plugin from the WordPress.org repository to the selected sites (MainWP: Plugins → Install; ManageWP: Plugins → Add).
- Push the key: add the
FLOWALERT_API_KEYline to each site'swp-config.php(MainWP's Code Snippets extension can inject it fleet-wide), or run the WP-CLI commands above through your host's terminal.
Once events start arriving, each install registers itself under Sites in your dashboard — rename any of them to the client name you actually use, and route alerts per site with a routing-rule condition on data.site.
One workspace, many sites is the intended model — plans are priced per workspace, not per site. Your team sees one alert feed, filterable by site, with one set of routing rules and escalation policies across the whole portfolio.