Book a call
All work
RedsoClub (Web My Money)

Rebuilding a 100-workflow CRM from scratch, no docs.

A Spanish-language content-creator membership with ~104k contacts, 10 pipelines, and 100 workflows across GoHighLevel and Zapier. No documentation. Tag state had drifted. Non-paying users still had access. Audited it end-to-end and rebuilt down to ~50 workflows that actually match how the business runs.

GoHighLevelZapierStripeMembershipCRM Architecture

The problem

Spanish-language creator membership on GoHighLevel + Zapier, Stripe + PayPal billing. 104k contacts, 10 pipelines, 100 workflows. Zero documentation.

  • Tag state had drifted: tags used as state instead of metadata, same tag meaning different things in different places.
  • Pipeline stages didn't reflect reality. "Member" included people who'd stopped paying months ago.
  • Non-paying users still had platform access. Status:Active was assigned by code paths nobody had audited.
  • Same payment event firing two automations across GHL and Zapier, both writing contact state.

No map. Nobody knew which workflow triggered which, which Zap depended on which, or which automations were dead.

What I did

  • Mapped it first. Catalogued every workflow, Zap, pipeline stage, and tag: purpose, trigger, guard, actions, consumers. Map became the precondition for any change.
  • Stripe + PayPal as ground truth. Membership state decided by payment events, not tags or CRM stage. Tags back to metadata; stages back to state.
  • Rebuilt the workflow layer from scratch. 100+ → ~50 workflows. Same coverage, explicit guards on every entry point.
  • Fixed paywall enforcement. Non-paying contacts can't enter paid lifecycle flows. Status:Active now assigned only by authorized paths.
  • Spanish as a fixed token set. Every trigger, form, and tag stays in Spanish. English ops layer wraps around it without rewriting.
  • Migrated additively. Legacy ran while new validated. Stripe/PayPal exports were the reconciliation source. Rollback path always available.

The real metric wasn't workflow count. It was how many states a contact could end up in that nobody had explicitly designed. Before: many. After: zero.

Outcome

  • 100 workflows → ~50, same coverage, cleaner logic.
  • Paywall integrity restored. Reports finally agree with the bank.
  • Stripe / PayPal exports are the canonical source of truth for membership state.
  • Team can answer the three questions that matter: Why is this contact here? What triggered this? What happens next?
  • Webhooks already wired for the custom application replacing the platform, so the new app plugs in without rewiring the lifecycle.