De marketplacestack

Voor een diensten- of productenmarktplaats:
- Frontend: WeWeb (web) + FlutterFlow (mobiel, indien nodig)
- Database: Supabase (PostgreSQL met RLS)
- API: Xano (boekingslogica, beschikbaarheid, zoeken, meldingen)
- Betalingen: Stripe Connect (marktplaatsuitbetalingen)
- Zoeken: Supabase fulltext-search of Algolia
- Automatisering: Make (bevestigingsmails, meldingen, geschillenflows)

Vervang voor een productenmarktplaats Xano door directe Supabase- en Stripe-API's als de logica eenvoudig is.

De reden dat we voor deze stack kiezen boven een alles-in-één oplossing zoals Sharetribe of Comet is controle. Met WeWeb + Supabase + Xano bezit je het datamodel volledig. Je kunt elke functie bouwen die een door durfkapitaal gefinancierd marktplaatsplatform biedt, custom commissiestructuren, meerdere valuta's, gelaagde verkopersverificatie, zonder te wachten tot een leverancier het uitbrengt. De afweging is bouwtijd: reken op 3-4 extra weken vergeleken met een template-gebaseerde oplossing. Voor de meeste serieuze marktplaatsbedrijven is die afweging het waard.

Het databaseschema

De kerntabellen voor een dienstenmarktplaats:
CREATE TABLE listings (
  id bigserial PRIMARY KEY,
  seller_id uuid REFERENCES auth.users(id),
  title text, description text, category text,
  price_cents integer, currency text DEFAULT 'eur',
  images jsonb, location text,
  is_active boolean DEFAULT true,
  created_at timestamptz DEFAULT now()
);
CREATE TABLE bookings (
  id bigserial PRIMARY KEY,
  listing_id bigint REFERENCES listings(id),
  buyer_id uuid, seller_id uuid,
  status text DEFAULT 'pending',
  amount_cents integer, stripe_payment_intent_id text,
  created_at timestamptz DEFAULT now()
);
CREATE TABLE reviews (
  id bigserial PRIMARY KEY,
  booking_id bigint REFERENCES bookings(id),
  reviewer_id uuid, rating integer,
  body text, created_at timestamptz DEFAULT now()
);

Row Level Security is niet onderhandelbaar op elke tabel. Kopers mogen alleen hun eigen boekingen zien. Verkopers mogen alleen hun eigen listings en binnenkomende boekingen zien. Admins krijgen een service-role key en omzeilen RLS. Stel deze policies in voordat je de frontend bouwt, RLS achteraf toevoegen aan een werkende app duurt twee keer zo lang en introduceert bugs.

Zoeken en discovery

Voor de meeste marktplaatsen is Supabase fulltext-search voldoende bij lancering. In Xano:

GET /api/listings/search
Parameters: query (tekst), category, min_price, max_price, location
Logica: Gebruik Supabase's to_tsvector() fulltext-search op title + description, combineer met categorie- en prijsfilters.

Voor grotere catalogi (10K+ listings) of geo-gebaseerd zoeken (vind aanbieders in de buurt) voeg je Algolia toe. De WeWeb Algolia-plugin maakt deze koppeling eenvoudig.

Zoekkwaliteit is een directe driver van marktplaats-GMV, kopers die vinden wat ze zoeken converteren; wie dat niet doet, vertrekt. Investeer vóór lancering in relevantie-tuning: voeg synoniemenlijsten toe, boost recente listings, en laat hoog beoordeelde verkopers zien bij ambigue zoekopdrachten. De ingebouwde pg_trgm-extensie van Supabase verwerkt fuzzy matching voor typefouten, wat vooral belangrijk is voor mobiele gebruikers die vaak zoektermen verkeerd typen.

Stripe Connect voor marktplaatsbetalingen

Marktplaatsbetalingen gebruiken Stripe Connect, verkopers hebben Stripe-accounts, kopers betalen via jouw platform, en Stripe verzorgt de opsplitsing.

