eXp Luxury and LuxVT, member experience and revenue audit
Where eXp Luxury loses members
Eighteen leaks, found by walking the member product and reading the billing ledger, and confirmed against the behavioural data the client already collects. Original count the member product on two accounts and reading the full billing
ledger of 5,309 subscriptions. One of them accounts for 50 per cent of every dollar this
business has ever lost. Internal draft, 28 September 2026.
1. What this looked at, and what a member has to believe
The goal is more members, kept longer. We walked the member product on both platforms as a member does, using
two accounts the client provided, and read the billing ledger directly. Every figure here is sourced to a live
test on a stated date or to a full ledger read on 3 or 28 September 2026.
The trust model. A member pays USD 2,500 a year because they believe three things:
1. My listing actually reaches the international portals this membership advertises.
2. I can show my seller that it happened.
3. That helped me win or sell the listing.
Every leak below breaks one of those three, and they stack. If the first fails the second cannot happen, and
if the second fails the third can never be argued at the listing appointment.
We covered the eXp Luxury and LuxVT membership core. The billing organisation also carries Sports and
Entertainment, Land and Ranch and New Homes, 57 plans in total. Those three are named as out of scope rather than
covered thinly, and they sit in the risk register in chapter 11.
Two products, one platform, one ledger
LuxVT is the marketing engine. eXp Luxury is the membership programme its parent company wraps around that
engine, and LuxVT is also sold on its own. They share one codebase and one billing system, so every finding
below is tagged by where it lives, and the money findings belong to both because the ledger does not separate
them.
eXp Luxury the membership programme
LuxVT the standalone product and its marketing
Shared the common platform or billing, affects both
Acquisition the signup funnel across both sites
Features differ between the two and some are visibly under construction, for example a Microsite Creator
marked Beta and MLS listings being fed into activation. Where a finding sits on something clearly still being
built, we say so rather than scoring it.
2. The shape of the loss
More annual contract value has been cancelled in the lifetime of this business than is currently live, and
the book is shedding close to half its own value every year.
USD 1.88Mof revenue walked out in the last 12 months
48.7%of the live book, lost annually
47.4%of members refuse their first renewal
1,045 subscriptions were cancelled in the twelve months to September
2026, carrying USD 1,879,838 of annual contract value between them. That is
48.7 per cent of the entire live book, gone in a year, at an
average of USD 156,653 a month.
One projection, labelled as such. Everything else in this report is measured. This is
the one forward-looking number, and it is a projection, not a fact. Measured part:
1,207 live subscriptions carrying USD 1,604,851
reach their renewal date within the next 180 days, and those dates are in the billing system today. Projected
part: if the first-renewal refusal rate this business has run at, 47.4 per
cent, holds, about USD 760,112 of that would not renew by March. That is a scenario to plan
against, not a measured loss. For reference, one percentage point of renewal rate on that book is
USD 16,049.
On profit rather than revenue. Every figure here is contract value, which is revenue.
Converting it to profit needs one number this audit does not have: gross margin on a membership. It is worth
asking for, because of one thing we did find. Media placement is the main variable cost of this business, and a
member whose listing never leaves Draft never triggers any of it. The members who churn are therefore the
cheapest to serve, which means the revenue lost on them is close to contribution lost rather than a fraction
of it.
USD 3.86Mlive contract value today
USD 4.46Mcancelled to date
USD 2.23Mof that, lost in one 70 day window
Source: the client's own Zoho Billing subscription records, read 28 September 2026.
Live and cancelled contract value are the sum of contract amount over live and cancelled subscriptions; the
70 day figure is the combined value of the 988 cancellations falling between day 330 and 400. Method and date
range for each are itemised in chapter 3.
Date range: all time (every cancellation ever recorded), read from the full ledger on 28 September 2026.
Days since joining
Cancellations
0 to 29
270
30 to 179
158
180 to 329
208
330 to 359
83
360 to 389
876
390 to 419
95
420 and beyond
359
When cancellations happen, measured from the day each member joined. 2,052 cancellations carrying both dates, out of 2,222 total. Billing ledger, all time, read 28 September 2026.
This is not a gradual decline. It is two spikes. 270 members leave inside the first month and
988 leave at the first renewal. Between them they are 61.3
per cent of everyone who has ever left. The middle of the first year is comparatively quiet, which tells us the
product is not annoying people out of the door. It is failing to give them a reason to stay in.
Month
Net
Signups minus cancellations
Mar 2026
+88
Apr 2026
+26
May 2026
-9
Jun 2026
+1
Jul 2026
-4
Aug 2026
-27
Sep 2026
-6
Net subscription movement by month, signups minus cancellations. Billing ledger, 28 September 2026.
The figures above are read directly from the client's own Zoho
Billing system on 28 September 2026. Chapter 3 reproduces every source screen and states the method and date
range behind each number.
3. How to read these numbers: proof and dates
Every figure in this report is one of two kinds. It is either shown on a screen in the client's own
systems, in which case the screen is here, or it is counted from the client's own records, in which
case the exact method and date range are stated. Nothing is estimated, and nothing is an industry benchmark.
Where a number is a projection rather than a measurement, it is labelled as one and kept separate.
2A. Figures shown directly on the platform
These are read straight off the client's Zoho Billing screens, captured on 28 September 2026. The screens are
reproduced in this report so any figure can be checked against its source.
Figure
Value
Where it is shown
Date range
Net Revenue
$4,584,978.83
zoho-revenue-receivables.png (Dashboard, Net Revenue tile)
Last 12 months
Total Receivables
$435,850.85
zoho-revenue-receivables.png (Receivable Summary)
As of 28 Sep 2026, 100% overdue
MRR
$364,774.45
Dashboard MRR tile
Last 12 months
Active Subscriptions
2,550
Dashboard tile
As of 28 Sep 2026
Churn Rate (month to date)
2.00%
zoho-churn-ltv.png (Churn tile)
On Sep 2026, month to date
Revenue Churn
2.6%
zoho-revenue-churn.png (Revenue Churn report)
2025-09-01 to 2026-09-28
LTV (artefact)
$7,153
zoho-churn-ltv.png (LTV tile)
On Sep 2026 (denominator is month-to-date churn)
Signups
1,792
zoho-subscription-summary.png
Last 12 months
Activations
1,744
zoho-subscription-summary.png
Last 12 months
Cancellations (12 mo)
1,254
zoho-subscription-summary.png
Last 12 months
Reactivations
19
zoho-subscription-summary.png
Last 12 months
Zoho Billing dashboard: Net Revenue and Receivables. Captured 28 September 2026.Zoho Billing dashboard: Churn Rate and LTV tiles. Captured 28 September 2026.Zoho Billing: Subscription Summary, last 12 months. Captured 28 September 2026.Zoho Billing native Revenue Churn report. The date range is printed on the report: From September 01, 2025 To September 28, 2026. Captured 28 September 2026.
2B. Figures counted from the client's records
The renewal cliff, the survival curve and the revenue-lost totals are not single tiles on a screen. They are
counted from the client's own subscription records, all 5,309 of them, read through the billing system's own data
interface on 28 September 2026. The method and window for each is stated here and repeated on each finding. The
platform's native Revenue Churn report above corroborates the monthly shape of these figures.
Figure
Value
How it is computed
Date range
Total subscriptions ever created
5,309
count of all subscription records
All time, read 28 Sep 2026
Live subscriptions
2,369
count status=live
As of 28 Sep 2026
Cancelled (status, all time)
2,222
count status=cancelled
All time
ARR live
$3,861,237
sum of contract amount over live subscriptions
As of 28 Sep 2026
ARR cancelled (lifetime)
$4,458,325
sum of contract amount over cancelled subscriptions
All time
Dated cancellations
2,052
cancellations carrying both created and cancelled dates
All time
Renewal cliff (day 330-400)
988 subs, $2,229,013
dated cancellations where days-lived is 330 to 400; sum of their contract amount
sum of contract amount where cancelled_at in trailing 12 months
Sep 2025 to Aug 2026
Overdue invoices
423, $380,596
invoice status=overdue, sum of balance
As of 28 Sep 2026
At-risk contract value
$227,364
sum amount over unpaid+dunning+non_renewing
As of 28 Sep 2026
First-renewal refusal rate
47.4%
988 refused at renewal / (988 + 1,098 who survived past 400 days)
All time cohort
Brand tier ARR
$141,817, 318 live
sum amount over Brand/BAM/BrandCA/BMCA live subs
As of 28 Sep 2026
Pay-at-Close contingent
$387,500
155 live PAC subs x $2,500 published at-closing fee
As of 28 Sep 2026, contingent
2C. Why the date ranges differ, and how to line them up
Three windows appear in this report, each chosen for a reason. When two figures look like they should match
but do not, this is almost always why.
Last 12 months 1 Sep 2025 to 28 Sep 2026. Used for run-rate figures, and it is what every Zoho dashboard tile shows by default.
All time every record ever created, read 28 Sep 2026. Used for structural patterns like the renewal cliff, because the pattern needs the full history to be visible.
As of today a snapshot on 28 Sep 2026. Used for balances, live counts and what is at risk right now.
The reconciliations worth knowing
Cancellations. All correct; different windows. Each figure in the report now states its window.
ARR. Zoho's MRR-based ARR (MRR x 12 = ~$4.38M) annualises monthly plans differently. We use the sum-of-contracts figure and say so.
Churn. Different windows; both shown on platform.
What we removed because it was an assumption
Three things in earlier drafts were estimates, and estimates do not belong in this report. All three are gone.
Removed. 'Every 1 in 10 renewals saved = $222,901' and similar recovery-rate figures in money bands Now. Money-lost figures are the measured loss only. Recovery/improvement rates removed from all bands.
Removed. '$130k-$217k recoverable' from a 30-50% industry recovery band Now. Removed. We hold no data on this client's recovery rate.
Removed. 'Expected to walk out by March $760,112' Now. Kept only as a clearly-labelled forward scenario, separated from measured figures, marked 'projection, not a measured number'.
4. Who this happens to
The first month leaver
Joined, looked, left inside 30 days. 270 of them, USD 1,821 each.
Signed up after a brokerage event expecting the tools to be obvious. Opened the dashboard, saw a webinar
replay and an advertisement for a paid add on, opened Create Listing, met 38 fields across four tabs, and closed
the tab.
I have paid for this and I still do not know what it does. I will come back when I have a listing
worth the effort.
The renewal refuser
Stayed the full year. 988 of them, USD 2,256 each.
Built a listing at some point, never finished Tour Submission, never saw it go anywhere. Heard nothing from
the product for twelve months because there is no membership page and no delivery record. Then a USD 2,500
charge appeared.
What did I actually get for this? I cannot point to a single thing it did for a client.
The involuntary leaver
Never chose to go. 75 in payment failure right now.
Card expired between one annual charge and the next. No warning before the attempt, no banner in the product,
no billing page to fix it on. The emails, if they arrive, look like the rest of the marketing.
I did not cancel anything. I assumed it was still running.
5. What the briefs said, and what we found
Two documents told us what was wrong before we looked: the July 2026 UX framework with its signal scan, and
the Diagnosis and Engagement Plan. We tested every assertion in both. They are directionally right more often
than not, two of their findings have already been fixed since they were written, and the largest one is
confirmed and considerably bigger than stated.
Their claim
Source
What we tested
Verdict
Where it goes
New members never launch a campaign and cancel at first renewal
July UX framework, H-CF2
Full billing ledger plus both accounts walked, 28 Sep 2026
Confirmed and larger
True, and now measured: 48.2 per cent of cancellations fall in the renewal window. Leaks 1 and 2
Agents are confused between the Classic and Pro tiers
July UX framework, H-CS2
Live test of the Pricing page, 28 Sep 2026
Different problem
The page carries no price at all. Absence, not confusion
The dashboard is cluttered and complex
Targeted Platform Audit proposal
Live capture of both dashboards, 28 Sep 2026
Partly confirmed
The eXp dashboard is well built but mis-ordered. The Create Listing form is the complex surface. Leaks 9 and 12
Entry to the programme is USD 950
Diagnosis and Engagement Plan, 12.2
Published plans page at join.expluxury.com, 28 Sep 2026
Confirmed
Luxury Brand is published at USD 950. We marked this Not supported in an earlier draft by checking only the billing catalogue. That was our error
LuxVT is not named in agent facing material
Diagnosis and Engagement Plan, 12.5
Page titles across the member product, 28 Sep 2026
Not supported
LuxVT appears in page titles the member sees, inconsistently
The flagship claim is stated as both 60+ and 80+ on one page
July signal scan, PS-2
All four tier pages read on 28 Sep 2026
Confirmed and larger
Not fixed. It moved. Home and Classic say 80+, Premier says 60+, so the dearer tier claims less. Leak 8
Seven of ten images carry placeholder alt text
July signal scan, PS-11
Live test, 28 Sep 2026
Confirmed, since fixed
All seven images on the rebuilt page carry real alt text
Login and support links are served insecurely
July signal scan, PS-9
Live test inside the member product, 28 Sep 2026
Confirmed
Still present, and now confirmed inside the paid product. Leak 11
The login field says Username but registration collects an email
July signal scan, PS-8
Live test, 28 Sep 2026
Confirmed
Unchanged
The Brand tier excludes listing syndication
Diagnosis and Engagement Plan, 12.3
Published plans page, verbatim, 28 Sep 2026
Confirmed and larger
The page states it outright, and 318 live members sit on that tier. Leak 4
6. The leaks
1
Half of everyone who leaves does so at the first renewal, and the product never mentions it
eXp LuxuryP0Product, billing and leadership
988cancellations in one 70 day window
Days since joining
Cancellations
0 to 29
270
30 to 179
158
180 to 329
208
330 to 359
83
360 to 389
876
390 to 419
95
420 and beyond
359
When cancellations happen, measured from the day each member joined. Full ledger read of 5,309 subscriptions, 28 September 2026.
✗ The first year, as a member lives it
eXp LUXURY
Join eXp Luxury
Submit
1. Pays USD 2,500 and joinsProofBilling ledger, 28 September 2026. Primary Agent is USD 2,500 a year, 869 liveHarmThe membership sells distribution to 80 or more international portals→
eXp LUXURY
Doubt
2. Builds a listing. It saves as DraftProofLive test both accounts, 28 September 2026. 4 of 4 listings read Status: DraftHarmNothing tells the member Draft is not finished→
eXp LUXURY
0
3. Twelve months pass with no proof of anythingProofLive test, 28 September 2026. No billing, renewal or delivery surface exists in the productHarmThe member cannot see what they received or what they pay→
eXp LUXURY
!
Renewal charge
4. The card is charged againProofBilling ledger, 28 September 2026. Median time to cancel on this plan is 365 daysHarmThis is the first moment the membership becomes visible again→
eXp LUXURY
Cancelled
Lost here
5. They cancel
Why the cliff is exactly where it is
The plan is annual. Day 365 is the first time money is asked for twice.
Between the two charges the product shows the member nothing about the membership. No price, no renewal date, no record of what was delivered.
So the renewal is not a decision the member has been preparing for. It is the moment they remember they are paying.
And they have no evidence the year was worth it, because leak 2 means the listing very likely never went out.
The harm: the business is not losing members gradually through dissatisfaction. It is
losing them in one predictable moment, once a year, having given them no reason in the preceding twelve months
to say yes.
Money spentUSD 2,229,013cancelled in the day 330 to 400 window, all time
Money lostUSD 2,229,013is the measured loss from this one window, all time
How we worked this out
Of 2,052 cancellations carrying both a start and an end date, 988 (48.1 per cent) fall between day 330 and day 400. That 70 day window holds 50 per cent of all annual contract value ever lost, USD 2,229,013, at an average of USD 2,256 each. It is not a gradual decline, it is one cliff at the first renewal. Both figures are the same measured loss stated two ways: the count and the money. This is contract value read from the subscription records, all time, not an estimate and not a projection. Date range: all cancellations ever recorded, read 28 September 2026. See chapter 3 for the method.
What to change
Treat the renewal as a journey that starts eleven months before the charge, not an event on the day. Put a
membership page in the product showing what the member pays, when it renews and what has been delivered so far,
because none of that exists today. Send a renewal notice at sixty and fourteen days that leads with delivery
rather than billing: listings published, portals reached, media kits produced. And make the first ninety days
produce one visible result, because a member who has seen the product work once has a reason to renew and a
member who has not is deciding in the dark.
For the product team
The delivery record already exists in fragments: listing status, the Seller Media Kit and the Activity Report are all modelled. None is aggregated to the member or surfaced against the subscription. The renewal date sits in the billing system and is never read by the product.
✓ After the fix
eXp LUXURY
0
1. A delivery record the member can see all year→
eXp LUXURY
Your membership renews in 60 days. Here is what it did.now
2. A renewal notice 60 days out, leading with what was delivered→
eXp LUXURY
✓
Thank you
Success
3. The renewal is a decision, not a surpriseOutcomeMembers reach renewal having seen what they bought, and fewer refuse it.How we will knowCancellations in the day 330 to 400 window. Today 988 of 2,052, worth USD 2,229,013.
2
There are two ways to get a listing live, and the manual one dead-ends
Shared platformP0Product team
4 of 4manual listings stuck at Draft
Corrected since the first draft. An earlier version said there was no way to activate a listing at all. That was too broad. There are two paths. Listings fed from the MLS appear on the Activate Listings screen with a working Activate this listing link, and that path works. The manual path, for a listing an agent builds by hand, is the one that dead-ends: it saves as Draft with no route forward. Both audit accounts held only manual drafts, which is why the Activate screen showed nothing to activate.
✗ The manual path
eXp LUXURY
Create Listing
Submit
1. Fills the Create Listing formProofLive test, 28 September 2026. 38 fields across 4 tabs, ending in Tour SubmissionHarmOnly 19 fields sit on the first tab. The submission step is the fourth→
eXp LUXURY
0
Doubt
2. The listing saves as DraftProofLive test, 28 September 2026. 4 of 4 listings on both accounts read Status: DraftHarmNo screen says which of the four tabs is unfinished→
eXp LUXURY
3. Listing Overview offers Edit and nothing elseProofFull control inventory, 28 September 2026. Visible: Manage Listings, Edit, 5 accordions, Explore GuideHarmNo activate, publish or submit control anywhere on the page→
eXp LUXURY
!
No listing found for activation
Lost here
4. Activate Listings contradicts itselfProofLive capture, 28 September 2026. Reads: No listing found for activationHarmThe same screen reads: you are currently using 3 of your 10 allowed listings
Activate Listings, live capture 28 September 2026. The page states three of ten listings are in use and that a listing can be activated below, then reports that none was found.Listing Overview for a Draft listing, live capture 28 September 2026. Status reads Draft. The only actions are Edit and Manage Listings.
Why members drop out here
The listing page never says what Draft means or what is missing.
The Activate screen contradicts itself: a quota is in use, yet nothing is available to activate.
Returning to finish always restarts at tab one. Later tabs cannot be linked to directly.
Nothing names Tour Submission as the step that completes a listing.
The harm: this is the mechanism behind leak 1. A member who never gets a listing live
arrives at renewal with nothing to show for the year, and 48.1 per cent of all cancellations
happen in that window.
Money spentNonethese are members already paying, USD 3.86M of live contract value
Money lostNot countedwe cannot yet count listings that never reached the portals
How we worked this out
Every listing on both audited accounts sits at Draft, so neither member has received the syndication the membership sells. We will not extrapolate two accounts to the whole base. One query prices this exactly: the number of live subscriptions whose listings have never reached Active Campaign, and their combined annual value. If that share resembles what these two accounts show, this is the largest priced leak in the report.
What to change
Make the manual path reach the same place the MLS path does. A Draft listing should name the unfinished tab
and link to it, and offer the activate step once complete. The Activate screen should never report that nothing
was found while a quota is in use; it should list the Draft listings and the single thing each one needs. A
visible status ladder would let a member see where a listing stopped.
For the product team
The five statuses already exist in the Manage Listings filter: DRAFT, IN PROGRESS, ACTION NEEDED, ACTIVE CAMPAIGN, INACTIVE CAMPAIGN. The ladder is modelled in the data and never surfaced on the listing or the activation screen.
✓ After the fix
eXp LUXURY
0
1. The listing names the step that is missing→
eXp LUXURY
Finish Tour Submission
Send
2. One tap to the unfinished tab→
eXp LUXURY
✓
Thank you
Success
3. The listing goes live to the portal networkOutcomeMembers receive the distribution they paid for, and can see that they did.How we will knowShare of listings reaching Active Campaign. Today it is 0 of 4 on the audited accounts.
What we could not test, and why
Completing Tour Submission writes to live client data, and the client instructed us to make no changes. We stopped at that boundary. We can evidence that every listing sits at Draft and that no screen names the missing step. We cannot evidence what Tour Submission itself requires. A sandbox account settles it.
3
The product a member pays for never mentions the payment
eXp LuxuryP0Product and billing
14 of 14membership pages return 404
There is no billing page, no subscription page, no membership page, no invoice history and no renewal notice
anywhere inside the member product. We checked this two ways. We requested fourteen likely paths directly, and
every one returned a 404. Then we walked the live navigation: the Settings menu, the one place such a page could
sit, expands to exactly three items, Settings, Edit Profile and Logout, and a sweep of the whole live page for
the words billing, subscription, invoice, renewal, payment or membership returned nothing. The only account
destinations in the product are the agent profile and the profile editor.
The fourteen paths we tested, and what they returned
/settings, /user/ID/settings, /billing, /user/ID/billing, /subscription, /user/ID/subscription, /membership, /user/ID/membership, /account, /user/ID/account, /invoices, /user/ID/invoices, /renew, /my-membership. Every one returned HTTP 404 on 28 September 2026. Settings appears in the navigation and expands to sub items; no billing or membership destination exists under it: expanded live on 29 September 2026, its submenu holds only Settings, Edit Profile and Logout. A full-page text sweep for billing, subscription, invoice, renewal, payment and membership returned zero matches. The dashboard text contains no instance of renew, expire, cancel or billing.
What a member cannot find out from inside the product
What they pay, or what tier they are on beyond a label in the header.
When the membership renews, or that it renews at all.
What the membership delivered: listings published, portals reached, enquiries received.
How to cancel. Which is why cancellation goes through support, and why no reason is ever recorded.
The harm: the membership is invisible for 364 days and then arrives as a charge. That is
the shape of the cliff in leak 1, drawn by the product itself.
Money spentNoneno advertising is involved
Money lostNot countedthe absence causes no direct loss, but it explains leak 1
How we worked this out
We tested fourteen candidate paths inside the member product and all fourteen return 404. A member cannot discover what they pay, when it renews, what they received, or how to leave, from inside the product they pay for. This is unpriced on its own. It is here because it is the reason USD 2,229,013 leaves at renewal without warning.
What to change
Add one page. It shows the plan, the price, the renewal date, the invoice history and a delivery summary for
the current term. Link it from the member name in the header, where every comparable product puts it. Add a
cancellation route on that page, because the alternative is not retention: it is a member cancelling through
support with no reason captured and no chance to offer anything.
4
318 members pay for a luxury marketing membership that excludes the marketing
eXp LuxuryP0Commercial and product
318members on a tier with no syndication
The published plans page states it plainly. Luxury Brand at USD 950 a year: Does not include listing
syndication. Syndication is the LuxVT media engine. It is the thing the whole membership advertises.
318live members on the Brand tier
USD 141,817of contract value on that tier
USD 950a year, syndication excluded
What this means for the member
They joined a programme sold on global exposure and bought the tier that has none of it.
Nothing in the product marks their tier as excluding syndication. The header shows a tier name and an Upgrade link.
At renewal they are asked to pay again for a year in which the headline benefit was never available to them.
The harm: the tier is not mispriced, it is mis-set. A member who wanted exposure and
picked the cheaper option gets a Canva login and a mastermind, then judges the whole programme on that.
Money spentUSD 141,817of contract value sits on a tier with no syndication
Money lostNot countedwe cannot yet split Brand churn from Premium churn at renewal
How we worked this out
The published page is explicit and the tier is working as designed, so this is not a billing error. It is a comprehension and expectation problem: 318 members are paying for a luxury marketing membership whose marketing engine is switched off. What would price it: the renewal rate of Brand members against Premium members, which the ledger can produce in one query and which we would expect to differ sharply.
What to change
Say it in the product, not only on the sales page. A Brand member should see, on the dashboard and on any
listing they create, that syndication is not included on their tier and what it would take to add it. Today the
product shows them an Activate Listings screen that will never work for them and never explains why. Then
reconsider the tier itself: a luxury marketing membership without the marketing is a hard thing to renew.
5
Nobody has ever recorded why a member left
Shared billingP0Billing and support
2,222cancellations, none with a reason
✗ What happens today
eXp LUXURY
1. A member decides to leaveProof2,222 cancelled subscriptions on file, 28 September 2026HarmThe decision is already made before anyone sees it→
eXp LUXURY
Please cancel my membership
2. They contact support, because the product has no cancel routeProofLive test, 28 September 2026. No cancellation flow exists in the product, see leak 3HarmNo question is asked at either exit→
eXp LUXURY
0
Lost here
3. The record is written with no reasonProofAPI read, 28 September 2026. cancel_reason is absent from the subscription schema entirelyHarm2,222 of 2,222 cancellations carry no reason
Why this matters more than its size suggests
The field does not exist on the record. This is structural, not a habit.
Because there is no cancel route in the product, every cancellation goes through a person, and that route asks nothing either.
Win back is almost never attempted: 19 reactivations against 2,222 cancellations.
The harm: the single largest movement in this business, USD 4,458,325
of contract value leaving, has no recorded cause. Every retention decision is an opinion, and no fix can be
proved to have worked.
Money spentNoneno advertising is involved
Money lostNot countedno reason has ever been recorded, so no cause can be sized
How we worked this out
This is the leak that prevents every other leak from being measured, including the ones in this report. 2,222 members have left and the business holds no record of why any of them did. We have shown that 48.1 per cent go at renewal, but the ledger can only tell us when, never why. Zoho Billing already supports custom fields on a subscription and this account uses none, so the first step is configuration rather than development.
What to change
Add a required cancellation reason to the subscription record. Keep it to six options that cannot overlap:
price, not using it, did not get results, moved to a competitor, left the brokerage, other. Add one free text
box asking what would have kept them. Cover both exits. Resist a longer survey: response collapses and the field
stops being trustworthy.
For the billing team
The subscription schema exposes custom_fields and custom_field_hash, both unused on this account. A required picklist plus one text field is configuration. Historic signal can be partly recovered with one question emailed to the last six months of cancellations, which doubles as reactivation outreach.
✓ After the fix
eXp LUXURY
Why are you cancelling?
Submit
1. One required question at the moment of leaving→
eXp LUXURY
What would have kept you?
Send
2. One box: what would have kept you?→
eXp LUXURY
✓
Thank you
Success
3. The reason is stored against the subscriptionOutcomeEvery future cancellation carries a reason and a sentence in the member own words.How we will knowShare of cancellations with a reason recorded. Today it is 0 per cent.
6
One in eight members leaves inside the first month
eXp LuxuryP0Product and onboarding
~223gone within 30 days
The survival curve in leak 1 has two spikes, not one. The second is at renewal. The first is immediate.
Corrected figure. An earlier draft put this at 270 members and
USD 491,579. Checking plan by plan showed that some of those are one time purchases recorded as
subscriptions rather than churn: Course Enrollee alone is 95 cancellations at a median of one day, with none
ever live. Excluding it, genuine early churn is about
223 members and
USD 463,802. Excluding every plan whose
median time to cancel is under thirty days it is about
151 and
USD 383,188. We use the first,
more conservative adjustment below.
✗ The first thirty days
eXp LUXURY
1. Joins and reaches the dashboardProofLive test, 28 September 2026. Onboarding is one of three equal Quick Access cardsHarmThe largest thing on screen is a webinar replay→
eXp LUXURY
↓
Doubt
2. Looks for where to beginProofLive test, 28 September 2026. Launch Your Listing is a collapsed heading below the foldHarmThree collapsed headings, none marked as the starting point→
eXp LUXURY
Enquire
Submit
3. Starts a listing, meets 38 fields across four tabsProofLive test, 28 September 2026. 19 fields on the first tab aloneHarmInternal operations fields appear among them, including a competitor listing ID→
eXp LUXURY
Cancelled within 30 days
Lost here
4. Leaves before month two
The harm: these members pay, look, and go. They never experience the service at all,
which means nothing about the service caused it. The first session did.
Money spentNonethese members were already paying, no ad cost
Money lostUSD 463,802of contract value lost in the first 30 days, all time, adjusted
How we worked this out
270 members (13.2 per cent of all dated cancellations) leave within 30 days of joining, at an average of USD 1,821 each. They never reach the renewal cliff because they never reach month two. The money spent line is their own contract value rather than an advertising figure, because no ad accounts were provided. The second figure prices a quarter of them being saved, not all of them.
What to change
Make the first session produce one finished thing. Today a new member meets a dashboard that sells, then a
38 field form. Replace the first run with a short guided path that creates one listing with the minimum viable
fields and defers everything optional. Name the first milestone and show progress toward it. The measure is not
satisfaction, it is whether a member has one listing live by day thirty.
7
Members are leaving because a card failed, not because they chose to
Shared billingP0Finance and tech
423overdue invoices
✗ What happens today
eXp LUXURY
1. An annual card is charged once every twelve monthsProofAPI read, 28 September 2026. 5,247 of 5,267 subscriptions hold a cardHarmA card has had a year to expire, be reissued or hit a limit→
eXp LUXURY
!
Payment failed
Doubt
2. The charge fails and nothing warns the memberProofLive test, 28 September 2026. No banner or in product signal exists, see leak 3Harm75 subscriptions are in payment failure right now→
eXp LUXURY
0
3. The balance ages and nobody sees itProofInvoice ledger, 28 September 2026. 423 overdue invoices, USD 380,596HarmDunning fell and unpaid rose between our two reads. Nothing recovered→
eXp LUXURY
Lapsed
Lost here
4. The subscription lapses without a decision
The harm: the business is losing members who never decided to leave, and the balance grew
while nobody acted on it.
Money spentNonethese members were already won and already paying
Money lostUSD 227,364of contract value in unpaid, dunning and non renewing right now
How we worked this out
423 invoices are overdue carrying USD 380,596 of balance, counted from the invoice ledger line by line. Separately, subscriptions in unpaid, dunning and non renewing carry USD 227,364 of annual contract value. Almost every subscription holds a card, so these are failed collections rather than unpaid invoices, which is involuntary churn: the member never decided to leave. Between 3 and 28 September the dunning count fell from 31 to 21 while unpaid rose from 44 to 53, so failures are ageing into deeper failure rather than recovering. We have not applied a recovery percentage because we have no data on this client past recovery rate, and a published industry band is not evidence about them.
What to change
In order of return. Warn before the charge: notify at sixty, thirty and seven days when a card expires first,
with one tap to update it. Turn on an account updater so reissued cards refresh with no member action. Spread
retries across days one, three, five, seven and fourteen rather than repeating on the same date. Give the member
somewhere to land, which today does not exist because there is no billing page at all. Before any of it, confirm
the dunning email is being delivered and not suppressed.
A discrepancy worth resolving first
The billing dashboard reports total receivables of USD 435,851. Counting the invoice ledger line by line gives USD 380,596 across 423 overdue invoices. The two disagree by about USD 55,255. We have used the line by line figure throughout because it is verifiable per invoice. The gap should be explained before either number is quoted externally.
8
The premium tier advertises less reach than the cheaper one
LuxVTP0Marketing
60+ vs 80+on the same website
Page
The claim, verbatim
Number
elite.luxvt.com, home
Placement in 80+ international real estate sites in key investor markets
80+
elite.luxvt.com /classic
Digital ad placements across 80+ international luxury real estate publishers
80+
elite.luxvt.com /premier
Placement across 60+ international real estate portals in key investor markets
60+
Premier is the more expensive tier. It advertises fewer portals than Classic. A buyer comparing the two sees
the upgrade offering less.
Three more claims that do not line up
The homepage says Trusted by 10,000+ Elite Agents Worldwide. The billing system holds 2,369 live subscriptions and 5,309 ever created.
Three tier vocabularies are live at once: Classic, Premier and Pro on one site; Luxury Brand, Luxury Premium and Premium Pay at Close on the other; and Classic in the product header.
The page titled Premier describes a product it calls LUXVT PRO Volume, which is also what the Pro page describes.
The harm: the single capability the membership is sold on cannot be stated consistently,
and the tier ladder cannot be compared. An agent deciding between tiers is reading two different products.
Money spentNot countedno analytics were provided for the marketing site
Money lostNot countedwe cannot measure comparison abandonment without funnel data
How we worked this out
Every claim here was read from the live pages on 28 September 2026 and is quoted verbatim. We cannot size the loss because no analytics access was provided for either marketing site. What would price it: sessions that view two or more tier pages and then leave without reaching a form.
What to change
Establish the true portal count once, from the placement contracts, and use that one number everywhere. Pick
one tier vocabulary and apply it to both sites and the product header. Fix the Premier page, which currently
describes the Pro product. Then substantiate or retire the 10,000 agent claim, because the subscription ledger
does not support it.
9
The dashboard sells add-ons above the one action the membership exists for
eXp LuxuryP1Product team
Below the foldand collapsed, on every visit
Member dashboard, live capture 28 September 2026. Two carousels and three Quick Access cards sit above Launch Your Listing, which is a collapsed heading.
What the order of this screen says
The largest element is a webinar replay. The second is a Concierge Services advertisement with its own call to action.
Concierge Services is a paid add on. The member is sold to before they have received what they already bought.
Launch Your Listing, Win The Listing and Master Your Branding are collapsed headings at the bottom, visually identical, none marked as the place to start.
The Onboarding card is genuinely good. It is one of three equal cards, competing with Most Popular for attention.
The harm: the information hierarchy inverts the business economics. The action that
prevents USD 2,229,013 of renewal churn is collapsed at the bottom; the upsell is at the top. A member in
their first week clicks the largest thing, and the largest thing is not the product.
Money spentNonethe traffic is members who already pay
Money lostNot countedno dashboard interaction is tracked
How we worked this out
The dashboard is the first screen on every visit, so its order is the strongest signal the product sends about what matters. We cannot price this because no dashboard interaction is instrumented. What would price it: clicks on each dashboard element, and the share of members who reach Create Listing within their first 30 days.
What to change
Give the dashboard one primary action that changes with the member state. A member with no listing sees Create
your first listing. A member with a Draft sees Finish your listing, and which step. A member with a live campaign
sees its results. Move Concierge Services below that, because selling an add on to a member who has not yet
received the core service is the wrong order commercially as well as experientially.
10
Pay at Close contracts are recorded at the enrolment fee only
Shared billingP1Billing operations
USD 387,500of contract value outside the reported numbers
The published contract for Premium Pay at Close is a USD 500 enrolment fee plus USD 2,500 at the next
closing. The billing system records the USD 500 and nothing else.
155live Pay at Close members
USD 77,540recorded as contract value
USD 387,500contingent value not recorded
The harm: every revenue figure in this business, including the ones in this report,
understates the Pay at Close cohort. It also means nobody can see whether those closings are actually being
collected, because the obligation is not modelled anywhere.
Money spentNoneno advertising is involved
Money lostUSD 387,500of contingent contract value not visible in any report
How we worked this out
155 live Pay at Close subscriptions are recorded at the USD 500 enrolment fee. The published contract adds USD 2,500 at the next closing. The figure shown is the maximum exposure if every member closes, which is why it is contingent rather than owed. We have not added it to any total in this report. What would settle it: how many Pay at Close obligations have been invoiced at closing, and how many are outstanding.
What to change
Model the closing obligation, either as a scheduled charge or as a tracked receivable, so it appears in
reporting and so somebody can tell whether it is being collected. Until then, treat every revenue figure that
includes Pay at Close as a floor and say so wherever it is quoted.
11
Half the platform is links to somewhere else
eXp LuxuryP1Product team
9 of 18navigation items leave the product
Nine of the eighteen items in the member navigation lead off the platform, across six separate domains. The
member is moved between systems that share no session, no visual language and no support route.
Where the nine links go
Canva Enterprise, to the Canva login page rather than a workspace
Members Hub Group, to hub.exprealty.com
Agent Directory, to agents.expluxury.com
Logos and Brand Guidelines, to join.expluxury.com
Luxury Brand Store, to expluxurybrandstore.com
Onboarding Guide, to a Canva design view link
Concierge Services, to join.expluxury.com
Support, to support.expluxury.com
Help, to luxvtsupport.com over an insecure connection
Enumerated from the live navigation, 28 September 2026.
Three things this costs
Two different support systems, Support and Help, with nothing to say which answers what.
The Help link is emitted over an insecure connection, inside the paid product.
The onboarding guide for a USD 2,500 membership is a shared Canva design.
The harm: every boundary is a place the session can end, and none of the work a member
does on somebody else system is visible to the product, so none of it can count as delivery at renewal.
Money spentNoneno advertising is involved
Money lostNot countedcross domain sessions are not measured
How we worked this out
Sizing this needs analytics that follow a member across the six domains, which does not exist. The two support systems can be sized immediately from ticket counts in each.
What to change
Pick one support destination and retire the other. Serve the Help link securely. Replace the Canva onboarding
link with onboarding inside the product, where completion can be measured and can count as delivery. For the
rest, decide which belong inside the product and mark the genuinely third party ones as leaving.
12
The form that creates every listing cannot be completed reliably
Shared platformP1Product team
38fields, three required in name only
Create Listing, first of four tabs, live capture 28 September 2026.
What we measured on the live form
Street Address, City and Price carry an asterisk in their label. None carries a required attribute and none carries aria-required. Required status is painted on, not programmatic.
Two fields have no label a screen reader can reach: the square footage box and its unit selector.
Twenty navigation targets measure 20 pixels tall or less, against a 24 pixel minimum.
The address fields declare an autocomplete value that is not valid, so browsers will not offer to fill them. Agents retype the same addresses by hand.
The harm: a member using a screen reader is not told which fields are mandatory and two
fields are announced with no name at all. For everyone else, address autofill silently does not work on the form
that stands between a member and the only thing the membership delivers.
Money spentNoneno advertising is involved
Money lostNot countedabandonment on this form is not tracked
How we worked this out
This form is the only route to the product core value, so anything that makes it harder to finish is a revenue leak as much as an accessibility one. Pricing it needs form start and form completion events, which the platform does not emit. Those events are named in the instrumentation brief in chapter 7.
What to change
Add the required attribute to the three fields that already claim it visually, and label the square footage
box and its unit selector. Raise navigation targets to at least 24 pixels. Correct the autocomplete values so
browsers can fill the address fields. Then remove from the member view the fields that belong to operations,
listed below.
For the web team
Measured on the live form at app.expluxury.com/user/ID/tour/add, 28 September 2026. Required fields: 0 with the required attribute, 0 with aria-required, 3 with an asterisk in the label. Unlabelled controls: input[name=squareFeet], select[name=unit_of_measurement]. Autocomplete tokens read "property address-line1", "property address-level2", "property postal-code"; "property" is not a valid section token so the whole value is discarded. Operations fields visible to members: orderOwner, productionNotes, tourSiteBcc, tourReseller, feedsListingId, nextHomeListingId. The last is a competitor brokerage identifier. Criteria touched: 1.3.1, 1.3.5, 2.5.8, 3.3.2, 4.1.2.
RBI rulesThis is a screening pass on the conversion journey, not a conformance audit. We report what we measured, on which pages, on which date.
SEBI rulesSafe. SEBI covers investor information, not loan pages.
Dark patternsNo compliance level is claimed for the client.
13
The brochure that is meant to win listings ships with blank fields
Shared platformP0Product and marketing
Blankbeds, baths and MLS on a shareable brochure
The whole proposition is that an agent walks into a listing appointment and impresses a seller. We opened
the seller facing email brochure the platform generates. The template is good. What it fills in is not.
The eXp Luxury email brochure the platform generates for a listing, previewed 28 September 2026. The template design is strong. Price shows, but Bedrooms, Baths, Half Baths and MLS number are all blank, and the agent block below carried placeholder contact details, masked here.
What we found on the generated brochure
The specification block renders with Bedrooms, Baths, Half Baths and MLS number all empty. A seller receiving this sees a luxury brochure that does not say how many bedrooms the house has.
The agent identity block carried placeholder details: a stand-in name, the phone number plus one two three four five six seven eight nine zero, and a nonsense web address. Nothing stopped that brochure being previewed or shared.
There is no validation. The system will preview and let an agent share a brochure with no specs and fake contact details.
The public sample presentation at elite.luxvt.com/sample-presentation, and the member Onboarding Guide, are both Canva embeds, so neither can be tracked, versioned or counted as delivery.
Activate Listings on a 390 pixel phone, 28 September 2026. The member greeting block overlaps the page title.
And on a phone
On a 390 pixel screen the member greeting sits on top of the page heading on every authenticated page we tested.
The dead end from leak 2 is identical on mobile, with the only escape route a wrapped text link rather than a button.
The harm: the seller facing output is the product, and the product can go out broken. An
agent who shares this brochure at a listing appointment shows a seller a luxury document with no bedroom count
and a fake phone number. That is worse than sending nothing, and it is the exact moment the whole membership is
meant to prove itself.
Money spentNoneno advertising is involved
Money lostNot countedbrochure open and share rates are not tracked
How we worked this out
We previewed the generated brochure on a test listing, so the blank fields may partly reflect an unfinished draft. But the finding stands: nothing in the system prevents a brochure with empty specs and placeholder identity from being previewed and shared. A validation gate and a check on how many live brochures currently carry blank fields would size it. The listing website and activity report on a fully activated listing remain unseen, because both audit accounts held only drafts.
What to change
Add validation: a brochure with empty required fields or placeholder contact details should not be
previewable or shareable. Bring the sample presentation and onboarding guide inside the product from Canva so
they can be versioned and counted. Instrument the brochure so an open or a share is recorded against the member,
because a brochure the agent actually used is the strongest thing to show at renewal. Then fix the header
overlap on mobile, which affects every authenticated page.
14
The scoreboard reports growth while the business shrinks
Shared billingP0Leadership
25xswing in the same tile in 25 days
The billing dashboard reports active subscriptions up 15.7 per cent year on year. That figure is accurate and
it is trailing. Monthly net movement has been at or below zero since May 2026.
Month
Net
Signups minus cancellations
Mar 2026
+88
Apr 2026
+26
May 2026
-9
Jun 2026
+1
Jul 2026
-4
Aug 2026
-27
Sep 2026
-6
Net subscription movement by month, signups minus cancellations. Billing ledger, 28 September 2026. Bars are scaled to the March peak of 88.
2,371live subscriptions, down 52 in 25 days
USD 4.46Mof contract value cancelled to date
USD 3.86Mof contract value live today
Zoho Billing dashboard, captured 28 September 2026. The Churn Rate tile reads 2.00% and the LTV tile reads USD 7,153, both stamped On Sep 2026. On 3 September the same LTV tile read USD 180,363. The figure is the platform dividing revenue per user by a month-to-date churn rate, which is why it swings.
Three default measures that mislead on this business
Lifetime value divides by a month to date churn rate, so it is meaningless early in a month.
The month to date churn rate is read as though it were a monthly rate.
A trailing twelve month subscriber count hides a turn that happened five months ago.
The harm: more contract value has now been cancelled in the lifetime of this business
than is currently live, USD 4,458,325 against USD 3,861,237, and the scoreboard has
been reporting growth throughout.
Money spentNoneno advertising is involved
Money lostNot countedwe will not price decisions that have already been taken
How we worked this out
On 3 September 2026 the lifetime value tile read USD 180,363. On 28 September 2026 the same tile on the same business read USD 7,153. Nothing about the business changed. The tile divides average revenue per user by a month to date churn rate, and that rate matured from 0.08 per cent on day three to 2.00 per cent on day twenty eight. USD 143.05 divided by 0.02 is USD 7,152.50. The figure is arithmetic, not measurement, and it reads differently every day of the month.
What to change
Make monthly net movement the headline, because it is the number that turned. Retire the lifetime value tile
or recompute it on trailing twelve month churn and per plan family. Build a scorecard on four measures: net
monthly movement, share of members with a live listing, collection health, and renewal rate at the cliff. Then
ask what was decided while the old number was on screen.
15
The two sites where members sign up and pay have no analytics at all
Acquisition, bothP0Marketing and tech
0 tagson the entire acquisition funnel
We read the live tag configuration on every surface. The product behind the login is tracked. The two sites
where a member browses tiers, chooses a plan and pays are not tracked at all.
Surface
What it is
Analytics found
app.expluxury.com
The member product, behind login
GA4 and Microsoft Clarity live (see leak 18)
www.luxvt.com
The product login
Tag manager present
elite.luxvt.com
Marketing site, all tier pages
Nothing
join.expluxury.com
Where members choose and buy a plan
Nothing
Why this is the reason the signup collapse cannot be explained
Signups fell 86 per cent since October 2025. The pages where that fall happened collect no data, so no one can see at which step it happened.
The product is measured but the product is not where members are lost. They are lost before they ever log in.
Any advertising pointed at these pages cannot be attributed to a signup, because nothing records the arrival.
The harm: the business spends to bring agents to these pages and then measures nothing about
what they do there. The single largest movement in the business, an 86 per cent fall in new members, happened on
surfaces that record no evidence of anyone visiting them.
Money spentNot countedad spend on these pages was not provided
Money lostNot countedthe funnel drop cannot be located without either analytics or the form counts
How we worked this out
Read live on 28 September 2026: elite.luxvt.com and join.expluxury.com carry no Google Tag Manager, no GA4, no data layer and no third party analytics script of any kind. app.expluxury.com carries a live GA4 property. So the acquisition funnel is dark and the product is lit, which is the opposite of what a subscription business needs. Because no analytics exists on these pages, the only available window into the signup collapse is the submission count on the three Zoho quote forms the pages route to.
What to change
Put one tag manager and one analytics property across both marketing sites and the product, so a member can
be followed from first arrival to first login as one journey rather than two disconnected halves. Until that
exists, pull the monthly submission counts from the three Zoho quote forms, which is the only record of funnel
volume the business currently holds. This is cheap and it is the precondition for pricing four other leaks in
this report.
16
There is no way to just sign up. Every path is a form, and they lead to different systems
Acquisition, bothP0Marketing and product
0self-serve signup paths
✗ A prospect tries to become a member
eXp LUXURY
Join eXp Luxury
1. Lands on a marketing pageProofLive test, 28 Sep 2026. elite.luxvt.com and join.expluxury.comHarmTwo marketing sites, different tier names on each→
eXp LUXURY
Doubt
2. Meets three different buttonsProofCTA map, 28 Sep 2026. Get Pricing, Get Free Presentation, ContactHarmEach goes to a different system: a quote form, product registration, a booking scheduler→
eXp LUXURY
Enquire
Submit
3. Every route ends in a Zoho formProofEndpoints read 28 Sep 2026. Applications on one Zoho tenancy, quotes on anotherHarmThe application form is on its 16th version this year→
eXp LUXURY
Application submitted
Lost here
4. Waits for a human to respond
What a prospect actually meets
On one page alone, three buttons go to three systems: a Zoho quote form, the Drupal product registration, and a Zoho Bookings scheduler.
No path lets a prospect choose a plan and pay. Every route is an application or a quote request handled by a person.
The membership application is titled version 16 of 2025, which is a lot of iteration on the one form that turns interest into revenue.
The product registration still lists Free Graphics and Templates as a benefit. That feature is locked on the Classic tier, so the promise breaks on arrival.
The harm: the one journey that creates revenue is the most fragmented in the estate. A ready
buyer cannot buy. They can only apply and wait, across sites that name the tiers differently and forms that live
on two separate systems, none of which is measured (leak 15).
Money spentNot countedno analytics exists on these pages
Money lostNot countedthe drop between button and submission is invisible today
How we worked this out
Traced live on 28 September 2026. From elite.luxvt.com/classic: Get Pricing opens an embedded Zoho quote form, Get Free Presentation goes to www.luxvt.com/register, Contact goes to a Zoho Bookings scheduler. From join.expluxury.com every Join Now goes to a Zoho membership application form on a different Zoho tenancy. Because none of these pages carries analytics, the volume moving through each path is unknown. The Zoho form submission counts are the only way to see it.
What to change
Decide what signup is meant to be. If the model is genuinely application and manual approval, then make it one
application, on one system, reachable by one button, and say clearly that a person will respond and when. If
self-serve is possible for at least the lower tiers, build a real choose-and-pay path, because a business whose
signups fell 86 per cent cannot afford to make the ready buyer wait. Either way, unify the tier names across both
sites first, and remove the locked feature from the list of things registration promises.
17
The behavioural data confirms it: a third of sessions dead-click, a third bounce straight back
Shared platformP0Product team
29.73%of sessions have dead clicks
The client runs Microsoft Clarity on the product. It records what members actually do: where they click, where
they give up, where the interface does not respond. We were given access to it, and it turns several of the
findings above from expert judgement into measured behaviour. The window is short, the last three days, about
333 sessions, so read these as direction confirmed rather than a full baseline.
Microsoft Clarity dashboard for the LUXVT project, last 3 days, captured 29 September 2026. Dead clicks 29.73% of sessions, Quick backs 36.64%, on 333 sessions.
What the members are actually doing
Dead clicks, 29.73% (99 sessions). Nearly one session in three clicks something that does not respond. This is the measured version of the Draft dead end and the unresponsive controls in leaks 2 and 12.
Quick backs, 36.64% (122 sessions). More than a third of sessions hit a page and immediately go back. People are landing somewhere wrong and retreating, which is the measured version of the navigation and hierarchy problems in leaks 9 and 5.
JavaScript errors on 25.66% of sessions (247 errors). Clarity names them: a React render error, "target container is not a dom element" (32%), and "cannot read properties of null reading classList" on a dashboard-alert element (26% and 4%). These are concrete and reproducible, not vague slowness.
Outbound clicks, 59 sessions. This is leak 11 measured: members are clicking off the platform to the six other domains it links to, in nearly one session in five.
7.1% of sessions are on mobile Safari. The mobile header overlap in leak 12 is hitting real iPhone users, not a hypothetical.
Rage clicks and excessive scrolling are both low, 0.30%. So the problem is not members hammering in frustration. It is quieter than that: they click, nothing happens, and they leave.
Microsoft Clarity, most-visited pages, last 3 days. My Listings is the most visited page on every brand. Row 9 is the eXp listing manager in an error state, visited 26 times.
Where they spend their time, and where it breaks
The single most-visited page on the product is My Listings, on all three brands. That is where members live, and it is where leaks 2 and 12 sit.
The eXp listing manager was hit in an error state 26 times in three days. That is the Activate Listings screen from leak 2, failing, measured.
The harm: the behavioural data and the audit agree. The places members spend the most time
are the places that fail, and they fail quietly, by not responding, so a third of sessions dead-click and a third
retreat. None of this shows up in a revenue report until a renewal is refused.
Money spentNoneno advertising is involved
Money lostNot countedClarity measures behaviour, not money; the loss is priced in leaks 1 and 6
How we worked this out
Source: Microsoft Clarity, LUXVT project, last 3 days to 29 September 2026, 333 sessions, 31 bot sessions excluded. Dead clicks 29.73%, quick backs 36.64%, JavaScript errors 25.53%. This is a short window on a recently installed tool, so it confirms direction rather than establishing a baseline. Extending Clarity retention, and adding funnels for the register-to-activate path, would turn this into a measured funnel.
For the web team: the named errors and event counts
JavaScript errors, share of the 247 recorded: 32.39% target container is not a dom element; 28.34% script error; 25.91% cannot read properties of null (reading classList); 4.45% document.getElementById(dashboard-alert).classList is null; 1.62% cannot read properties of null (reading settings). Smart events by session: Submit form 73, Outbound click 59, Upload 33, Log-in 28, Download 9, Subscribe 6, Search 5, Contact us 4. Devices: Chrome 73.96%, Safari 15.38%, MobileSafari 7.10%, Edge 2%. Web Vitals show LCP and INP needing improvement, CLS good.
What to change
Two things, both cheap. First, act on what Clarity already shows: find the dead-click targets on My Listings
and the listing manager and make them respond, and fix the error state that is being hit 26 times in three days.
Second, get more from the tool: extend its data retention, and build a Clarity funnel for register to first
listing to activation, which is the one measured funnel this business could have tomorrow without any new
instrumentation. It is the cheapest way to size leaks 2 and 15.
18
The plan catalogue prices do not match what members are billed
Shared billingP2Billing operations
10plans whose default price is wrong
Correction. An earlier version of this report stated that 98 members were billed between
USD 1 and USD 6 a year, with USD 168,040 at stake. That was wrong and it is withdrawn. Those figures are the
plan default price. Subscriptions carry their own amount, and those amounts are real. We checked every one.
Plan
Catalogue default
Median actually billed
Primary Agent, Australia
USD 2
USD 3,900
Primary Agent, EU
USD 3
USD 2,500
Primary Agent, UK
USD 6
USD 1,500
Primary Agent, New Zealand
USD 5
USD 4,250
Primary Agent, South Africa
USD 5
USD 20,000
Team Member, Canada
USD 1
USD 1,413
Team Member, EU
USD 3
USD 995
Pay at Close, Canada
USD 5
USD 675
Why it still matters, at a smaller size
Anyone creating a subscription from a plan default gets a USD 2 price for a USD 3,900 product.
One Team Member Canada subscription is genuinely billed USD 1. It is the only one in the base.
Any report or forecast built from plan prices rather than subscription amounts will be wrong, in both directions.
The harm: a landmine rather than a live loss. It will produce a real mispriced
subscription the first time someone creates one from the catalogue without checking.
Money spentNoneno advertising is involved
Money lostNot countedno member is currently underbilled except one
How we worked this out
We verified this by reading the billed amount on every subscription across all ten plans rather than trusting the catalogue. That check is what withdrew the earlier finding. The residual exposure is one subscription at USD 1 and the risk of the next one created from a default.
What to change
Set each plan default to the price that plan is actually sold at, so the catalogue stops being a trap. Then
review the single USD 1 subscription and decide whether it is intentional.
7. Why nobody could see this
Five measurement failures explain why a business that turned negative in May is still reported as growing.
No cancellation reason exists on the record. Not empty, absent. 2,222 members have left and the
business holds no record of why any of them did.
The lifetime value tile is arithmetic, not measurement. It read USD 180,363 on 3 September and
USD 7,153 on 28 September, on the same business, because its denominator matured.
The headline subscriber count is trailing. A twelve month window cannot show a turn that happened five
months ago.
The product emits no activation events. No form start, no form completion, no listing status change,
so the single most important journey in the product is invisible.
Nobody had looked at time to cancel. The renewal cliff has been in the data the whole time. It takes
one query to see it, and it reframes the entire retention problem.
The acquisition funnel collects no data. The two sites where members sign up carry no analytics at
all, so the 86 per cent signup collapse happened on surfaces that record nothing. See leak 15.
The instrumentation brief, for the technical team
Events needed before any of this can be measured: create listing started, tab completed with tab name, listing saved as draft, tour submission started, tour submission completed, listing status changed with old and new status, activation attempted, activation blocked with reason, dashboard element clicked. Plus a cancellation reason custom field on the subscription, renewal notice sent and opened, and delivery confirmation on dunning email.
8. The four questions, answered with evidence
The engagement asks four things: why members leave, how to bring more in, how to keep them, and how to grow
what they pay. Here is what the evidence says about each, and the single move that matters most. Every claim
below traces to a finding above and a source: the billing ledger, or Microsoft Clarity, both read this week.
1. Why are members leaving?
When. Not gradually. The pattern is a cliff: 48.1 per cent
of all cancellations fall in the day 330 to 400 renewal window (billing ledger, leak 1), and the median time to
cancel on the main plan is 365 days to the day.
Where. The product fails at the place they live. My Listings is the most visited page and the top exit
page. 29.2 per cent of sessions dead-click, 37.17
per cent bounce straight back, 25.66 per cent throw a JavaScript error (Clarity, leak
18).
What they got. A listing that most likely never left Draft (leak 2), no membership or delivery screen
to show for the year (leak 3), and no warning before the renewal charge.
The honest gap. No cancellation reason is recorded anywhere (leak 4). We can prove when and where they
disengage. The exact why, in their own words, still needs an exit survey.
Answer: they reach renewal with nothing to show, on a product that fails quietly at the
screens they use most.
2. How to bring more members in?
The problem is measured. New signups have fallen 86 per cent from the October 2025 peak (billing).
Why it cannot be diagnosed yet. The two sites where members sign up carry no analytics at all (leak
15), and the path itself is three routes across two systems with no price shown (leaks 8 and 17).
The move. Put a price on the pricing page, collapse signup into one measured path, and add one tag
manager across both marketing sites. The cheapest first step is the Zoho form counts plus a Clarity funnel,
which needs no new instrumentation.
3. How to make them stay?
The cliff is the whole game. Fixing churn is worth more than any other single lever: one percentage
point of renewal rate on the book reaching renewal in the next 180 days is USD 16,049
(billing).
The mechanism is known. No renewal journey exists in the product (leak 3), and the manual listing path
dead-ends before delivery (leak 2).
The move. Build the renewal journey: a membership page that shows what was delivered, a renewal notice
at sixty and fourteen days led by delivery not billing, and a first-run that produces one live listing. Turn on
the cancellation reason so the next quarter can be measured, not guessed.
4. How to grow revenue?
The recoverable money is named. USD 2,229,013 cancels at the renewal cliff
(leak 1). USD 380,596 sits overdue across 423
invoices, most of it involuntary card failure (leak 7). USD 387,500
of Pay-at-Close value is uncounted (leak 14).
The order. Dunning recovery is the fastest cash and needs no product change. Renewal saves are the
largest prize. Tier clarity stops the Brand-tier mismatch (leak 4) quietly eroding trust.
The move. Warn before the card fails, save the renewal, and count what is already owed.
The one line for leadership. This business does not have a demand problem it can
see or a product nobody wants. It has members who pay, receive nothing they can point to, and leave at renewal,
on a platform that fails quietly at the screens they use most. Fix the renewal journey and the activation dead
end, and the same members who are leaving would have a reason to stay.
9. What to do, and what it adds up to
USD 2.23MCancelled at the renewal cliff988 members in a 70 day window, 50 per cent of all contract value ever
lost. All time, read 28 September 2026.
USD 1.88MRevenue lost in 12 months1,045 cancellations,
48.7 per cent of the live book, every year.
USD 760,112Projected to leave by March (scenario)USD 1,604,851 reaches renewal in 180 days at a
47.4 per cent refusal rate. One point of renewal rate is
USD 16,049.
USD 227,364At risk right nowUnpaid, dunning and non renewing subscriptions by their own contract amount, plus
423 overdue invoices carrying USD 380,596.
Not countedListings never deliveredThe mechanism behind the cliff. One query prices it, named in chapter 11.
Every figure is annual contract value taken from the subscription record itself, not an
estimate, and every one is a floor. We have not applied a recovery rate to the at risk figure because we have no
data on this client past recovery. Nothing here prices trust, brand damage or regulatory exposure.
Build the renewal journey. A membership page, a delivery record and a notice at sixty and fourteen
days. This is the only leak on the list that touches USD 2,229,013.
Fix the Draft dead end. It is the reason the renewal has nothing to show.
Turn on the cancellation reason. Configuration, not a build. Until it exists, nothing can be proved.
Make the first session produce one finished thing, because 13 per cent never reach month two.
Warn before the card fails, and give the member somewhere to fix it.
Reorder the dashboard so the core action outranks the add on.
Replace the scoreboard and check what was decided on the old lifetime value.
10. What we did not cover
Named so that absence is a decision rather than an oversight. Sports and Entertainment, Land and Ranch and New
Homes, which are three of the four brands in the billing organisation. The three features locked behind the
Classic tier. Any surface reached only after submitting a form, because we made no writes. The marketing funnel
upstream of signup, because no analytics access was provided. And anything a member would tell us, because no
member has been spoken to.
11. What could change the size of this job
Everything we found that could move a price, in the open. A named risk is a shared risk.
Risk
What we found
If it is true
What settles it
We could not complete a listing submission
Finishing Tour Submission writes to live client data, which we were instructed not to do
The Draft dead end may be a missing field rather than a missing control, which changes the fix
A sandbox account, or written permission to submit one test listing
Leak 2 is not priced
Both audited accounts have zero listings live, but two accounts are not a sample
If the pattern holds across the base it is the largest priced leak in the report
One query: live subscriptions whose listings never reached Active Campaign, and their contract value
No analytics on any surface
We can prove signups fell 86 per cent but not where visitors leave, and no dashboard interaction is tracked
Four leaks stay unpriced that would otherwise carry numbers
Read only access to the analytics property, or confirmation that none exists
Three features are locked on the accounts provided
Graphics and Templates, Social Posting Service and Luxury Landing Page are paywalled on Classic
Findings inside those features are unknown, and registration advertises one of them as free
One Premium or Elite login
The receivables figures disagree
The dashboard reports USD 435,851; the invoice ledger totals USD 380,596
Either could be quoted externally and be wrong by about USD 55,255
An explanation of what the dashboard tile includes that the invoice ledger does not
No member has been spoken to
No interviews, no support ticket export, no survey data, and no cancellation reasons exist
Every statement about why members behave as they do is inference from behaviour
Approval to contact churned and active members, plus twelve months of support tickets
The billing organisation spans four membership brands
57 plans across eXp Luxury, Sports and Entertainment, Land and Ranch and New Homes
Findings are drawn from the Luxury core and may not hold for the other three
A decision on whether the other brands are in scope, then a walk of each
12. How we checked
Dates. Billing ledger read in full on 3 September and again on 28 September 2026. Product walked live
on 28 September 2026.
What we used. Two member accounts provided by the client, one LuxVT Classic and one eXp Luxury Agent
with a Sports and Entertainment membership. Read only access to the billing system. 5,309 subscription records
and about 8,000 invoices were read through the Zoho Billing API and aggregated. Every money and subscription figure in
this report traces to the Zoho Billing screens shown in chapter 2, captured live on 28 September 2026. No
personal data of any member appears in this report, including inside the screenshots, which are captured from
aggregate dashboard views and masked wherever a name could appear.
What we changed. Nothing. Every call was a read. We did not submit a form, dismiss a dialog, create,
edit or delete anything, on the client instruction.
Corrections made during this audit. Six, all reflected above. We marked the claim that entry costs
USD 950 as Not supported, and the claim that the Brand tier excludes syndication as Not testable. Both were our
error: we had checked the billing catalogue and one marketing site, not the published plans page, which states
both outright. We reported that the 60 plus against 80 plus contradiction had been fixed; reading all four tier
pages instead of one showed it has moved rather than gone, and now runs the wrong way. And we have adjusted the
first month churn figure downward after finding one time purchases recorded as subscriptions inside it. The
three earlier corrections stand: We first recorded the Create Listing
form as 38 fields on one flat screen; it is 38 across four tabs. We carried forward two July findings, the
60 plus against 80 plus contradiction and the placeholder alt text, which a live re-check showed have since been
fixed. And we withdrew a finding entirely: an earlier version claimed 98 members were billed USD 1 to USD 6 a
year with USD 168,040 at stake. Reading the billed amount on every one of those subscriptions showed the low
figures are catalogue defaults and the members pay real prices. That finding is now leak 11, at a fraction of
the size.
Every finding, and how it was verified
Each claim below was checked live in the client's own systems on the date shown, either by walking the product and reading the page, or by recomputing the figure from the full billing ledger. Nothing here rests on inference or a single earlier capture.
Leak
Claim
How it was verified
Date
Status
1
Renewal cliff: 48% leave at first renewal, $2.23M
Full billing ledger independently recomputed to zero mismatch
28-29 Sep
Verified
2
Manual listings dead-end at Draft; no activate control
Live: 3 listings all DRAFT, no per-listing activate control, status ladder confirmed
29 Sep
Verified
3
No billing/membership/renewal page in the product
Live: 14 paths all 404, Settings submenu holds only Settings/Edit Profile/Logout, full-DOM term sweep zero hits
29 Sep
Verified
4
318 members on Brand tier which excludes syndication
Live: verbatim 'Does not include listing syndication' on plan-us; 318 members from ledger
29 Sep
Verified
5
Dashboard buries the core action below the upsell
Live: 'Launch Your Listing' at y=1042 (below fold); capture shows collapsed accordion below carousels and Concierge upsell
Live: previewed a generated brochure; specs render blank
28 Sep
Verified
14
LTV tile is an artefact (swings 25x)
Dashboard captured on two dates: $180,363 (3 Sep) vs $7,153 (28 Sep)
3 & 28 Sep
Verified
15
Marketing/signup sites carry no analytics
Live tag reads: no GTM/GA4/Clarity on elite.luxvt or join.expluxury; product carries GTM+Clarity
29 Sep
Verified
16
No self-serve signup; every path is a Zoho form
Live: CTA endpoints resolve to Zoho forms on two tenancies
28-29 Sep
Verified
18
Behavioural: 29% dead clicks, 37% quick backs, 26% JS errors
Live: Microsoft Clarity dashboard, last 3 days, ~333 sessions
29 Sep
Verified, 3-day window
Palette sampled from the live member product on 28 September 2026: near black navigation with a
muted gold accent. Severity colours are the report own and do not follow the client brand.
Ask this reportAnswers only from the audit, with sources
Ask anything about the findings, the numbers, or what to do next. Every answer is drawn from this report and links to where it came from.