GWI Cloud
One account. Every product. Full visibility.
A customer and staff portal for the unified GWI identity platform.
Customers see and manage every GWI subscription in one place.
GWI staff see every customer, subscription, mapping, and email in one place.
One subscription model underneath, still fed by Workbooks.
The estate today
Six product lines, four separately built stacks, no shared front door
Product line
Front end
Checkout
Backend stack
GWI platform (Exec, Strategy)
React on AWS
Stripe one-off
.NET API + Strapi CMS
UltraFacility Portal / UPM
Next.js on Vercel
Legacy Rails cart + Stripe
Express Sanity API + legacy Rails
EuroWIN
Own client
Sales-led
Own API audience in Auth0
DesalData / WDR / WaterData
Legacy sites
Sales-led / legacy
BETI Rails monolith + beti_api
Shared today
Workbooks CRM (commercial source of truth) · Auth0 (one tenant, 40 roles, one organization per product) · a 15-minute sync turning contracts into roles
Not shared
A customer portal, a staff console, a subscription model, a billing view, an email pipeline, or a support system
Problem 1 of 4
Entitlements are decided by hand-kept maps — six places that must agree by convention
The sync picks one Auth0 role per contract from the product refcode, looked up in three JSON files (base / trial / global site license).
UltraFacility: one Workbooks product means six roles, decided by a 30-row pricing-scheme table hardcoded in C#. A new spelling needs a code change and a redeploy.
A second hand-synced dictionary (ProductKeyHelper) maps role names to the organization that brands emails and login redirects.
BETI self-serve purchases assign the same roles through a separate, parallel implementation coupled only by identical role-name strings. Delegate roles are imported by hand, once a year.
Failure mode: a new refcode, scheme spelling, or role does not error — it silently produces no role, the wrong tier, or an unbranded email.
Problem 2 of 4
Subscriptions are invisible, renewals leak, cancellation does not exist
No "my subscriptions" view anywhere: the platform profile lists role names and dates; UPM, EuroWIN and the legacy sites show nothing.
Renewal is "remember to come back and buy again": every Renew button routes to the generic plans page. No card is stored — a lapse is the default outcome for a distracted customer.
No cancellation flow exists in any of the four codebases. No invoices, receipts, or payment-method management exist anywhere.
UPM membership changes (upgrade, add users, remove users, unsubscribe, renew) are one free-text contact form actioned by hand.
Workbooks tracks a RenewalStatus per contract; it is synced into Auth0 metadata and then never shown to anyone.
Problem 3 of 4
Emails come from four systems, none accountable
Nobody can answer "which emails did this customer receive, and from where".
Sender
What it sends
Who owns it
SES (gwi-platform)
Set-password invite, trial welcome, metering, quotes
Platform engineering
Mandrill (BETI, prod)
Subscription activated / renewed, trial request
Legacy BETI app
Auth0 templates
Password reset, verify, welcome, blocked account
Auth0 dashboard
Formspree (UPM)
Contact / membership / CFL applications
Nobody (external SaaS)
And the gaps between them: role-expiry notifications are stubbed (three TODO log lines) · BETI suppresses its admin-change notification for API writes · users created through the internal admin app get no invite email at all · Force24 marketing is wired in only as a tracking script.
Problem 4 of 4
Support is a shared inbox and one admin page
The internal admin app has exactly one user screen: look up by email, compare live roles against the snapshot, force a resync, delete, export a CSV.
Staff can grant or revoke only 6 hand-picked roles — none of the other 20+ product roles, no dates, no subscriptions, no billing.
"Support channels" today: mailto customersuccess@, a Formspree form, and the UPM free-text form. No queue, no states, no history, no SLA.
Troubleshooting "customer cannot access X" means correlating the Auth0 dashboard, Workbooks, CloudWatch logs, and the BETI database by hand.
What the status quo costs
Every one of these is a recurring cost that grows with the customer base
Lost renewals
No auto-renew, no stored card, no dunning: passive lapse is the default outcome — the single biggest cause of lost members.
Staff hours
Every plan change, seat change, cancellation, refund, delegate import, and mis-mapped role is a manual task.
Silent access failures
Unmapped refcodes and scheme spellings degrade access without an alert; customers discover them as "I paid but cannot log in" tickets.
Slow commercial change
A price change or a new pricing scheme requires a developer, a code change, and a redeploy.
Compounding onboarding risk
Every product GWI adds or acquires becomes the seventh copy of the same mapping, email, and checkout problem.
The vision — GWI Cloud
One tenant application, two faces, one subscription model
Customer portal
my products · billing · team · tickets · preferences
Staff console
customer 360 · mappings · sync health · emails · tickets · audit
GWI Cloud services
subscription model mapping registry email pipeline ticket system sync + observability audit log
Workbooks
source of truth
Auth0
one tenant, orgs per product
Stripe
subscription billing
BETI / product APIs
entitlements
Workbooks remains the commercial source of truth. GWI Cloud reflects and operates it — it does not replace it.
What customers get
Everything a subscriber currently has to email us about, self-served
My products
Every subscription across GWI products on one dashboard — tier, seats, status, dates, renewal state, per-product branding.
Billing
Stored payment method, invoices and receipts, auto-renewal with clear pre-charge notice.
Renew, upgrade, cancel
Real flows with real outcomes, not a contact form. Cancellation is cancel-at-period-end with access until expiry.
Team management
UltraFacility lead admins see their seat roster and add or remove members themselves.
One profile
Identity, employer, communication preferences, and consent records — honoured by every product.
Support
Raise a ticket, see its status and history, instead of emailing a shared inbox.
Designed: C1 Home · C2 Detail · C3 Plans · C5 Billing · C6 Team · C9 Support · Mobile
What GWI staff get
The whole customer-product relation on one screen, and the levers to change it safely
Customer 360
Identity, organization, every subscription with Workbooks, Stripe, and BETI provenance, drift, emails sent, tickets, audit trail.
Subscription operations
Adjust dates and status, trigger a resync, resend an invite, grant a manual role — with guardrails and an audit log.
Mapping registry
The six hand-kept maps become one validated, versioned registry edited in the console — no code change, no redeploy, no silent fallbacks.
Sync health
Last run, queue depth, dead letters, per-user sync timeline, and alerts when a contract fails to map.
Email center
Every outbound email logged with template, product branding, and delivery state; one-click resend.
Ticket queue
Assignment, states, history — replacing the shared inbox.
Designed: A1 Search · A2 Customer 360 · A5 Registry · A7 Sync health
It builds on work already underway
GWI Cloud is not a restart. The foundations are already being laid.
One Auth0 tenant per environment already serves the platform, UPM / UltraFacility, EuroWIN, and the BETI API audiences.
One organization per product already exists, carrying the product's branding, colors, and support address.
Organization-scoped login just landed for the platform web app; set-password and password-reset emails are already branded from the product organization.
gwi-auth already mirrors all three tenants into reviewed config — identity change management is solved.
The "identity contract packages" design is written and ready to build — the natural vocabulary for GWI Cloud's product model.
The Stripe subscription-billing proposal for Executive is written; GWI Cloud is the surface that extends it to every product.
What moves where
Consolidate the plumbing; leave the sources of truth alone
Capability
Today
With GWI Cloud
Who bought what
Workbooks CRM
Workbooks CRM (unchanged)
Role / permission catalog
Auth0 dashboard + gwi-auth mirror
gwi-auth packages, read-only in Cloud
Product-to-role mapping
3 JSON files + C# tables + beti_shared copy
One validated mapping registry
Contract-to-role sync
15-minute cron, unobservable
Sync service with health dashboard
Transactional email
SES + Mandrill + Auth0 + stubs
One org-branded pipeline, logged
Billing and renewals
3 checkout paths, no renewal, no cancel
Stripe subscriptions + self-service flows
Customer self-service
One profile page + free-text forms
Customer portal
Staff user management
One admin page, 6 grantable roles
Staff console with audit and guardrails
Support
Shared inbox + Formspree
Ticket system in portal and console
Also unblocks: retiring the UPM legacy checkout site, the admin app's user page, and the per-product manual delegate imports.
Roadmap
Value first, risk last — nothing big-bang
PHASE 0 — SEE
Staff, read-only
Customer 360 and subscription overview fed from what already exists. No writes, immediate troubleshooting value.
PHASE 1 — VISIBILITY
Customers, read-only
"My products", profile, preferences; centralized lifecycle emails with a send log.
PHASE 2 — OPERATE
Staff, writes
Mapping registry replaces the hand-kept maps; sync moves in with health dashboards; guarded staff actions.
PHASE 3 — TRANSACT
Customers, writes
Stripe subscription billing, renewal, upgrade, cancellation, seat management; tickets replace the inbox.
PHASE 4 — RETIRE
Decommission
UPM legacy checkout, the admin user page, manual delegate imports, and the parallel BETI role path.
The ask
Agreement on direction, then a small first step
1
Agree the direction: GWI Cloud as the tenant application over the unified Auth0 tenant — customer portal plus staff console, Workbooks untouched as source of truth.
2
Agree the keystone data design: one normalized subscription model and one mapping registry.
3
Commission the design pass: screens and scenarios are specified in the companion design brief — turn them into visual designs.
4
Decide the home: a new app in the platform Nx workspace, or a new repository alongside gwi-auth.
5
Fund Phase 0: the read-only staff console slice, as the proof of value.
The design pass is already done — explore the 10 screens →