Flow:
1. Verkoper onboardt: doorverwijzen naar Stripe Connect Express-onboarding. Sla hun stripe_account_id op in je database.
2. Koper betaalt: maak een Stripe PaymentIntent aan met application_fee_amount (jouw commissie). De betaling gaat naar het Stripe-account van de verkoper minus jouw fee.
3. Uitbetaling: Stripe betaalt automatisch uit naar de bankrekening van de verkoper, op doorlopende basis.

Implementeer dit in Xano: POST /api/bookings/payment-intent retourneert de client_secret voor het WeWeb-betalingsformulier.

Applicatiefee-structuur: de meeste marktplaatsen rekenen 10-20% van de transactiewaarde als platformfee. Stripe trekt dit automatisch af voordat de fondsen aan de verkoper worden uitbetaald. Jij ontvangt de fee op je Stripe-saldo. Raadpleeg voor gereguleerde sectoren (financiële diensten, zorg) een betalingsjurist voordat je je feestructuur vaststelt, sommige rechtsgebieden vereisen een vergunning als betalingsinstelling als je langer dan 24 uur fondsen aanhoudt.

Tweezijdige marktplaatsdynamiek

Elke marktplaats heeft te maken met het cold-startprobleem: verkopers sluiten zich niet aan zonder kopers, en kopers komen niet zonder verkopers. De meest betrouwbare oplossing is één kant handmatig te seeden voordat je de andere opent. Bij App Studio hebben we vier marktplaatsen gelanceerd, en het patroon dat werkt is aanbod-eerst: werf direct 20-30 verkopers, bied hen gratis of verlaagde toegang aan voor de eerste 3 maanden, en zorg dat listings live staan voordat er enige kopersgerichte marketing is.

De liquiditeitsdrempel, het punt waarop de marktplaats bruikbaar aanvoelt voor kopers, verschilt per categorie. Voor een lokale dienstenmarktplaats (schoonmakers, bijlesdocenten, klussers) heb je minstens 15-20 actieve listings per hoofdcategorie nodig voordat de zoekervaring volledig aanvoelt. Voor een B2B-softwaremarktplaats is 30-40 SaaS-tools met complete profielen het minimum. Onder deze drempel komen kopers op magere zoekresultaten terecht en vertrekken zonder te converteren, wat je vroege data vervuilt.

Retentie aan beide kanten vereist aparte aandacht. Verkopers haken af wanneer boekingen opdrogen; kopers haken af wanneer ze niet vinden wat ze nodig hebben. Volg GMV per verkoper per week als je belangrijkste indicator, een verkoper die 3+ weken zonder boeking zit loopt een hoog churnrisico en verdient persoonlijke opvolging van je team. Geautomatiseerde "boost je listing"-nudges in Make kunnen slapende verkopers heractiveren voordat ze opzeggen.

Betaalescrow en Stripe Connect-architectuur

Volledige escrow, koperfondsen vasthouden tot na de dienstlevering, is een belangrijke vertrouwensdriver voor hoogwaardige of eerste transacties. Stripe Connect ondersteunt dit native via de parameter capture_method: manual op PaymentIntents. De kaart van de koper wordt bij het boeken geautoriseerd, en jij int de fondsen pas nadat beide partijen de voltooiing bevestigen. Dit geeft je 7 dagen om geschillen op te lossen voordat het geld beweegt.

De Xano-workflow voor escrow: POST /api/bookings/{id}/complete triggert een Stripe PaymentIntent-capture. POST /api/bookings/{id}/dispute zet de boeking op disputed-status en pauzeert de capture. Je admin-dashboard handelt de oplossing vervolgens handmatig af. Stripe's dispute-API laat je terugbetalen aan de koper of fondsen vrijgeven aan de verkoper, bouw beide endpoints in Xano en toon ze in je admin-UI.

