Ik richtte Global Pet Sitter mede op met mijn vriend Geert. Twee developers, samen meer dan 10 jaar housesitting-ervaring, die iets transparants en community-gedreven probeerden te bouwen. Het begon als een simpel idee en eerlijk gezegd werd het een van de meest leerzame ervaringen van mijn leven
Waarom We Het Bouwden
We waren zelf jarenlang housesitters. Gebruikten platforms als TrustedHousesitters en Nomador. En eerlijk gezegd raakten we gefrustreerd
De problemen stapelden zich op:
- kosten die de pan uit rijzen - TrustedHousesitters introduceerde een boekingsvergoeding van $12 per sit bovenop het jaarlijkse lidmaatschap. Voelde als afzetterij van de community
- klantenservice die niet reageert - e-mails worden niet beantwoord, telefonische support verwijderd, alleen maar chatbots. Als er iets misgaat tijdens een sit, sta je er alleen voor
- reviewsystemen die niet werken - valse reviews kunnen niet verwijderd worden, zelfs niet met bewijs. Geen verantwoording als hosts of sitters zich misdragen
- geen echte screening - achtergrondcontroles zijn vrijwillig en worden door de sitter betaald. Het platform onderneemt minimale actie, zelfs wanneer diefstal of verwaarlozing van huisdieren wordt gemeld
We lazen steeds dezelfde klachten op Trustpilot en Sitejabber. TrustedHousesitters heeft een 2,7/5 beoordeling op Sitejabber met meer dan 1000 reviews. Mensen die diefstal, materiële schade, last-minute annuleringen beschrijven, en een platform dat "onderzocht maar weigerde actie te ondernemen"
Iets dat begon als community-gericht werd overgecommercialiseerd. En wij dachten, misschien kunnen we het beter doen
De missie was duidelijk: iets transparants bouwen waar diereneigenaren en oppassen konden connecten zonder al die frictie. Klinkt simpel toch? Haha
De Tech Stack
We kozen voor Next.js 16 (App Router + Turbopack), Convex voor de real-time backend, en Clerk voor authenticatie. Tailwind voor styling want het leven is te kort om CSS vanaf nul te schrijven
Waarom Convex? Real-time updates uit de doos. Wanneer een sitter zich aanmeldt of een bericht binnenkomt, zie je het meteen. Geen websocket-setup, geen polling, geen kopzorgen. Het schema is gedefinieerd in TypeScript, queries zijn type-safe, en deployments werken gewoon
// zo clean zijn Convex queriesExport const getApplicationsByAssignment = query({args: { assignmentId: v.id("sitAssignments") },handler: async (ctx, args) => {const applications = await ctx.db.query("applications").withIndex("by_sit_assignment", (q) =>q.eq("sitAssignmentId", args.assignmentId)).filter((q) => q.eq(q.field("deletedAt"), undefined)).collect();return applications;},});
Vertrouwen Is Alles
Als je iemand vraagt om voor hun huisdier te zorgen, vraag je om veel vertrouwen. Huisdieren zijn familie. Mensen geven hun hond niet zomaar aan een vreemde op het internet
We hebben veel meer tijd besteed aan verificatie, reviews en veiligheidsfuncties dan we aanvankelijk hadden gepland. Privacycontroles werden een groot ding. En eerlijk gezegd hadden we daar moeten beginnen. Vertrouwen opbouwen is geen functie die je er later bij plakt, het is het fundament
Blinde Reviews
Iets wat we bouwden waar ik best trots op ben: blinde reviews. Beide partijen dienen hun review onafhankelijk in, en geen van beiden kan de review van de ander zien totdat beide zijn ingediend (of er 14 dagen voorbij zijn). Voorkomt wraakreviews en houdt alles eerlijk
Const isReviewVisible = (review: { visibleAt?: number }): boolean => {if (!review.visibleAt) return false;return review.visibleAt <= Date.now();};
Simpele logica maar het verandert de hele dynamiek
Reviews Importeren Van Andere Platforms
Een probleem waar nieuwe platforms mee te maken krijgen: ervaren sitters hebben al reviews op andere sites. Ze willen niet vanaf nul beginnen. Dus bouwden we een review-importsysteem
De flow werkt als volgt:
- Gebruiker linkt hun profiel op een ander platform (TrustedHousesitters, Nomador, etc.)
- Wij verifiëren dat zij het profiel bezitten door een unieke code aan hun bio te laten toevoegen
- Na verificatie kunnen ze screenshots van hun reviews uploaden
- GPT-4 Vision extraheert de reviewdata automatisch
Export const extractReviewFromScreenshot = action({args: { imageUrl: v.string() },handler: async (_, args) => {const response = await openai.chat.completions.create({model: VISION_MODEL,messages: [{role: "user",content: [{ type: "text", text: "Extract the review information:" },{ type: "image_url", image_url: { url: args.imageUrl } },],}],response_format: { type: "json_object" },});// returns: reviewerName, reviewText, overallRating, reviewDate},});
Het verificatiedeel was interessant. We genereren een unieke code zoals gps-verify-abc123, de gebruiker voegt het toe aan hun profielbio, en we fetchen de pagina om te controleren of de code aanwezig is
Const codeFound = html.includes(profile.verificationCode);If (codeFound) {await updateProfileStatus({ status: "verified" });}
Simpel maar effectief. Voorkomt dat mensen reviews claimen die niet van hen zijn
Tweezijdige Marktplaatsen Zijn Moeilijk
Je hebt diereneigenaren EN oppassen nodig. Maar diereneigenaren melden zich niet aan zonder oppassen, en oppassen melden zich niet aan zonder diereneigenaren. Klassiek kip-en-ei-probleem
We richtten ons uiteindelijk op het bouwen van functies die beide kanten echt helpen - kaartzoekfunctie zodat je sits bij jou in de buurt kunt vinden, dubbele accounts zodat je zowel oppas als eigenaar kunt zijn. De kleine dingen die de ervaring soepeler maken
Het Kaartzoekprobleem
Kaartzoeken klinkt makkelijk totdat je het daadwerkelijk bouwt. We gebruiken LocationIQ voor geocoding (veel goedkoper dan Google) en moesten een backfill-systeem bouwen voor bestaande gebruikers
Export const backfillSitterCoordinates = action({args: {batchSize: v.optional(v.number()),delayMs: v.optional(v.number()), // rate limit protection},handler: async (ctx, args) => {const sitters = await ctx.runQuery(internal.geocoding.getSittersNeedingGeocoding,{ limit: batchSize });// process in batches to avoid rate limitsfor (const sitter of sitters) {// geocode and update...await new Promise(resolve => setTimeout(resolve, delayMs));}},});
We gebruiken ook supercluster voor het clusteren van markers wanneer je uitzoomt. Anders wordt de kaart onbruikbaar met te veel pins
Luisteren Verandert Alles
Een van de grootste lessen: luister naar je gebruikers. We hebben recent volledig veranderd hoe we over het platform praten op basis van feedback. De manier waarop we Global Pet Sitter beschreven sloeg niet aan bij mensen, dus herschreven we het
Elke klacht is een feature request in vermomming. Elke verwarde gebruiker laat je zien waar je product tekortschiet. Best gaaf als je het zo gaat bekijken
Soft Deletes Overal
Al vroeg leerden we: verwijder nooit echt data. Alles gebruikt soft deletes met een deletedAt veld. Als er iets misgaat (en dat zal gebeuren), kun je het herstellen. Als gebruikers vragen "wat is er met mijn listing gebeurd?", kun je ze echt antwoord geven
.filter((q) => q.eq(q.field("deletedAt"), undefined))
Je ziet dit patroon overal in onze codebase. Enigszins vervelend om aan te denken maar het bespaart je zoveel hoofdpijn
Wat We Hebben Geshipt
Terugkijkend op wat we hebben gebouwd:
- kaartzoekfunctie - vind sits in je omgeving visueel met marker clustering
- dubbele accounts - wees oppas en eigenaar met hetzelfde profiel
- privacycontroles - jij bepaalt welke info je deelt
- real-time berichten - geen refresh nodig, berichten verschijnen gewoon
- blinde reviews - eerlijke feedback zonder angst voor wraak
- reviews importeren - neem je reputatie mee van andere platforms met AI-extractie
- early adopter beloningen - omdat de eerste gebruikers een gok op ons namen
En we werken aan een iPhone-app. Die komt eraan :)
De Techniek Was Niet Het Moeilijkste
Ik besteedde zoveel tijd aan het piekeren over de tech stack, de architectuur, de performance. Het moeilijkste bleek het zijn om mensen te laten geven om je product
De beste code ter wereld maakt niet uit als niemand het gebruikt. Ik wou dat ik dit eerder had geleerd
Dat gezegd hebbende, het kiezen van de juiste tools (Convex, Clerk, Next.js) maakte de development-ervaring soepel genoeg zodat we ons konden focussen op het product in plaats van te vechten met infrastructuur
Zou Ik Het Opnieuw Doen
Absoluut. Zelfs met alle late avonden en momenten van twijfel. Iets van de grond af opbouwen met iemand die je vertrouwt leert je dingen die je op geen andere manier kunt leren
Misschien is dat de echte les. Het product kan slagen of falen, maar je komt er altijd uit met meer kennis dan waarmee je begon
Stay Updated
Get notified about new posts on automation, productivity tips, indie hacking, and web3.
No spam, ever. Unsubscribe anytime.



