Version 5.2.0

October 9, 2026

Added

  • Require marketing consent. A new setting, off by default, sends marketing email only to people with a recorded yes in Toss or Lock. Refused, withdrawn, expired and never-asked all skip the email: the message log records it as suppressed with the reason, the run shows "Skipped: no consent", and the run stops there. Transactional email is exempt. It does nothing unless Toss (with its consent kit on) or Lock is installed.
  • Toss consent is captured when a contact comes in. Lyfe sends from the queue, where there is no visitor and no cookie, so Toss's marketing answer is copied onto the contact during their own checkout, registration or cart. It isn't read from control-panel requests, the queue runner, or while someone else is logged in. A request without a cookie never wipes an earlier answer. A logged-in customer who changes their mind in Toss updates their contact at once.
  • Lock's consent ledger is asked at send time, for the purpose in the new Lock consent purpose setting (marketing by default). If Toss and Lock disagree, the newer answer wins.
  • The contact screen shows the marketing consent Lyfe would act on, and where it came from.

Version 5.1.0

October 3, 2026

Changed

  • Nothing runs inside a customer's request any more. A workflow whose first step is set to run "immediately" used to run that step during the checkout that triggered it — caught if it failed, but adding the time an email or a webhook takes. It now goes to Craft's queue, which starts once the page has been sent; the scheduler runs it on its next tick if no runner does.

Added

  • Discount codes really expire. Commerce coupons can't, so Lyfe now records every code it creates: from its expiry on, a code no longer gets the discount, and an unused expired code is deleted on the next tick so Commerce rejects it outright. Codes created before 5.1 aren't tracked and keep working.

Fixed

  • Two overlapping ticks could send the same step twice. A slow cron batch and the next minute's could each load the same due run. Runs are now claimed with a lock and re-read before they are advanced, by cron, the queue and Run now alike.

Version 5.0.0

October 3, 2026

Initial release.

Security

  • Steps remember whether an admin wrote them. An admin's step renders Twig as written; anybody else's renders in Craft's Twig sandbox, against the payload as plain data — or, without the sandbox, can't contain Twig at all. Webhook steps are admin-only, and $ENV_VAR values resolve only in an admin's step. A marketer leaving an admin's step untouched keeps it trusted; an admin trusts a marketer's step by approving it in the editor, never just by saving the workflow. Existing steps start untrusted, so on a site with the sandbox off, a step using Twig fails until an admin approves it.
  • Without the sandbox, any brace in a non-admin's step counts as Twig, since Craft's {name} shorthand runs too.
  • The simulator runs only from its form, as a POST, so a link from another site can't make a logged-in user run one. A link can still pick the order.
  • Running the abandoned-cart sweep needs the new Run the abandoned-cart sweep permission, not just permission to view carts.
  • A workflow save could take over a step belonging to another workflow by posting its id; steps are now matched to the workflow being saved.

Fixed

  • The workflow editor failed to open any saved workflow — the trigger description was called on a class name rather than an instance. A check now renders every control-panel screen.
  • A recovered cart was recorded as merely placed. Following the restore link puts a cart back in play, so by checkout it was no longer marked abandoned; a cart is now recovered if it was ever abandoned.
  • Stop chasing recovered carts cancelled everything — including the thank-you and review emails the same order had just started. It now cancels only workflows triggered by an abandoned cart, through a new trigger choice on Cancel this contact's pending runs. A cancel step whose chosen workflows no longer exist now cancels nothing instead of everything.

  • A discount code was lost across a delay. What a step hands on to later ones is now stored with the run, so an email sent three days after Generate a discount code still has the code. The simulator, which kept everything in memory, had shown it working.

  • Scheduled scans stopped at the first 500 candidates and marked the period done. They now page through every contact the prefilter matches.
  • An enabled workflow that needs Pro can no longer be saved on Lite; before, it saved and then silently never started.
  • The simulator now applies the cooldown as well as the run limit, using the engine's own check.
  • The discount-code action no longer claims its codes expire. Commerce coupons can't; the setting dates the offer for your email, and an end date on the discount is what stops codes working.

  • Checkout failed on a site whose address layout has no phone field. The order-complete listener read the field unconditionally. A phone is read only when the field exists, and every listener that runs in a customer's request is wrapped on its own so one failure can't stop another — or the checkout.

  • The cart-restore link is available as {{ cartRestoreUrl }}, which also works in the sandbox; the built-in presets use it.

Added

  • The engine. Trigger → condition → action workflows over Craft Commerce 5, with a delay before every step. Runs are deduplicated by a unique index on (workflowId, dedupeKey), retried on failure, abandoned when badly overdue, and re-validated before each step.
  • Ten triggers — order placed, paid, status changed, refunded, specific product purchased, account created, manual, plus cart abandoned, contact tagged and scheduled contact scan (Pro).
  • Twenty-eight conditions across orders, customers, timing and workflow history, combined as OR-of-AND groups.
  • Fourteen actions — send email, add and remove tags, note on the order, webhook, log note, stop-if, plus SMS, set order status, add and remove user groups, generate a discount code, unsubscribe and cancel other pending runs (Pro).
  • Contacts with tags, per-channel consent, an unsubscribe page and token, and live purchase statistics read from Commerce.
  • Cart tracking (Pro) — activity, abandonment, recovery, restore links and a value-recovered summary.
  • Scheduled contact scans (Pro), the basis of win-backs and VIP tagging: nothing happens when a customer stops buying, so the engine goes looking.
  • SMS (Pro) through pluggable transports: Twilio and a generic HTTP gateway.
  • The simulator — pick a real order or contact and see, rule by rule, which workflows would run and why the rest would not. Shares its code path with the engine.
  • A library of fourteen presets, each installing disabled with copy plainly marked EDIT ME.
  • Message log recording every send, failure, consent suppression and simulation.
  • Console commands for the cron entry point, status, cancellation, pruning, the preset library, simulation, contact backfill and statistics sync.
  • Lite and Pro editions, with a downgrade refusing to run a Pro workflow rather than quietly skipping its Pro steps.