Implementeer voor marktplaatsen met terugkerende diensten (maandelijkse schoonmaak, wekelijkse bijles) Stripe Subscriptions met een Connect-transferschema in plaats van PaymentIntents per boeking. Het abonnement belast de koper maandelijks; een geplande Make-automatisering triggert een Xano-endpoint om het aandeel van de verkoper te splitsen en over te maken. Dit vermindert het aantal API-aanroepen per transactie en maakt je cashflow voorspelbaarder.

Trust- en veiligheidsfuncties

Een marktplaats zonder vertrouwensinfrastructuur zal falen, zelfs als het product technisch uitstekend is. Vertrouwensfuncties vallen in drie categorieën: identiteitsverificatie, geschillenbeslechting en community-moderatie. Geen van deze zijn optioneel zodra je een betekenisvol transactievolume bereikt, doorgaans rond de 100 boekingen per maand.

Identiteitsverificatie betekent op zijn minst geverifieerde e-mail en telefoonnummer voor alle gebruikers. Voeg voor categorieën met hoger vertrouwen (kinderopvang, toegang tot woningen, financiële diensten) documentverificatie toe via een provider zoals Stripe Identity of Onfido. Deze diensten retourneren een verificatiestatus die je opslaat in de users-tabel en tonen als een "Geverifieerd"-badge op verkopersprofielen. Kopers geven in onze klantdata consequent 2-3x vaker de voorkeur aan geverifieerde verkopers.

Bouw voor geschillenbeslechting een eenvoudig ticketsysteem gekoppeld aan je bookings-tabel. Elk geschilticket heeft een status (open, under_review, resolved_buyer, resolved_seller), een berichtenthread tussen koper en verkoper, en een admin-overrideveld. Route geschillen boven een drempelbedrag (zeg, €100) naar een menselijke reviewqueue. Implementeer onder die drempel een auto-terugbetalingsbeleid, de operationele kosten van het handmatig beoordelen van kleine geschillen overtreffen het verlies van automatische terugbetalingen. Dit beleid moet duidelijk gedocumenteerd zijn in je marktplaatsvoorwaarden.

Marketplace SEO

Marketplace SEO is vooral een programmatische content-uitdaging. Je beste organische verkeer komt van categoriepagina's ("yogadocenten in Berlijn"), listingpagina's ("Privé yogalessen met Anna K.") en locatiepagina's ("diensten bij Prenzlauer Berg"). Elk hiervan heeft een unieke, indexeerbare URL nodig en genoeg unieke content om Google's helpful-contentdrempel te halen.

Genereer categorie- en locatiepagina's programmatisch vanuit je Supabase-data. Een WeWeb-paginatemplate met een dynamische route (/category/[slug]/[city]) haalt live listingdata op uit Xano en rendert het als een statisch cachebare HTML-respons. Voeg LocalBusiness-schema toe aan locatiepagina's, ItemList-schema aan categoriepagina's, en Product-schema aan individuele listings. Deze schematypes maken rich snippets in Google rechtstreeks mogelijk, sterbeoordelingen, prijsklassen en beschikbaarheid in het zoekresultaat.

Listingpagina's met recensies ranken aanzienlijk beter dan listings zonder. Bouw een geautomatiseerd verzoek om een recensie na de boeking in je Make-workflow: 24 uur nadat een boeking als voltooid is gemarkeerd, stuur je de koper een e-mail met een one-click reviewlink. Zelfs een voltooiingspercentage van 20% voor recensies stapelt zich snel op, een marktplaats met 500 voltooide boekingen per maand krijgt 1.200 nieuwe recensies per jaar, die allemaal bijdragen aan de contentdiepte van individuele listingpagina's.

Groei na lancering

De eerste 90 dagen na lancering zijn de periode met de hoogste hefboomwerking voor een marktplaats. Je doel is liquiditeit te bereiken, het punt waarop de marktplaats betrouwbaar werkt voor kopers zonder handmatige tussenkomst van je team. Drie hendels sturen dit: aanbodkwaliteit, koperacquisitie en herhaald gebruik.

