Marketplace template (two-sided)

The two-sided Marketplace template — separate buyer and seller health models governed by liquidity / match rate, GMV, and responsiveness.

A marketplace has two customers with opposite churn models: a buyer churns when they can't find a match; a seller churns when their listings don't sell. So the template ships one bundle per side, and you tag each account with a role of buyer or seller. The governing metric on both sides is liquidity — the match / fill rate — because most marketplaces fail when they can't maintain it.

Split accounts by role

A single tenant holds both sides. Set role: "buyer" or role: "seller" on each account via the account upsert, and provision the matching template (Marketplace — buyer or seller). Value is tracked as GMV (valueBasis: "gmv").

How a value becomes a score

Each component maps a raw value to a 0–100 score at its good / warn thresholds. Rate components (match, fill, response) use the generic ratio op; GMV uses sum_payload. Overall health is the weight-proportional average, banded Healthy ≥ 80 · Watch ≥ 60 · Risky ≥ 40 · Cold < 40. Buyer and seller are independent 100-weight bundles.

Buyer / demand side

The buyer's health is liquidity + repeat + spend. Match rate is the make-or-break signal — a buyer who searches without finding leaves — followed by repeat rate, recency, and GMV.

Evidence: liquidity is "the most critical aspect of a marketplace; most marketplaces fail because they never reach or maintain it" (a16z); the demand-side flywheel is driven by repeat purchase + referral, and GMV retention is the under-watched health metric (a16z – GMV retention).

3 signalscombined weight 62≈62% of score
Match rate (search → transaction)transaction ÷ search_performed

Transactions ÷ searches, as a %.

Higher is bettergood ≥ 20%warn ≤ 2%weight 24
How we collect it
Send `search_performed` on each search and `transaction` on each completed purchase; the `ratio` op divides them.
How to read it
Raw value is search-to-transaction conversion. ≥ 20% scores 100; ≤ 2% scores 30.
How to analyze it
Liquidity is the most critical aspect of a marketplace — most marketplaces fail because they never reach or maintain it. A buyer who searches but can't find a match leaves.
What to do
Fix the supply gap behind low match rates — inventory depth, relevance, or geography for the searches that fail.
Tune it
Anchor `good`/`warn` to your category's realistic conversion; a high-consideration marketplace converts far lower than an impulse one. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Repeat transactions (90d)transaction

Transaction count in the last 90 days.

Higher is bettergood ≥ 4warn ≤ 1weight 20
How we collect it
Same `transaction` event, counted over 90 days.
How to read it
Raw value is the transaction count. 4+ scores 100; a single transaction scores 30.
How to analyze it
Repeat purchasing is the demand-side flywheel — a one-time buyer hasn't formed the habit that sustains GMV.
What to do
Drive the second and third transaction with reminders, saved searches, and category cross-sell.
Tune it
Set the window to your marketplace's natural purchase cadence. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Days since last transactiontransaction

Recency of buyer activity.

Lower is bettergood ≤ 30 dayswarn ≥ 90 daysweight 18
How we collect it
Derived from the latest `transaction` event.
How to read it
Raw value is days since the last transaction. ≤ 30d scores 100; ≥ 90d scores 30.
How to analyze it
A lengthening gap between transactions is the earliest buyer-lapse signal.
What to do
Re-engage as recency crosses your repeat interval with fresh, relevant supply.
Tune it
Match good/warn to how often buyers naturally return in your category. Weight, thresholds, and the metric spec are all editable in Settings → Components.
3 signalscombined weight 38≈38% of score
GMV — buyer spend (90d)transaction

Total transaction value in the last 90 days.

Higher is bettergood ≥ 500warn ≤ 50weight 16
How we collect it
Put the transaction amount on the payload as `value`; the `sum_payload` op totals it.
How to read it
Raw value is summed GMV, banded by your thresholds.
How to analyze it
GMV retention is the marketplace health metric most teams ignore — a buyer whose spend is sliding is churning in value before they churn in logins.
What to do
Watch high-GMV buyers for spend drops; they're the highest-value win-back segment.
Tune it
Set the band from your average order value × expected orders per quarter. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Referrals (180d)referral

Referral signals in the last 180 days.

Higher is bettergood ≥ 1warn 0weight 12
How we collect it
Send a `referral` event when a buyer refers someone.
How to read it
Any referral scores 100; none scores the floor.
How to analyze it
The demand-side flywheel is driven by repeat purchase and referral — referrers are advocates who churn far less.
What to do
Prompt happy repeat buyers to refer at their peak-satisfaction moment.
Tune it
Keep the weight modest since referrals are sparse. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Account silenceany event

Days since any event.

Lower is bettergood ≤ 21 dayswarn ≥ 60 daysweight 10
How we collect it
Computed from every event on the account.
How to read it
Raw value is days since the last activity of any kind. Recent activity scores high.
How to analyze it
Even before transactions stop, a buyer who stops searching and browsing is drifting off the platform.
What to do
Re-engage before silence hardens; pair with recency for the full picture.
Tune it
Tighten for high-frequency marketplaces. Weight, thresholds, and the metric spec are all editable in Settings → Components.

