Strategy & decisions

Legacy AMS → Agend Suite: Parity Map

The pre-migration checklist promised by O6 (platform-opportunities.md) and the bridge map §6: what the old Groundhogg-based AMS does, where each capability lands in the suite, and where the honest gaps are. Source: code audit of ~/work/agend-ams-wordpress (2026-07-08) — a full WP site repo (Docker mirror of ams.agend.info on Kinsta): 106 commercial plugins + ~10 custom plugins in public/deployemnts-ZjV5E3qWPx/, with 16 capability docs in docs/capabilities/ and the production DB dump (agendlab.sql, 73.7 MB) as the authoritative data source. Status: PARITY BASELINE · per-client copies get a status column

0 · The head start nobody priced in

The old AMS is already partially integrated with the suite, in production: agend-integration v2.3.0 provides OAuth2+PKCE SSO, one-way Groundhogg→Directory sync (membership-gated, debounced), Agend-LMS course sales/enrolment (per-user/seat/unlimited licences, [agend_cpd_balance], [agend_certificates]), a QMS entitlement module, and ~20 Elementor widgets. agend-loop-wp separately syncs users, WooCommerce Teams and committees into Loop, and Discourse (community) is already suite-adjacent. Identity mapping and several data flows are solved problems. Migration = completing a bridge that's already carrying traffic, not starting one.

1 · Parity table

Old AMS capabilityPowered bySuite homeVerdict
Individual memberships (recurring dues, dunning, proration, self-service pause/cancel/upgrade)WC Subscriptions + Memberships + ams-common managers (62K-line lifecycle classes)CRM memberships/tiers + commerceLossy — custom lifecycle + dunning logic must be re-specified against the suite billing engine
Corporate/team memberships (seats, roster self-service, invites, hybrid base+per-seat pricing)WC Memberships for Teams + agend-teams-hybrid-pricing (self-described "stopgap… while a full billing engine replacement is built")CRM companies + billing engineLossy — but pre-ordained: the stopgap plugin's own header names the suite billing engine as its successor
CRM (contacts, tags, custom fields, notes, tasks, companies)Groundhogg core + ams-common GH manager (45.7K)CRMClean — migration transformers exist (apps/crm/lib/migration)
CRM (multi-pipeline deals, lead scoring, appointments)Groundhogg Pro extensionsCRM deals exist; lead scoring/appointments do notPartial — deals port; lead scoring + appointments/booking are suite gaps
Marketing automation (visual funnels, if/else, timers, cart abandonment, birthday triggers)Groundhogg funnels + WP FusionWorkflows (apps/workflows)Rebuild, not port — funnel definitions are structurally different; rebuild per client from the funnel inventory
Email/SMS comms (broadcasts, drip, preference topics, Mailgun/SES bounce sync, Twilio SMS/WhatsApp)Groundhogg comms extensionsCRM email + Mailchimp sync + workflowsLossy — preference-topic centre, SMS/WhatsApp channels and bounce history have no suite equivalent yet
Events & ticketing (calendar, recurring series, RSVP + paid tickets, per-attendee fields, QR check-in, waitlists, member pricing)The Events Calendar Pro + Event Tickets PlusEvents (native)Mostly clean — TEC import wizard exists in the suite; gaps: recurring series, per-attendee custom fields (shared gap with the Upbeat audit), per-event check-in API keys
LMS / CPDTutor LMS (on-site) + Agend LMS (already integrated) + ams-cpd-points custom ledger tableLMS + CPDMixed — Agend-LMS side already live; Tutor course content + the CPD entries table need data migration
Member portal (orders, invoices, subscriptions, roster, saved cards)WC My Account + Elementor widgetsPortal + widgets (WP front-end kept)Clean — portal UX is rebuilt anyway on the one-WP-build model
Directory / find-a-memberagend-integration directory sync (live) + legacy iugo-find-a-member + ams-flexi-searchDirectoryClean — sync already runs; retire the two legacy search plugins
Jobs boardWP Job Manager + agend-integration jobs moduleJobsClean-ish — migrate listing data
CommunityDiscourse integration (SSO, gating, committee sync); BuddyBoss removedLoopCleanagend-loop-wp already syncs committees; Loop replaces Discourse
Commerce & finance (Stripe SCA, purchase orders, PDF invoices, three Xero integrations, custom finance ledger table)WC + xeroom + iugo-woocommerce-xero + ams-common ledgerCommerce/cart + CRM Xero integrationLossy — PO checkout, Xero reconciliation depth and the finance ledger need explicit treatment; consolidating 3 Xero paths into the suite's one is a win, not a loss
Forms (registration → user + contact, surveys/NPS, prorated-dues calculations, populate-anything)Gravity Forms + 12 extensionsGAPNo suite form builder — the biggest genuine gap (shared with nothing: Upbeat clients keep GF on their WP; legacy clients can too, but GF→suite field mapping must replace GF→Groundhogg feeds)
Knowledge baseHeroic KB (ams-common/includes/heroic/)CMSVerify still active; likely light migration
Cvent importams-common Cvent API clientGAPClient-specific — confirm whether any migrating client still needs it
Auth/SSOWP as SAML IdP + OAuth2 to suite + JWT RESTSupabase auth + @agend/ssoInverted — today WP is the identity provider; post-migration the suite must be the IdP and WP the SP. A cutover plan of its own
Admin/ops (roles, activity logs, Wordfence, Rollbar)variousSuite platform concernsNone needed

