Blog
Career·7 min read

Lessen Van Het Bouwen Van Global Pet Sitter

wat ik leerde als mede-oprichter van een oppasplatform voor huisdieren. het goede, het slechte en alles ertussenin

Jo Vinkenroye·January 13, 2026
Lessen Van Het Bouwen Van Global Pet Sitter

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 queries
Export 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:

  1. Gebruiker linkt hun profiel op een ander platform (TrustedHousesitters, Nomador, etc.)
  2. Wij verifiëren dat zij het profiel bezitten door een unieke code aan hun bio te laten toevoegen
  3. Na verificatie kunnen ze screenshots van hun reviews uploaden
  4. 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 limits
for (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.

Comments

Related Posts