Work and Experience
CRM Systems Client under NDA

FluentCRM + WooCommerce System

A full membership lifecycle engine on a WordPress store

365 days
rolling renewal timer per member
Client
WordPress / WooCommerce membership organization (anonymized)
Engagement
Full CRM system build
Stack
FluentCRMWordPressWooCommercePHP / WP HooksLifecycle AutomationFluentForms
01

Context

A WordPress and WooCommerce membership organization had completed a platform migration onto FluentCRM but had no system on top of it: no segmentation model, no automations, and no bridge between store events and CRM state. Members applied, were approved, paid, renewed and attended events, and every one of those transitions was being tracked by hand, in inboxes and spreadsheets, by people whose job was never meant to be lifecycle bookkeeping.

The task: engineer the full membership state machine, application, admin approval gate, subscription purchase, anniversary-based renewal, yearly event campaigns with refund handling, as event-driven automations hanging off WooCommerce order hooks, with custom PHP snippets as the integration layer. The CRM had to become part of the platform, not a tool sitting beside it.

02

The Challenge

  • Membership is approval-gated: applications wait on a human decision, and the automation had to hold state cleanly across that gate rather than fire-and-forget.
  • New members and renewals need different messaging, but both arrive as the same WooCommerce purchase event, the split had to be derived from order and contact context.
  • Renewals are anniversary-based per member, not calendar-based, a single yearly campaign was structurally wrong for the business.
  • Two yearly events each carry their own promotion, reminders, refunds and consent scope, without automation this was weeks of manual coordination per event.
  • FluentCRM out of the box does not know any of this; the semantics had to be built at the WordPress hook level.
03

Scope and Approach

  1. 01

    Lifecycle mapping

    Mapped the real membership lifecycle first, every state a member can be in, every legal transition between states, and which system owns each transition (form, admin, store, timer). The automations were then built to mirror that map one-to-one, so the CRM state is always explainable in business terms.

  2. 02

    Approval-gated onboarding

    Modeled the application flow as an explicit state machine: signups hold in a pending state on admin review; approval triggers the subscription-purchase sequence automatically; refusal notifies the applicant and exits with clean state. No orphaned contacts, no member who "fell through" between the form and the decision.

  3. 03

    Purchase and renewal split

    Purchase events fire a conditional split on order context, first purchase versus renewal, keyed off real WooCommerce order data rather than guesswork, so each cohort enters its own branch with the right messaging from day one.

  4. 04

    Anniversary renewal engine

    A rolling 365-day wait state carries each member individually to their renewal window and fires the pre-expiry reminder on schedule. Renewals stopped depending on anyone remembering to chase them, the automation state is the reminder system.

  5. 05

    Event campaign system

    For the two yearly events: landing pages with purchase CTAs, purchase-triggered confirmation, T-7 and T-1 reminder timers, a per-event unsubscribe path that narrows consent without global opt-out, a refund-triggered exit automation that unwinds event state, and a promo automation targeting existing CRM segments into the event funnel.

  6. 06

    WordPress integration layer

    Wrote guarded custom PHP snippets bridging WooCommerce order hooks into FluentCRM tags and automation triggers, sanitized inputs, defensive checks, no assumptions about hook payloads. Store activity drives CRM state directly and reliably.

04

Architecture flow

Member application
signup form
Admin review
approve / refuse
approved
Subscription purchase flow
refused
Notified + closed
Purchase split
new member / renewal
365-day renewal timer
pre-expiry reminder
Event campaigns
2 / year, reminders + refunds + promo
05

Technical Deep Dive

The approval gate as a state, not an email

The naive build sends the admin an email and hopes. The engineered build holds the applicant in an explicit pending state with the decision as the only exit, approve routes to purchase, refuse routes to a clean close. Every applicant is accounted for at all times, and the pending queue is a queryable segment rather than an inbox backlog.

Deriving new-vs-renewal from order context

WooCommerce emits the same purchase event for a first-time member and a tenth-year renewal. The split logic inspects the contact's existing CRM state at purchase time, membership tags and history, and routes accordingly. The distinction lives in one place and every downstream automation trusts it.

Rolling timers versus scheduled campaigns

A calendar-based renewal campaign mails everyone at once and is wrong for almost everyone, members joined on different dates. The 365-day wait state makes each member their own timeline: the reminder lands relative to their anniversary, which is both better member experience and structurally simpler than maintaining date segments.

Refunds unwind state, not just money

A refunded event ticket also has to exit the attendee from reminder sequences, remove event tags and restore the pre-purchase state, otherwise refunded members keep receiving "see you Saturday" emails. The refund automation treats the order status change as a state rollback, driven by the same hook layer as the purchase.

Per-event consent scoping

Members who want out of one event's emails usually do not want out of the membership. The per-event unsubscribe path narrows consent to that campaign only, protecting the global relationship while honoring the preference, and keeping global unsubscribe rate from absorbing what is really campaign fatigue.

06

Engineering Decisions

FluentCRM native automations plus PHP hooks, no middleware

The whole lifecycle runs inside the WordPress stack, FluentCRM automations triggered through WooCommerce hooks via custom snippets. No external automation SaaS in the loop means no webhook latency, no third-party outage surface, and one less system holding member PII.

Snippet-based integration over a bespoke plugin

Each bridge is a small, versioned, self-contained snippet with a header documenting purpose and data flow, deployable and rollback-able independently. For an evolving lifecycle, ten small reversible pieces beat one monolithic plugin release cycle.

State machine first, emails second

Copy and templates were deliberately the last mile. Getting the states and transitions right first meant the emails could change weekly without anyone touching the machine, the usual failure is the reverse: beautiful emails wired to undefined states.

07

Results

  • A complete membership state machine, application, approval, purchase, renewal, running from one ruleset with no manual steps.
  • Anniversary renewals automated on rolling 365-day wait states with pre-expiry reminders.
  • Two yearly event campaigns with timed reminders, refund-triggered state rollback, per-event consent scoping and segment-targeted promotion.
  • A hook-level WooCommerce-to-CRM bridge in guarded, versioned snippets the business can extend.
  • Lifecycle bookkeeping moved from inboxes and spreadsheets into queryable CRM state.

Have a system that needs
this kind of work?

Tell me what is breaking or what you need built. I will reply with how I would approach it and what I would check first.

Chat on WhatsApp