Blog
Career·7 min read

Lecciones de Construir Global Pet Sitter

lo que aprendí cofundando una plataforma de cuidado de mascotas. lo bueno, lo malo y todo lo que hay en medio

Jo Vinkenroye·January 13, 2026
Lecciones de Construir Global Pet Sitter

Cofundé Global Pet Sitter con mi amigo Geert. Dos desarrolladores, más de 10 años de experiencia en housesitting entre los dos, intentando construir algo transparente y orientado a la comunidad. Empezó como una idea simple y honestamente se convirtió en una de las experiencias más educativas de mi vida

Por Qué Lo Construimos

Nosotros mismos habíamos sido housesitters durante años. Usamos plataformas como TrustedHousesitters y Nomador. Y honestamente, nos frustramos

Los problemas se iban acumulando:

  • tarifas fuera de control - TrustedHousesitters introdujo una tarifa de $12 por reserva además de las membresías anuales. Se sentía como exprimir a la comunidad centavo a centavo
  • soporte al cliente que no responde - los emails se quedan sin respuesta, eliminaron el soporte telefónico, solo chatbots. Cuando algo sale mal durante un sit, estás solo
  • sistemas de reseñas que parecen rotos - las reseñas falsas no se pueden eliminar incluso con pruebas. Sin responsabilidad cuando los dueños o cuidadores se comportan mal
  • sin verificación real - las verificaciones de antecedentes son voluntarias y las paga el cuidador. La plataforma toma mínimas acciones incluso cuando se reportan robos o negligencia con mascotas

Seguíamos leyendo las mismas quejas una y otra vez en Trustpilot y Sitejabber. TrustedHousesitters tiene una valoración de 2.7/5 en Sitejabber con más de 1000 reseñas. Gente describiendo robos, daños a la propiedad, cancelaciones de último minuto, y una plataforma que "investigó pero se negó a tomar acción"

Algo que empezó enfocado en la comunidad se sobrecomercializó. Y pensamos, quizás podríamos hacerlo mejor

La misión estaba clara: construir algo transparente donde dueños de mascotas y cuidadores pudieran conectar sin tanta fricción. Suena simple, ¿verdad? Jaja

El Stack Tecnológico

Optamos por Next.js 16 (App Router + Turbopack), Convex para el backend en tiempo real, y Clerk para autenticación. Tailwind para estilos porque la vida es muy corta para escribir CSS desde cero

¿Por qué Convex? Actualizaciones en tiempo real incluidas. Cuando un cuidador aplica o llega un mensaje, lo ves al instante. Sin configurar websockets, sin polling, sin dolores de cabeza. El esquema se define en TypeScript, las queries tienen tipos seguros, y los deployments simplemente funcionan

// así de limpias son las queries en Convex
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;
},
});

La Confianza Lo Es Todo

Cuando le pides a alguien que cuide su mascota, estás pidiendo mucha confianza. Las mascotas son familia. La gente no le entrega su perro a un desconocido de internet así como así

Dedicamos mucho más tiempo a verificación, reseñas y funciones de seguridad de lo que inicialmente planeamos. Los controles de privacidad se volvieron algo importante. Y honestamente deberíamos haber empezado por ahí. Construir confianza no es una función que agregas después, es el cimiento

Reseñas Ciegas

Algo que construimos y de lo que estoy bastante orgulloso: reseñas ciegas. Ambas partes envían su reseña de forma independiente, y ninguna puede ver la del otro hasta que ambas se hayan enviado (o pasen 14 días). Previene las reseñas de represalia y mantiene todo honesto

Const isReviewVisible = (review: { visibleAt?: number }): boolean => {
if (!review.visibleAt) return false;
return review.visibleAt <= Date.now();
};

Lógica simple pero cambia toda la dinámica

Importación de Reseñas desde Otras Plataformas

Un problema que enfrentan las plataformas nuevas: los cuidadores con experiencia ya tienen reseñas en otros sitios. No quieren empezar de cero. Así que construimos un sistema de importación de reseñas

El flujo funciona así:

  1. El usuario vincula su perfil en otra plataforma (TrustedHousesitters, Nomador, etc.)
  2. Verificamos que es dueño del perfil pidiéndole que agregue un código único a su bio
  3. Una vez verificado, puede subir capturas de sus reseñas
  4. GPT-4 Vision extrae los datos de la reseña automáticamente
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
},
});

