Description
Connect your WordPress site to your Mowl workspace in one click, then add a subscribe form anywhere with the [mowl_form] shortcode or the “Mowl subscribe form” block. Double opt-in is on by default.
Features
- One-click connection: your site gets its own token, revocable any time.
- Subscribe form as a block or
[mowl_form]shortcode, with first/last name and consent fields. - Double opt-in: confirmation email sent by Mowl, subscriber created only after confirmation.
- Spam protection: honeypot, timing check, per-IP rate limit, optional Cloudflare Turnstile captcha, real visitor IP behind Cloudflare, and a
mowl_spam_checkfilter for other captcha plugins. - Works on every Mowl plan, including Free.
WooCommerce
With WooCommerce active, the plugin can send order events (placed, paid, completed, cancelled, refunded, partly refunded, failed, on hold) and customer profile changes to Mowl, so you can build automations on them (thank-you series, win-back, review requests) and segment by purchase history. Each customer gets wc_* properties in Mowl: total spent, order count, first and last order date, average order value, last order status. Order events and the import also carry which products were bought and from which categories, so you can segment and start automations by product or category.
- Marketing consent checkbox at checkout (classic and block checkout) and on the My account page; the checkbox is unticked by default and its text is editable. Only customers who tick it receive marketing emails from Mowl; transactional automations run regardless.
- Optional double opt-in for that consent (off by default; strongly recommended for shops in Germany and Austria).
- Events are queued locally and sent in batches in the background (Action Scheduler), with retries — a slow or unreachable Mowl never slows down checkout.
- Everything is switchable under Mowl WooCommerce, where you can also see the queue status and the last events. Compatible with High-Performance Order Storage (HPOS).
Abandoned cart
The plugin keeps its own mirror of every WooCommerce cart, and when a cart has been untouched for longer than the threshold you pick (15 minutes to 4 hours), it sends a cart_abandoned event to Mowl, so you can build a reminder series there. When the shopper finally places an order, a cart_recovered event follows, so a goal on that automation can stop the rest of the series. The reminder email can carry a restore link that refills the cart and sends the shopper to checkout.
Switchable under Mowl WooCommerce (“Abandoned cart”), where you also see how many carts are open, abandoned and recovered. The sweep runs every 15 minutes in the background (Action Scheduler), and a cart gets at most one reminder per 24 hours. See the FAQ for the restore link, guest carts, consent and how long carts are kept.
Import existing customers
Under Mowl WooCommerce, “Import existing customers” brings the customers who ordered before you connected over to Mowl. First click “Check customers”: the plugin counts the customers (everyone with at least one processing, completed, on-hold or refunded order) and how many of them have a recorded consent, and Mowl tells you how much room your plan has. Then start the import; it runs in the background and you can leave the page. Imported customers get no email, no automation starts for them, and running the import again is safe: nobody is added twice.
Daily sync
Once a day the plugin re-sends every customer whose orders changed in the last 25 hours, so customers created through the REST API, an import or another plugin — or events that could not be sent — still reach Mowl. This only fixes the customer data; it does not send the missed order event again, so no late thank-you email goes out.
Back in stock
When a product is sold out, its page offers an “Email me when this is back in stock” form. The visitor enters an email address (and can tick “Also send me the newsletter”), and when the product is back in stock Mowl sends one email to everyone who asked. Needs WooCommerce, a connected site and the back-in-stock notification switched on in your Mowl workspace (Integrations); the plugin picks the setting up within an hour, or immediately when you open Mowl Settings in WordPress.
The form works with and without JavaScript, shares the spam protection of the subscribe form (honeypot, timing check, rate limit, optional Turnstile), and shows the visitor only a general success or error message.
Automation recipes
In Mowl, “New automation” offers ready-made recipes for a connected shop: an abandoned cart series (three emails, stops as soon as the shopper buys), a thank-you and review request after an order, and a win-back email after 90 days without an order — plus a welcome series for every workspace. Each recipe is created as a draft with the right trigger, goal and re-entry settings; choose a topic and a sender, review the emails, then activate it.
Privacy requests
The plugin hooks into WordPress’s own privacy tools (Tools Export Personal Data and Erase Personal Data): an export includes the data this plugin keeps on your site and the subscriber’s data in Mowl, and an erasure deletes the plugin’s local data and asks Mowl to anonymise the subscriber. See the FAQ for the details.
Shortcode attributes
[mowl_form tags="Newsletter,Deals" fields="email,first_name" doi="1" consent="1" consent_text="…" button="Subscribe" success="…" pending="…" redirect="https://your-site.com/thanks/"]
Source code
The block editor script (build/blocks/subscribe-form/index.js) is built with @wordpress/scripts (webpack) from the human-readable source shipped in src/blocks/subscribe-form/; run npm install && npm run build to rebuild it. The front-end and admin scripts in assets/ are not minified.
External services
This plugin connects your site to the Mowl email marketing service, so it can add your subscribers to your Mowl workspace. Requests are sent to https://app.mowl.email (the MOWL_API_URL constant overrides it for development). No data is sent to Mowl until you connect your site under Mowl Connection.
What is sent, and when:
- When you connect your site (Mowl Connection “Connect to Mowl”): your site’s URL and site name.
- On every subscribe-form submission (shortcode or block, with or without JavaScript) (to
subscribers): the submitted email address, first and last name (if the form asks for them and the visitor filled them in), the tags selected for that form, the page URL the form was submitted from, the visitor’s IP address, their browser’s user agent string, and the consent checkbox text (if consent is enabled for that form). - When an admin uses “Test connection” (Mowl Connection): a health check request, authenticated with the site’s connection token.
- WooCommerce order events (only if WooCommerce is active and “Sync” is on under Mowl WooCommerce; when an order is placed, paid, completed, cancelled, refunded, partly refunded, failed or put on hold): the billing email address, first and last name, the WooCommerce customer ID for registered customers, the marketing consent decision with the checkbox text and time (with double opt-in on, a “yes” also carries a double opt-in marker and your shop’s language — en, hu or de — so that Mowl can send the confirmation email), the customer’s aggregates (total spent, order count, first/last order date, average order value, last order status), and flat order data: order number, status, total (also formatted the way your shop shows it), the refunded amount of a partial refund, currency, item count, a short items summary, the first item’s name, URL and image URL, the order URL, the order’s WooCommerce payment link (it contains the order key; sent only with a failed or on-hold order that can still be paid), payment method title, coupon codes, shipping country; plus the list of ordered items (at most 20): each item’s name, quantity, product URL, image URL, unit price and line total (also formatted), product ID (the main product for a variation), variation ID, SKU and product categories (ID and name, at most 10); with a cancelled, fully refunded or failed order also the customer’s purchase history (as described for the import, without that order). No addresses, phone numbers, IP addresses or payment details are sent. Sent in batches to
events. - WooCommerce customer profile changes (My account Account details, same conditions): the email address, first and last name, the WooCommerce customer ID, and the marketing consent decision if the checkbox is shown (with double opt-in on, a “yes” also carries the double opt-in marker and your shop’s language).
- WooCommerce abandoned-cart events (only if WooCommerce is active and both “Sync” and “Abandoned cart” are on under Mowl WooCommerce; when a cart has been idle longer than your threshold, and again when an order recovers that cart): the email address the shopper is known by (their account email, or the address typed at checkout), the WooCommerce customer ID for registered customers, and flat cart data: the cart’s restore token and restore URL, item count, total (also formatted the way your shop shows it), currency, a short items summary, the first item’s name, URL and image URL, coupon codes, and the date the cart last changed; plus the list of cart items (at most 20): each item’s name, quantity, product URL, image URL, unit price and line total (also formatted), product ID (the main product for a variation), variation ID, SKU and product categories (ID and name, at most 10). No addresses, phone numbers, IP addresses or payment details are sent.
- Importing existing customers (only if WooCommerce is active, “Sync” is on, and an admin starts the import under Mowl WooCommerce): the number of customers (to
import/preview, to show how much room your Mowl plan has); then, for each customer with a processing, completed, on-hold or refunded order, the same customer data as for order events — email address, first and last name, WooCommerce customer ID, the recorded consent decision and its time (with double opt-in on, only a recorded “no”; a “yes” is sent as unknown), and the customer’s aggregates, and the customer’s purchase history: for each product bought in the customer’s paid orders (processing and completed by default, plus any status your shop registers as paid) (at most 200, the most recent first), the product ID, name and categories, the first and last purchase date and the number of orders — sent throughevents; while the import runs, its progress is read fromimport/status, andimport/retryresends the customers that did not fit into your plan. No other order details, addresses, phone numbers, IP addresses or payment details are sent. - Purchase corrections (same conditions as order events): when a paid order is moved to the trash or deleted, or its status changes from paid to an unpaid status without its own order event (for example back to on hold), the same customer data and purchase history as for the import (without that order), as a silent sync through
eventsthat starts no automation. - Daily sync (same conditions as order events, once a day): the same customer data and purchase history as above for every customer whose orders changed in the last 25 hours, and, in a second pass, for every customer whose order was cancelled, failed or moved to the trash in the last 25 hours, sent through
events. - Back-in-stock sign-ups (only if WooCommerce is active, the site is connected and back-in-stock notification is on in Mowl; each time a visitor submits the “Email me when this is back in stock” form, with or without JavaScript) (to
back-in-stock/requests): the submitted email address, the product ID and variation ID (0 for the whole product), the product’s name, URL, image URL and price as text, the language of your shop (en, hu or de), whether the visitor ticked the newsletter option, and, for that option, the consent text they accepted; also the visitor’s IP address, their browser’s user agent string and the page URL, as consent evidence. - Back-in-stock restocks (same conditions; when a published, catalog-visible product or variation without a password goes from not in stock to in stock, even with WooCommerce sync off) (to
back-in-stock/restocked, sent in batches like the other events): the product ID and variation ID, the product’s name, URL, image URL and price as text (and the parent product’s, for a variation) and the time. No personal data is sent; Mowl emails the people who signed up. - Privacy requests (only when an admin runs Tools Export Personal Data or Erase Personal Data for an address): the email address, to
subscribers/export(Mowl returns what it stores about that subscriber) or tosubscribers/erase(Mowl anonymises the subscriber).
Cloudflare Turnstile (optional, off by default). Only if you turn on the captcha under Mowl Form Spam protection: on pages that show a subscribe form, the visitor’s browser loads https://challenges.cloudflare.com/turnstile/v0/api.js, and Cloudflare checks the visitor’s browser to tell people from automated programs. On every form submission your server sends the check result (a one-time token), your Turnstile secret key and the visitor’s IP address to https://challenges.cloudflare.com/turnstile/v0/siteverify. This service is provided by Cloudflare, Inc. Cloudflare Website Terms: https://www.cloudflare.com/website-terms/ — Cloudflare Privacy Policy: https://www.cloudflare.com/privacypolicy/ — Turnstile Privacy Addendum: https://www.cloudflare.com/turnstile-privacy-policy/
Every event batch also carries the plugin, WordPress and WooCommerce version numbers, so Mowl can flag incompatible versions.
This service is provided by Mowl. Mowl Terms of Service: https://mowl.email/terms — Mowl Privacy Policy: https://mowl.email/privacy. The plugin also adds suggested text to your site’s own privacy policy page.
Blocks
This plugin provides 1 block.
- Mowl subscribe form A newsletter subscribe form connected to your Mowl workspace.
Installation
- Install and activate the plugin.
- Go to Mowl Connection and click “Connect to Mowl”.
- Approve the connection in Mowl. Done.
FAQ
-
Does the form work without JavaScript?
-
Yes. Without JavaScript the form posts to your site and reloads the page with the result.
-
Who can turn double opt-in off for a single form?
-
Anyone who can edit posts: the block and shortcode attributes (double opt-in, consent, tags, messages) override the defaults set under Mowl Form, and only those overrides are signed into the rendered form. The global settings apply immediately to every form that does not override them, including forms served from a page cache. The one exception is the Turnstile captcha: after turning it on, purge your page cache, because pages cached before that have no captcha widget and their sign-ups would fail.
-
My site is behind Cloudflare or another CDN; the spam throttle sees the CDN’s IP.
-
Behind Cloudflare, turn on “My site is behind Cloudflare” under Mowl Form Spam protection. The plugin then reads the visitor’s address from the
CF-Connecting-IPheader, but only on requests that really come from Cloudflare’s network, so the header cannot be spoofed by sending it straight to your server. The plugin warns you in the admin when it sees Cloudflare traffic with the switch off.Behind another CDN or proxy, return the real address from the
mowl_client_ipfilter, and only from a header your proxy sets itself (forwarded headers sent by visitors can be spoofed):add_filter( 'mowl_client_ip', function ( $ip ) { return $_SERVER['HTTP_X_REAL_IP'] ?? $ip; } ); -
Where is my Mowl token stored?
-
Encrypted in the WordPress options table, using keys derived from your site’s salts.
-
My hosting blocks outgoing HTTP requests.
-
The plugin needs to reach app.mowl.email from your server. Use “Test connection” under Mowl Connection to check; ask your host to allow outgoing HTTPS.
-
What happens to unsent events when I disconnect?
-
Disconnecting the site from Mowl (or connecting it to another workspace) discards the events that have not been sent yet.
-
How does the My account consent box work?
-
The My account box reflects only consent given in this shop: unticking it revokes a consent that was given here, and never one given elsewhere (for example on a Mowl subscribe form).
-
What does double opt-in for the checkout consent do?
-
Turn it on under Mowl WooCommerce “Double opt-in”. A customer who ticks the box at checkout or on the My account page gets a confirmation email from Mowl in your shop’s language (English, Hungarian or German), and receives campaigns only after confirming. Until then their consent stays as it was; automations such as the abandoned-cart series follow the usual rule and leave out only someone who said no. Unticking the box takes effect at once. With double opt-in off, nothing changes.
-
With double opt-in on, why does a logged-in customer’s checkout consent already show as ticked on My account, even though they have not confirmed it yet?
-
The checkbox reflects the decision the customer made, not whether it has taken effect for campaigns. With double opt-in on, a “yes” only starts sending campaigns once the customer confirms it by email; until then the box stays ticked. To get a new confirmation email, the customer can untick the box, save, tick it again and save.
-
How does the abandoned cart restore link work?
-
The reminder email can carry a restore link back to your shop (
?mowl-cart=…): it refills the cart with the saved items and sends the shopper to checkout. The link is good for 30 days after the cart last changed (as long as the saved cart is kept), works only while the cart is still abandoned, and items that were deleted or went out of stock are skipped; if nothing can be restored, the shopper lands on your home page with their current cart untouched. -
Which carts get a reminder?
-
Guest carts get a reminder only once the shopper has typed an email address at checkout (classic or block checkout). Without an email address there is no event at all. A reminder goes out at most once a day per email address, however many carts carry that address, and never for a cart that has been untouched for more than 7 days.
-
Does the cart reminder need marketing consent?
-
The cart reminder is a marketing email and may be sent to an address that has not given explicit consent; only someone who left the checkout consent box unticked, or declined elsewhere, is excluded. If that is not what you want in your market, turn “Abandoned cart” off.
-
How long are mirrored carts kept?
-
The mirrored cart (its items and the email address) is kept for 30 days after the cart last changed, then deleted; a recovered cart is deleted at the next daily cleanup. Disconnecting the site from Mowl, or connecting it to another workspace, deletes the mirrored carts as well.
-
WooCommerce has its own abandoned cart recovery. Can I use both?
-
WooCommerce 11.x ships its own
abandoned_cart_recoveryfeature. Running both at the same time means two reminder programmes for the same cart, so the shopper may get two sets of emails — pick one. -
Will the import email my old customers?
-
No. Imported customers get no email, and no automation starts for them. Only what they do after the import (a new order, an abandoned cart) can start an automation.
-
Which consent does the import carry over?
-
Only a consent recorded in this shop is carried over as consent: a ticked checkout box on one of their orders, or a ticked box on the My account page. A customer who declined on the My account page is imported as declined. Everyone else is imported with unknown consent.
With double opt-in on, the import and the daily sync never send a confirmation email, and a consent recorded in this shop is not carried over, because it was never confirmed by email: those customers are imported with unknown consent, and the preview counts none of them as consented. A customer who declined on the My account page is still imported as declined.
-
What if my Mowl plan is full during the import?
-
The most recent customers are imported first. If your plan is full, the import stops and tells you how many customers did not fit; after upgrading, “Continue after upgrading” imports the rest. Running the import again is safe: nobody is added twice.
-
When does the back-in-stock form appear?
-
Simple products: the form appears while the product is out of stock. Variable products: when a variation is out of stock and selected, a form for that variation appears below the add-to-cart form; when every variation is sold out, the form asks for the product as a whole and any variation coming back triggers the email. With “Hide out of stock items” on, WooCommerce does not offer sold-out variations for selection, so as soon as any variation is sold out the form asks for the product as a whole (products with many variations, above WooCommerce’s AJAX threshold, keep the per-variation form, because there a sold-out combination can still be selected). Password-protected and hidden products show no form.
-
What triggers the back-in-stock email, and how long are requests kept?
-
The restock event (a product or variation going from not in stock to in stock, published, not password-protected and visible in the catalog) is queued like the other WooCommerce events and works even when customer sync is off. It carries product data only, no personal data.
Mowl keeps a request for at most 180 days from the visitor’s last sign-up, sends one email per address per restock, and these emails count against your monthly email quota. The newsletter tick always uses double opt-in, whatever your form settings: the address becomes a subscriber only after confirming by email.
-
What do the privacy export and erasure include?
-
An export includes the data this plugin keeps on your site and the subscriber’s data in Mowl: profile, tags, topics, custom fields, the marketing consent with its time and source, the double opt-in confirmation evidence (time, IP address, browser and the consent text), the purchase history Mowl keeps for the subscriber and the back-in-stock requests (product, time, whether the email is still pending; also for an address that only asked for a back-in-stock email). An erasure deletes the plugin’s local data and asks Mowl to anonymise the subscriber; Mowl keeps only a salted fingerprint of the address, so the person is not added again unless they give a new consent. If the site is not connected to Mowl, the erasure report says that the Mowl part did not run.
-
Can someone who unsubscribed subscribe again?
-
Yes. If they fill in your subscribe form again, Mowl always sends a confirmation email first, even if double opt-in is off for that form; once they confirm, they are subscribed again. An address that bounced or reported spam cannot be re-added from the form.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Mowl — E-mail Marketing” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Mowl — E-mail Marketing” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.5.1
- Translations now come from translate.wordpress.org language packs instead of files bundled with the plugin.
- Subscribe and back-in-stock submissions are reduced to the fields the forms send before any check runs; the
mowl_spam_checkfilter receives these sanitized fields only.
1.5.0
- Back in stock: a sold-out product page offers an “Email me when this is back in stock” form (simple products, single variations, or the whole product when every variation is sold out or “Hide out of stock items” hides the sold-out ones). When the product is back in stock, Mowl sends one email to everyone who asked. The visitor can also tick a newsletter option, which always asks for confirmation by email (double opt-in). Switch it on in Mowl under Integrations; it works without JavaScript, uses the same spam protection as the subscribe form, and needs WooCommerce.
- Restock events are sent to Mowl even when customer sync is off, and carry product data only.
- The suggested privacy policy text and the External services list cover the back-in-stock sign-ups and restock events; the personal data export lists the back-in-stock requests Mowl keeps.
- The daily cleanup of sent events now runs on every connected site, also with customer sync off.
1.4.0
- Optional Cloudflare Turnstile captcha on the subscribe forms (Mowl Form Spam protection, off by default). A visitor without a passed check gets a clear error and can try again; if Cloudflare cannot be reached, the submission goes through and the other spam checks still apply. A rejected secret key shows an admin notice instead of blocking sign-ups.
- “My site is behind Cloudflare” switch: the plugin reads the visitor’s real address from Cloudflare, only on requests that really come from Cloudflare’s network, so sign-up limits count each visitor separately. The admin shows a notice when it sees Cloudflare traffic with the switch off.
- The suggested privacy policy text mentions Turnstile when it is on.
- New WooCommerce events for automations: “Payment failed” and “Order on hold” (both with a link to pay for the order, when it can still be paid) and “Order partially refunded” (with the refunded amount). Mowl has a ready-made “Failed payment” recipe.
- Purchase history follows the order: products of a cancelled, fully refunded, failed, trashed or deleted order no longer count as bought, and only paid orders count as purchases (processing and completed, plus any status your shop registers as paid). Run the import once after updating so that earlier on-hold or refunded orders are corrected.
- The customer’s total spent no longer includes partly refunded amounts.
- The personal data export now also lists the subscriber’s double opt-in confirmation evidence and purchase history from Mowl, each as its own item.
- Trashing or deleting a paid order, or setting it back to an unpaid status, sends the customer’s corrected purchase history to Mowl silently (no automation starts). The daily sync has a second pass for customers whose order was cancelled, failed or trashed in the last 25 hours, so changes that skipped WooCommerce’s own events are corrected too.
1.3.0
- New name on WordPress.org: “Mowl — E-mail Marketing”.
- Import existing customers: a preview with the customer count, the recorded consents and the room in your Mowl plan, then a background import with a progress bar. No email is sent and no automation starts; the most recent customers come first, and an import stopped by a full plan can be continued after upgrading.
- Daily sync of customers whose orders changed in the last 25 hours.
- Privacy tools: the WordPress personal data exporter and eraser now cover this plugin’s local data and the subscriber in Mowl.
- The suggested privacy policy text covers the import, the daily sync and erasure requests.
- Abandoned-cart and order events now carry the list of items (at most 20: name, quantity, product link, image, unit price and line total) and the total, with prices formatted exactly as your shop shows them, so a Mowl email can show the cart or the order item by item. Variations use their own name and image (or the main product’s image); items whose product was deleted keep their name.
- Item and product names with an HTML entity in them (for example
Salt & Pepper) are now decoded before they are sent, so they show up correctly rather than doubly-escaped. - Double opt-in for the checkout and My account consent (Mowl WooCommerce, off by default): a “yes” becomes a consent only after the customer confirms it in an email from Mowl, sent in your shop’s language. The import and the daily sync never send a confirmation email and, with double opt-in on, carry no earlier “yes” over. The suggested privacy policy text explains the confirmation when it is on.
- The Connection tab shows the monthly email quota (emails sent this cycle out of the plan’s quota) in its own row, next to the subscriber limit, so the two are no longer mixed up.
- Purchase history for segments and automations: order and abandoned-cart items now carry the product ID (the main product for a variation), variation ID, SKU and product categories, and the customer import and the daily sync bring over, for each customer, which products they bought (at most 200, the most recent first), with categories, first and last purchase date and the number of orders. Once Mowl has been updated, run the import once to fill in the history of earlier orders.
- The Connection tab shows the plan’s name (for example “Starter”) instead of its internal identifier.
1.2.0
- Abandoned cart: every cart is mirrored locally, and a
cart_abandonedevent goes to Mowl once the cart has been idle longer than the threshold you pick (15 minutes to 4 hours);cart_recoveredfollows when the shopper orders, so an automation goal can end the reminder series. - Guest carts: the email address typed at the classic or block checkout is captured on the mirrored cart, so a guest cart can get a reminder too; without an email address nothing is sent.
- Restore link (
?mowl-cart=…): refills the cart with the saved items and sends the shopper to checkout; good for 30 days, only while the cart is still abandoned, deleted or out-of-stock items skipped. - New “Abandoned cart” block under Mowl WooCommerce: on/off switch, threshold, and the open/abandoned/recovered counts. The cart mirror table is removed on uninstall.
- Mirrored carts are cleaned up with the daily maintenance run (30 days after the cart last changed, recovered carts right away), and are deleted when the site is disconnected or connected to another workspace.
- An email address typed at checkout survives later cart changes, and a guest cart follows the shopper into their account when they log in.
- A reminder goes out at most once a day per email address, and never for a cart that has been untouched for more than 7 days.
- The suggested privacy policy text now covers the locally stored cart contents and checkout email address.
- Fix: tag names in the shortcode (
tags="Newsletter") now resolve at any time. Before, they only worked within 5 minutes of opening the Mowl settings page, and the form otherwise subscribed without tags. - The shortcode help under Mowl Form now explains every attribute, including
consent_text, and says thatredirectis the page after the confirmation link, not after submitting.
1.1.0
- WooCommerce module: order events (placed, paid, completed, cancelled, refunded) and customer profile changes sent to Mowl,
wc_*customer properties, background sync with batches and retries (Action Scheduler), HPOS compatible. - Marketing consent checkbox at checkout (classic and block checkout) and on the My account page; the checkout consent is sent with the placed event only, and the My account box only revokes a consent given in this shop.
- Event queue under Mowl WooCommerce with status counts, the last events and a retry for stuck events; the queue is discarded when the site is disconnected or connected to another workspace.
- Order placed is sent once per order even when the classic checkout is resubmitted; the admin log trims itself on sites without WooCommerce.
1.0.0
- Initial release: connection, subscribe form (shortcode + block), double opt-in.