2 · Groundhogg data migration inventory (56 gh_* tables in prod)

Ports cleanly (transformers exist or trivial): contacts + meta, tags + relationships (load-bearing — tags drive gating, directory sync, membership status), companies, notes & tasks, WooCommerce↔CRM tracking.

Ports with mapping work: deals/pipelines (suite deals exist, stage mapping per client), email assets & send history (decide: archive vs import), engagement activity, form submissions.

Rebuild, don't port: funnels/automations (→ workflows), superlinks, lead-score levels.

Legally required to carry: consent/preference state — topic opt-ins, bounce/complaint flags, unsubscribe status. This is non-negotiable in any client migration and currently has no suite target field set. Add to the CRM consent model before the first migration.

Non-GH custom tables: CPD entries (ams-cpd-points) and the finance ledger (ams-common) — both need explicit suite destinations (LMS CPD ledger; billing/reporting).

3 · The hard 20% (everything else is known machinery)

  1. Billing — WC Subscriptions dunning, hybrid seat pricing (stopgap awaiting the billing engine by its own admission), purchase-order checkout, Xero consolidation. The billing engine programme is the dependency; legacy migration should sequence behind its relevant milestones.
  2. CRM feature gaps — lead scoring, appointments/booking, preference-topic centre, SMS/WhatsApp channels. Decide per gap: build in suite, drop, or leave on WP-side plugins during transition.
  3. The SAML-IdP inversion — flipping identity mastery from WP to the suite is its own cutover project with client-visible impact (every SSO-connected system re-points).

4 · Suggested migration sequence (per client)

  1. Contacts/tags/companies via the existing transformers (+ consent state once the target exists) — hub becomes CRM of record; Groundhogg goes read-only.
  2. Directory, LMS, Loop, QMS — already bridged; flip from sync to native.
  3. Events — TEC import wizard; note shared gaps with the Upbeat events decision (per-attendee fields benefit both programmes).
  4. Memberships/billing — behind the billing-engine milestones; hybrid-pricing clients last.
  5. Automations — rebuild top funnels in workflows from a per-client funnel inventory.
  6. Identity inversion — last, once everything else reads/writes the suite.
  7. Retire plugins wave by wave; the WP site converges on the thin BOA-08 plugin + widgets (O6).

5 · Reusable assets

docs/capabilities/*.md (16 pre-written capability docs — per-client parity starts there, not from code), agendlab.sql (authoritative data), apps/crm/lib/migration (Groundhogg transformers + CSV importer + tier mapping), wp-migration-* schema migrations, agend-integration + agend-loop-wp (live bridges), the suite's TEC import wizard.