Seller / supply side

The seller's health is utilization + supply depth + earnings. Fill rate (do listings sell?) and responsiveness govern liquidity from the supply side; active listings and earnings show whether the seller is invested and paid.

Evidence: supply-side liquidity (fill / utilization rate) is the governing marketplace metric (a16z glossary); sellers stay where they earn — declining earnings is the strongest supply-side churn tell.

2 signalscombined weight 36≈36% of score
Fill rate (listings → sales)transaction ÷ listing_created

Transactions ÷ listings, as a %.

Higher is bettergood ≥ 30%warn ≤ 3%weight 22
How we collect it
Send `listing_created` on each listing and `transaction` on each sale; the `ratio` op divides them.
How to read it
Raw value is listing-to-sale conversion. ≥ 30% scores 100; ≤ 3% scores 30.
How to analyze it
Supply-side liquidity: listings that never sell are wasted effort, and a seller who doesn't sell churns.
What to do
Help low-fill sellers with pricing, presentation, and demand matching before they give up.
Tune it
Set the band to your category's healthy sell-through rate. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Response / acceptance ratetransaction ÷ transaction_request

Transactions ÷ transaction requests, as a %.

Higher is bettergood ≥ 70%warn ≤ 20%weight 14
How we collect it
Send `transaction_request` on each inbound request and `transaction` on acceptance.
How to read it
Raw value is the acceptance rate. ≥ 70% scores 100; ≤ 20% scores 30.
How to analyze it
Slow or declining sellers strangle liquidity for the whole marketplace — responsiveness is a supply-quality signal.
What to do
Nudge unresponsive sellers; surface the revenue they're leaving on the table.
Tune it
Set the band to your marketplace's service expectations. Weight, thresholds, and the metric spec are all editable in Settings → Components.
4 signalscombined weight 64≈64% of score
Active listings (90d)listing_created

Listings created in the last 90 days.

Higher is bettergood ≥ 5warn ≤ 1weight 18
How we collect it
Send `listing_created` when a seller publishes a listing.
How to read it
Raw value is the listing count. 5+ scores 100; ≤ 1 scores 30.
How to analyze it
Supply depth is the seller's investment in the platform — a seller who stops listing has one foot out the door.
What to do
Prompt inactive sellers to relist; make listing fast and rewarding.
Tune it
Set the band to a healthy listing cadence for your category. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Earnings — GMV captured (90d)transaction

Total transaction value in the last 90 days.

Higher is bettergood ≥ 1000warn ≤ 100weight 18
How we collect it
Put the sale amount on the `transaction` payload as `value`; the `sum_payload` op totals it.
How to read it
Raw value is summed earnings, banded by your thresholds.
How to analyze it
Declining earnings is the strongest seller-churn tell — sellers stay where they make money.
What to do
Intervene on earnings drops with demand, promotion, or pricing help before the seller leaves.
Tune it
Set the band from your sellers' typical quarterly take. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Days since last saletransaction

Recency of sales.

Lower is bettergood ≤ 30 dayswarn ≥ 90 daysweight 16
How we collect it
Derived from the latest `transaction` event.
How to read it
Raw value is days since the last sale. ≤ 30d scores 100; ≥ 90d scores 30.
How to analyze it
A seller who stops selling stops logging in — recency of sales predicts supply-side churn.
What to do
Reach out as the gap grows; a dormant seller is often one good sale away from re-engaging.
Tune it
Match good/warn to your category's normal sales cadence. Weight, thresholds, and the metric spec are all editable in Settings → Components.
Onboarding / first listingonboarding_completed

Whether the seller created their first listing / finished onboarding in the first week.

Pass / failweight 12
How we collect it
Send `onboarding_completed` when the seller publishes their first listing / finishes setup.
How to read it
Completed within 7 days of signup → 100; otherwise a low fixed score. A binary activation gate.
How to analyze it
A seller who never posts a first listing never activates — the first week is decisive for supply.
What to do
Make first-listing frictionless and recover stalled seller onboarding fast.
Tune it
This is a fixed-score activation signal — adjust its weight, not a threshold. Weight, thresholds, and the metric spec are all editable in Settings → Components.

Sending the data

Tag accounts with a role via the upsert; send liquidity events via the SDK or the HTTP API; map your names in Settings → Event map.

SignalKindHow to send
roleaccount fieldPUT /api/accounts/{id}role: "buyer" | "seller"
transactioneventon each completed transaction — include { "value": 49.90 } for GMV
search_performedeventon each buyer search
listing_createdeventon each seller listing
transaction_requesteventon each inbound request to a seller

Common raw names (transaction.completed, search.performed, listing.created, booking.requested, …) are pre-mapped, so most marketplaces resolve out of the box.

Next