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.
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").
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).
Match rate (search → transaction)transaction ÷ search_performedTransactions ÷ searches, as a %.
Higher is bettergood ≥ 20%warn ≤ 2%weight 24
transaction ÷ search_performedTransactions ÷ searches, as a %.
- 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)transactionTransaction count in the last 90 days.
Higher is bettergood ≥ 4warn ≤ 1weight 20
transactionTransaction count in the last 90 days.
- 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 transactiontransactionRecency of buyer activity.
Lower is bettergood ≤ 30 dayswarn ≥ 90 daysweight 18
transactionRecency of buyer activity.
- 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.
GMV — buyer spend (90d)transactionTotal transaction value in the last 90 days.
Higher is bettergood ≥ 500warn ≤ 50weight 16
transactionTotal transaction value in the last 90 days.
- 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)referralReferral signals in the last 180 days.
Higher is bettergood ≥ 1warn 0weight 12
referralReferral signals in the last 180 days.
- 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 eventDays since any event.
Lower is bettergood ≤ 21 dayswarn ≥ 60 daysweight 10
any eventDays since any event.
- 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.
Fill rate (listings → sales)transaction ÷ listing_createdTransactions ÷ listings, as a %.
Higher is bettergood ≥ 30%warn ≤ 3%weight 22
transaction ÷ listing_createdTransactions ÷ listings, as a %.
- 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_requestTransactions ÷ transaction requests, as a %.
Higher is bettergood ≥ 70%warn ≤ 20%weight 14
transaction ÷ transaction_requestTransactions ÷ transaction requests, as a %.
- 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.
Active listings (90d)listing_createdListings created in the last 90 days.
Higher is bettergood ≥ 5warn ≤ 1weight 18
listing_createdListings created in the last 90 days.
- 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)transactionTotal transaction value in the last 90 days.
Higher is bettergood ≥ 1000warn ≤ 100weight 18
transactionTotal transaction value in the last 90 days.
- 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 saletransactionRecency of sales.
Lower is bettergood ≤ 30 dayswarn ≥ 90 daysweight 16
transactionRecency of sales.
- 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_completedWhether the seller created their first listing / finished onboarding in the first week.
Pass / failweight 12
onboarding_completedWhether the seller created their first listing / finished onboarding in the first week.
- 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.
| Signal | Kind | How to send |
|---|---|---|
role | account field | PUT /api/accounts/{id} → role: "buyer" | "seller" |
transaction | event | on each completed transaction — include { "value": 49.90 } for GMV |
search_performed | event | on each buyer search |
listing_created | event | on each seller listing |
transaction_request | event | on 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
- Enrich account data — set
role, GMV, andkind: "person". - Build a custom dashboard — retune weights and thresholds per side.