La parte de verificación fue interesante. Generamos un código único como gps-verify-abc123, el usuario lo agrega a la bio de su perfil, y nosotros hacemos fetch de la página para verificar si el código existe

Const codeFound = html.includes(profile.verificationCode);
If (codeFound) {
await updateProfileStatus({ status: "verified" });
}

Simple pero efectivo. Evita que la gente reclame reseñas que no son suyas

Los Marketplaces de Dos Lados Son Difíciles

Necesitas dueños de mascotas Y cuidadores. Pero los dueños no se unen sin cuidadores, y los cuidadores no se unen sin dueños. El clásico problema del huevo y la gallina

Terminamos enfocándonos en construir funcionalidades que realmente ayuden a ambos lados - búsqueda por mapa para encontrar sits cerca de ti, cuentas duales para que puedas ser cuidador y dueño al mismo tiempo. Las pequeñas cosas que hacen la experiencia más fluida

El Problema de la Búsqueda por Mapa

La búsqueda por mapa suena fácil hasta que realmente la construyes. Usamos LocationIQ para geocoding (mucho más barato que Google) y tuvimos que construir un sistema de backfill para usuarios existentes

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));
}
},
});

También usamos supercluster para agrupar marcadores cuando alejas el zoom. De lo contrario, el mapa se vuelve inutilizable con demasiados pins

Escuchar Lo Cambia Todo

Una de las lecciones más grandes: escucha a tus usuarios. Recientemente cambiamos por completo cómo hablamos de la plataforma basándonos en feedback. La forma en que describíamos Global Pet Sitter no resonaba con la gente, así que la reescribimos

Cada queja es una solicitud de funcionalidad disfrazada. Cada usuario confundido te está mostrando dónde tu producto se queda corto. Bastante genial cuando empiezas a verlo así

Soft Deletes en Todas Partes

Al principio aprendimos: nunca borres datos de verdad. Todo usa soft deletes con un campo deletedAt. Cuando algo sale mal (y saldrá), puedes recuperarlo. Cuando los usuarios preguntan "¿qué pasó con mi anuncio?", puedes darles una respuesta real

.filter((q) => q.eq(q.field("deletedAt"), undefined))

Ves este patrón en todas partes de nuestro código. Un poco molesto de recordar pero te ahorra muchos dolores de cabeza

Lo Que Hemos Lanzado

Mirando atrás lo que construimos:

  • búsqueda por mapa - encuentra sits en tu zona visualmente con agrupación de marcadores
  • cuentas duales - sé cuidador y dueño con el mismo perfil
  • controles de privacidad - tú decides qué información compartir
  • mensajería en tiempo real - sin necesidad de refrescar, los mensajes simplemente aparecen
  • reseñas ciegas - feedback honesto sin miedo a represalias
  • importación de reseñas - trae tu reputación desde otras plataformas usando extracción con IA
  • recompensas para early adopters - porque los primeros usuarios se arriesgaron con nosotros

Y estamos trabajando en una app para iPhone. Ya viene :)

La Tecnología No Fue Lo Difícil

Pasé mucho tiempo preocupándome por el stack tecnológico, la arquitectura, el rendimiento. Resulta que lo difícil fue hacer que a la gente le importara tu producto

El mejor código del mundo no importa si nadie lo usa. Ojalá hubiera aprendido esto antes

Dicho esto, elegir las herramientas correctas (Convex, Clerk, Next.js) hizo que la experiencia de desarrollo fuera lo suficientemente fluida como para poder enfocarnos en el producto en lugar de pelear con la infraestructura

¿Lo Haría de Nuevo?

Absolutamente. Incluso con todas las noches largas y los momentos de duda. Construir algo desde cero con alguien en quien confías te enseña cosas que no puedes aprender de ninguna otra forma

Quizás esa es la verdadera lección. El producto puede tener éxito o fracasar, pero siempre sales sabiendo más que cuando empezaste

Stay Updated

Get notified about new posts on automation, productivity tips, indie hacking, and web3.

No spam, ever. Unsubscribe anytime.

Comments

Related Posts