Aanbodkwaliteit betekent de verkoperskant in de begindagen meedogenloos curateren. Wijs onvolledige listings af. Bericht verkopers die niet binnen 24 uur op een boeking hebben gereageerd. Feature je beste verkopers op de homepage. Vroege kopers vormen hun indruk van je marktplaats op basis van de eerste 3-5 resultaten die ze zien, als die resultaten middelmatig zijn, komen ze niet terug.

Koperacquisitie voor een marktplaats begint bijna altijd met SEO en betaald zoeken, niet met social media. Verkeer op basis van intentie (mensen die precies zoeken naar wat jij aanbiedt) converteert 5-10x beter dan sociaal verkeer. Draai vanaf dag één Google Ads op je categorietermen met de hoogste intentie en volg de kosten per eerste boeking, niet de kosten per registratie. Herhaald gebruik wordt gedreven door je ervaring na de boeking: bevestigingsmail, herinnering vóór de dienst, verzoek om recensie na de dienst, en een opvolgende "Boek opnieuw"-e-mail 30 dagen later. Bouw deze volledige reeks in Make vóór lancering, het is het verschil tussen een eenmalig transactieplatform en een duurzaam marktplaatsbedrijf.

Verkoper onboarding en dashboard

Verkoperservaring:
1. Registreren → voltooi Stripe Connect-onboarding
2. Listings aanmaken (titel, beschrijving, afbeeldingen, prijs, beschikbaarheid)
3. Boekingen beheren (accepteer/weiger verzoeken, bekijk boekingskalender)
4. Inkomsten bijhouden (totaal uitbetaald, openstaande uitbetalingen, boekingsgeschiedenis)
5. Recensies beheren

Dit alles wordt gebouwd in WeWeb, gekoppeld aan Xano API-eindpunten. Het verkoper-dashboard voegt doorgaans 2-3 weken toe aan een MVP-scope.

Het verkoper-dashboard is waar marktplaatsretentie wordt gewonnen of verloren. Verkopers die duidelijk hun inkomsten, aankomende boekingen en beoordelingsscores kunnen zien, blijven betrokken. Verkopers die na een trage week naar een leeg dashboard staren, deactiveren stilletjes hun listings. Bouw eerst de inkomstensectie, het is de emotioneel belangrijkste metric voor verkopers en het makkelijkst om visueel aantrekkelijk te maken. Een simpel staafdiagram van wekelijkse inkomsten in WeWeb, met een chart-component gekoppeld aan een Xano-aggregatie-endpoint, kost een halve dag om te bouwen en betaalt zich uit in verkopersretentie.

Lanceringschecklist

Voor je een marktplaats lanceert:
☑ RLS-policies op alle tabellen (kopers kunnen elkaars privégegevens niet zien, verkopers kunnen elkaars stripe_account_id niet zien)
☑ Stripe webhook-handler voor betalingsevents (bevestiging, geschillen, terugbetalingen)
☑ E-mailmeldingen voor alle statuswijzigingen van boekingen (Make-automatisering)
☑ Admin-dashboard voor geschillenbeslechting
☑ Algemene voorwaarden en marktplaatsbeleid
☑ Loadtest met 100 gelijktijdige gebruikers vóór lancering

Een veelgemaakte fout: lanceren zonder het admin-dashboard. Binnen de eerste week van een live marktplaats moet je handmatig een boekingsgeschil oplossen. Bouw de adminhulpmiddelen voordat je live gaat.

Test daarnaast de volledige cyclus van koper tot uitbetaling met een echte transactie vóór lancering, belast een echte kaart, voltooi de boeking, trigger een uitbetaling naar een test-Stripe Connect-account, en verifieer dat de fondsen aankomen. Stripe's sandboxmodus is uitstekend, maar kan niet elke edge case in je Xano-logica opvangen. Een testtransactie van €1 ving bij een van onze marktplaatslanceringen een timingbug in een webhook op die op schaal dubbele afschrijvingen zou hebben veroorzaakt. Die test van 10 minuten voorkwam een catastrofaal productie-incident.