A complete reference for marketplace analytics. All events — from listing creation to completed transaction — with parameters, data types, and data layer examples you can copy into your tracking plan.
Marketplace tracking is fundamentally different from standard e-commerce. You have two user types — buyers and sellers — with separate funnels that need to converge at a transaction. Most analytics setups treat marketplaces like regular online stores and miss half the picture. This reference gives you a structured event schema that covers both sides of the marketplace equation.
I’ve applied this schema across property rental platforms, freelance marketplaces, and B2B procurement sites in Europe. The structure works for any two-sided platform — whether you’re matching supply and demand for apartments, services, or products.
Marketplace Funnel Overview
Marketplace analytics tracks two parallel funnels — supply (sellers/providers) and demand (buyers/seekers) — that meet at the transaction point.
| Stage | Supply-Side Events | Demand-Side Events | Metric |
|---|---|---|---|
| Discovery | listing_created |
search_performed, listing_viewed |
Liquidity, search-to-view rate |
| Evaluation | listing_updated, inquiry_received |
listing_saved, inquiry_sent |
Save rate, inquiry rate |
| Transaction | booking_confirmed, offer_accepted |
booking_requested, offer_made |
Conversion rate, GMV |
| Fulfillment | order_fulfilled, payout_received |
review_submitted, dispute_opened |
Completion rate, NPS |
Search & Discovery Events
Search is the primary conversion driver in any marketplace. Tracking what buyers search for, how they filter results, and what they click reveals both demand patterns and supply gaps.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
search_performed |
search_term |
string | User submits a search query |
results_count |
number | ||
search_category |
string | ||
location |
string | ||
filter_applied |
filter_type |
string | User applies a search filter |
filter_value |
string | ||
results_count |
number | ||
sort_changed |
sort_method |
string | User changes result sorting |
previous_sort |
string | ||
listing_impression |
listing_id |
string | Listing card visible in search results |
listing_title |
string | ||
list_position |
number | ||
listing_price |
number | ||
seller_id |
string |
The search_performed event with results_count = 0 is critical for marketplace health. Zero-result searches directly indicate unmet demand — if people search for “dog walker Berlin Mitte” and get nothing, you know exactly where to focus supply acquisition.
Track filter_applied to understand what attributes matter most to buyers. When I built analytics for a European rental marketplace, filter data showed that 78% of users filtered by price range before anything else, followed by location radius. That insight shifted the product team’s priority from building more filter options to improving the price and map UX.
Data Layer Example: Search Performed
window.dataLayer.push({ "event": "search_performed", "search_term": "web developer", "results_count": 34, "search_category": "freelancers", "location": "munich" });
Listing Interaction Events
Once a buyer finds a listing, these events track the evaluation journey — from first view to saving, comparing, and contacting the seller. This is where most marketplace drop-offs happen.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
listing_viewed |
listing_id |
string | User opens listing detail page |
listing_title |
string | ||
listing_category |
string | ||
listing_price |
number | ||
currency |
string | ||
seller_id |
string | ||
source |
string | ||
listing_saved |
listing_id |
string | User saves/favorites a listing |
listing_price |
number | ||
saved_count |
number | ||
photo_viewed |
listing_id |
string | User swipes through listing photos |
photo_index |
number | ||
total_photos |
number | ||
seller_profile_viewed |
seller_id |
string | User views seller/provider profile |
seller_rating |
number | ||
from_listing_id |
string | ||
listing_shared |
listing_id |
string | User shares a listing externally |
share_method |
string |
The source parameter on listing_viewed tells you where the buyer came from: search_results, category_browse, recommendation, saved_list, direct_link, or email_alert. This is essential for understanding which discovery channels produce the highest view-to-booking rates.
Track photo_viewed carefully — listings where users view 3+ photos convert at significantly higher rates than those where users view only the thumbnail. When I analyzed this for a vacation rental platform, the correlation was striking: listings with 8+ photos and where users viewed at least half of them had a 3.2x higher booking rate than the platform average.
Messaging & Inquiry Events
In many marketplaces, the path to transaction goes through messaging. Tracking conversations between buyers and sellers reveals trust-building patterns and conversion bottlenecks.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
inquiry_sent |
listing_id |
string | Buyer sends first message about listing |
seller_id |
string | ||
inquiry_type |
string | ||
listing_price |
number | ||
inquiry_replied |
listing_id |
string | Seller responds to inquiry (server-side) |
response_time |
number | ||
seller_id |
string | ||
message_sent |
conversation_id |
string | Any message in ongoing conversation |
sender_type |
string | ||
message_count |
number | ||
contact_revealed |
listing_id |
string | Phone/email shown (if gated) |
contact_type |
string |
The response_time parameter (in minutes) on inquiry_replied is one of the most important marketplace health metrics. Sellers who respond within 1 hour typically see 2-3x higher conversion rates than those who respond after 24 hours. Track this server-side and use it to build seller quality scores.
Use sender_type values of buyer or seller on message_sent. The message count per conversation before transaction is a key metric — too many messages suggests the listing lacks information; too few might indicate the platform’s trust mechanisms (reviews, verification badges) are working well.
Booking & Transaction Events
These events track the actual conversion — when browsing becomes buying. For marketplaces, this often involves multiple steps: request, confirmation, payment, and fulfillment.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
booking_requested |
listing_id |
string | Buyer initiates booking/purchase |
booking_value |
number | ||
currency |
string | ||
booking_dates |
string | ||
guest_count |
number | ||
booking_confirmed |
booking_id |
string | Seller accepts the booking (server-side) |
listing_id |
string | ||
booking_value |
number | ||
time_to_confirm |
number | ||
booking_rejected |
booking_id |
string | Seller declines the booking (server-side) |
reject_reason |
string | ||
payment_completed |
booking_id |
string | Payment processed successfully |
transaction_value |
number | ||
currency |
string | ||
payment_method |
string | ||
platform_fee |
number | ||
offer_made |
listing_id |
string | Buyer makes a price offer |
offer_amount |
number | ||
listing_price |
number | ||
offer_accepted |
listing_id |
string | Seller accepts price offer |
final_price |
number | ||
negotiation_rounds |
number |
The platform_fee parameter on payment_completed is what separates marketplace analytics from standard e-commerce. Your actual revenue is the fee, not the gross merchandise value (GMV). Always track both so your dashboards can show GMV for market size and platform fee for actual business performance.
For marketplaces with negotiation (classifieds, freelance, B2B), the offer_made and offer_accepted events reveal pricing dynamics. Track the ratio between offer_amount and listing_price to understand how much buyers expect to negotiate — and negotiation_rounds to see how quickly deals close.
Data Layer Example: Payment Completed
window.dataLayer.push({ "event": "payment_completed", "booking_id": "BK-2026-00451", "transaction_value": 850.00, "currency": "EUR", "payment_method": "card", "platform_fee": 127.50 });
Listing Management Events (Supply Side)
The supply side is where many marketplace analytics setups fall short. Tracking how sellers create, manage, and optimize their listings tells you about marketplace health and supply quality.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
listing_created |
listing_id |
string | Seller publishes a new listing |
listing_category |
string | ||
listing_price |
number | ||
photo_count |
number | ||
description_length |
number | ||
seller_id |
string | ||
listing_updated |
listing_id |
string | Seller edits an existing listing |
fields_changed |
string | ||
price_change |
number | ||
listing_deactivated |
listing_id |
string | Seller removes or pauses listing |
deactivation_reason |
string | ||
days_active |
number | ||
listing_promoted |
listing_id |
string | Seller pays for listing promotion |
promotion_type |
string | ||
promotion_cost |
number | ||
payout_received |
payout_amount |
number | Seller receives funds (server-side) |
booking_id |
string | ||
payout_method |
string |
Track photo_count and description_length on listing_created to measure listing quality at creation time. These are strong predictors of conversion — listings with fewer than 3 photos or descriptions under 100 characters almost always underperform. Use this data to build smart onboarding prompts that nudge sellers toward complete listings.
The listing_promoted event is a revenue line for many marketplaces. Track promotion_type values like featured, top_of_search, highlighted, or category_spotlight. Combine promotion spend with booking data to calculate promoted-listing ROI for sellers — a metric that drives upsell conversations.
Review & Trust Events
Trust is the currency of marketplaces. Reviews, ratings, and verification events build the social proof that makes strangers comfortable transacting with each other.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
review_submitted |
booking_id |
string | Buyer leaves a review |
rating |
number | ||
review_length |
number | ||
has_photos |
boolean | ||
days_after_booking |
number | ||
review_reply |
booking_id |
string | Seller responds to a review |
original_rating |
number | ||
response_time |
number | ||
identity_verified |
verification_type |
string | User completes identity check |
user_type |
string | ||
dispute_opened |
booking_id |
string | Buyer or seller opens a dispute |
dispute_type |
string | ||
dispute_value |
number | ||
opened_by |
string | ||
dispute_resolved |
booking_id |
string | Dispute reaches resolution |
resolution_type |
string | ||
days_to_resolve |
number |
The days_after_booking parameter on review_submitted reveals the optimal review request timing. Most marketplaces find that reviews submitted within 3 days are longer, more detailed, and have higher ratings than those submitted after a week. Use this data to optimize your review reminder emails.
Track dispute_type values like not_as_described, no_show, cancellation, quality_issue, or payment_dispute. Dispute patterns often reveal systemic issues — a spike in “not as described” disputes in a specific category signals a listing quality problem that better photo requirements or descriptions could solve.
Complete Event Map
All marketplace events at a glance, organized by user type and funnel stage.
| Side | Event Name | Source | Key Event? |
|---|---|---|---|
| Demand | search_performed |
Client | No |
filter_applied |
Client | No | |
sort_changed |
Client | No | |
listing_impression |
Client | No | |
listing_viewed |
Client | No | |
listing_saved |
Client | No | |
photo_viewed |
Client | No | |
seller_profile_viewed |
Client | No | |
listing_shared |
Client | No | |
inquiry_sent |
Client | Yes | |
booking_requested |
Client | Yes | |
offer_made |
Client | Yes | |
payment_completed |
Client/Server | Yes | |
review_submitted |
Client | No | |
dispute_opened |
Client | No | |
| Supply | listing_created |
Client | Yes |
listing_updated |
Client | No | |
listing_deactivated |
Client | No | |
listing_promoted |
Client | No | |
inquiry_replied |
Server | No | |
booking_confirmed |
Server | Yes | |
booking_rejected |
Server | No | |
offer_accepted |
Server | Yes | |
payout_received |
Server | No | |
review_reply |
Client | No | |
| Both | message_sent |
Client | No |
contact_revealed |
Client | No | |
identity_verified |
Server | No | |
dispute_resolved |
Server | No |
GTM Implementation Guide
Here’s how to set up the core marketplace events in Google Tag Manager. Supply-side and trust events are mostly server-side — focus your GTM implementation on demand-side interactions.
| Event | GTM Tag Name | Trigger Type | Notes |
|---|---|---|---|
search_performed |
GA4 Event – search_performed | Custom Event (dataLayer) | Push from search handler after results load |
listing_viewed |
GA4 Event – listing_viewed | Page View or Custom Event | Fire on listing detail page load |
listing_saved |
GA4 Event – listing_saved | Click – All Elements | Filter by save/favorite button |
inquiry_sent |
GA4 Event – inquiry_sent | Custom Event (dataLayer) | Fire on message form success callback |
booking_requested |
GA4 Event – booking_requested | Custom Event (dataLayer) | Fire after booking form submission confirmed |
payment_completed |
GA4 Event – payment_completed | Custom Event (dataLayer) | Fire on payment success page/callback |
listing_created |
GA4 Event – listing_created | Custom Event (dataLayer) | Fire after listing publish confirmation |
Marketplace-Specific Metrics
Standard web analytics metrics don’t tell the full marketplace story. These calculated metrics — derived from the events above — are what actually matter for marketplace health.
| Metric | Formula | Healthy Range |
|---|---|---|
| Search-to-view rate | listing_viewed / search_performed |
30-60% |
| View-to-inquiry rate | inquiry_sent / listing_viewed |
5-15% |
| Inquiry-to-booking rate | booking_requested / inquiry_sent |
20-40% |
| Booking acceptance rate | booking_confirmed / booking_requested |
70-90% |
| Seller response rate | inquiry_replied / inquiry_sent |
80-95% |
| Avg. seller response time | avg(response_time) from inquiry_replied |
< 4 hours |
| Listing quality score | f(photo_count, description_length, rating) |
Custom |
| Review rate | review_submitted / payment_completed |
30-60% |
| Dispute rate | dispute_opened / payment_completed |
< 3% |
Validation Checklist
Implementation Checklist
listing_viewedincludes thesourceparameter to track discovery channelsearch_performedcaptures zero-result searches (results_count = 0)payment_completedtracks bothtransaction_value(GMV) andplatform_feebooking_confirmedandbooking_rejectedare server-side, not client-sideinquiry_repliedincludesresponse_timein minuteslisting_createdcaptures quality signals (photo_count,description_length)- All currency values use ISO 4217 codes (EUR, not €)
- Seller IDs are anonymized (no PII in analytics)
- Events work for both logged-in and guest users
- Server-side events include GA4
client_idfor attribution - Test complete buyer journey: search → view → inquire → book → pay → review
FAQ
How do I track both buyer and seller funnels in one GA4 property?
Use a single GA4 property with a user_type user property set to buyer, seller, or both. Create separate GA4 audiences for each type. This lets you build side-by-side funnel reports without maintaining two analytics implementations. Set the user property on login and update it if a user switches roles.
Should I use GA4 e-commerce events for marketplace transactions?
Partially. Use view_item for listing_viewed and purchase for payment_completed if you want GA4’s built-in e-commerce reports. But add custom events for marketplace-specific actions like inquiry_sent, booking_requested, and listing_created that GA4’s e-commerce model doesn’t cover. The hybrid approach gives you standard reports plus marketplace insights.
What is the most important marketplace metric to track?
Liquidity — the percentage of listings that result in at least one transaction within a given time period. Calculate it by comparing listing_created events against booking_confirmed events for those same listings. Low liquidity means either insufficient demand or overpriced supply. This single metric tells you more about marketplace health than any conversion funnel.
How do I handle tracking when the same user is both buyer and seller?
Track a user_type parameter on each event rather than assigning a single role to the user. A freelancer who also hires other freelancers fires listing_created events as a seller and booking_requested as a buyer. The event-level user_type parameter lets you attribute each action correctly without forcing users into one category.
How do I track marketplace supply-demand balance by category?
Compare search_performed counts per category (demand signals) against listing_created counts per category (supply signals). Categories where searches significantly outnumber active listings have supply gaps — these are your growth opportunities. Categories where listings vastly outnumber searches have oversupply and likely need demand-side marketing.
Related Guides on EU-Medin
- E-commerce Event Schema: The Complete Reference
- GA4 Event Naming Conventions: A Practical Guide
- Server-Side Tracking: When and How to Use It
- SaaS Event Schema: The Complete Reference
- Lead Gen Event Schema: The Complete Reference
- Content & Media Event Schema: The Complete Reference
- UTM Parameters: A Complete Strategy Guide
- B2B Event Schema: The Complete Reference
Further Reading
- GA4 Recommended Events Reference — Google Analytics
- GA4 Measurement Protocol — Google Analytics
- Marketplace Metrics That Matter — Andreessen Horowitz
- Marketplace Liquidity — NFX
Product Analytics Specialist based in Munich. Helping teams implement clean, actionable analytics since 2015.