Saltar al contenido
caso · 3T FSQA Consulting

De WordPress roto a checkout Stripe en 5 semanas.

3T FSQA es una consultora en inocuidad y calidad alimentaria con operación en McAllen, Guadalajara y red de reps en LATAM. Su sitio anterior era un catálogo estático con carrito descompuesto. Sintética entregó una plataforma bilingüe con 133 cursos, checkout real, calendario integrado y CMS que el cliente opera solo.

Consultoría en inocuidad y calidad alimentariaMcAllen, TX · Guadalajara · LATAMVer sitio en vivo
Home del sitio 3T FSQA Consulting con hero editorial y estadísticas de certificación

Métricas del proyecto

Timeline

5

semanas de kickoff a deploy

Cursos catalogados

133

en 7 estándares

URLs en sitemap

342

bilingües ES/EN

Garantía post-launch

30 días

sin costo extra

proyecto

Qué recibimos, qué entregamos.

Reto

El sitio anterior en WordPress mostraba un producto de $1 en el shop, feeds RSS caídos y cursos sin fechas ni forma de inscribirse. Para una consultora que compite con GFSI, BRCGS y SQF, el sitio parecía folleto en vez de herramienta. Perdían leads que llegaban con intención de compra y se iban sin poder pagar.

Solución

Sitio nuevo en Next.js con CMS Sanity operado por el cliente sin depender de developer. Catálogo de 133 cursos categorizados por estándar (BRCGS, SQF, FSSC 22000, ISO 9001, HACCP, FSMA, EcoVadis). Checkout Stripe LIVE con kill-switch (el cliente puede apagar el cobro por curso desde el CMS sin necesitar deploy). Formularios que llegan al buzón del despacho vía Resend. Calendario Outlook publicado como feed .ics. Todo bilingüe ES/EN con hreflang correcto. Manual instructivo entregado en PDF de 18 secciones.

Resultado

Sitio en producción con cobros reales end-to-end. Cliente opera el CMS de forma autónoma. Preview público accesible para stakeholders. Certificados HACCP rediseñados con paleta oficial. Manual PDF cubriendo cada pantalla del Studio. Retainer mensual propuesto para mantenimiento continuo tras los 30 días de garantía.

timeline

5 semanas de kickoff a producción.

  1. Fase 01 · 1 semana

    Discovery

    Brief cerrado + propuesta con plan y precio fijo

  2. Fase 02 · 1 semana

    Diseño

    2 rondas de feedback en HTML antes de codear

  3. Fase 03 · 2 semanas

    Desarrollo

    Staging en Vercel con datos reales de Sanity + QA

  4. Fase 04 · 1 semana

    Entrega

    DNS switch, webhook Stripe LIVE, manual instructivo PDF

stack

Tecnologías que corren el sitio.

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind CSS 4
  • Sanity CMS
  • Stripe LIVE
  • Resend
  • Vercel Pro
  • Cloudflare Worker
  • Playwright
aprendizajes técnicos

Lo que descubrimos construyendo esto.

Cada bug que descubrimos en producción se documenta y se convierte en check bloqueante del preflight de Sintética. Estos aprendizajes ya evitan que el próximo cliente los repita.

GOTCHA

Vercel apex → www rompe webhooks de Stripe

Cuando Vercel canonicaliza a www.3tfsqa.com, el apex 3tfsqa.com devuelve 308. Los webhooks (Stripe y en general) no siguen redirects por diseño de seguridad, así que el error rate quedó en 100% sin síntoma visible. Fix: apuntar el webhook al canonical con www explícito. Regla nueva del despacho: cualquier integración externa que reciba callbacks debe usar la URL canonical, no el apex.

GOTCHA

CORS de Sanity necesita el dominio final con Allow credentials

Después del DNS switch, el Studio embebido en /studio no cargaba porque el nuevo origin (www.3tfsqa.com) no estaba en la whitelist CORS del proyecto Sanity. Sin el flag Allow credentials, el auth OAuth falla silencioso. El cliente descubrió el bug al intentar editar contenido el día del launch. Ahora esta verificación es paso obligatorio en el preflight de Sintética.

GOTCHA

Stripe rechaza cobros MXN menores a $10

Stripe tiene un mínimo de aproximadamente $0.50 USD por cobro. En pesos el umbral seguro son $10 MXN. Cursos con precio menor devuelven StripeInvalidRequestError. Documentado en el manual del cliente y verificado con smoke test de $20 MXN con tarjeta real (refund inmediato).

PATTERN

Feature flag data-driven en CMS para features de riesgo

Cualquier feature con exposición financiera (checkout, cobros, contacto que dispara notificaciones) tiene un boolean en Sanity que el server lee y respeta. Ventaja concreta: si algo se rompe con LIVE keys, el cliente flippea el boolean en el CMS y la funcionalidad se apaga en 60 segundos sin necesitar deploy. Aplicado como kill-switch en cada curso vía checkoutEnabled.

DECISION

Server Components leen Sanity directo, sin API routes intermedias

Next.js 16 App Router permite fetch server-side con revalidate por locale ES/EN. Los Server Components leen Sanity con dataSources.query (no databases.query, deprecada en API 2025-09-03). Menos capas = menos bugs. La única API route del proyecto es la del checkout Stripe.

galería
Sección de servicios con mapa de oficinas y red de reps
Servicios y mapa de oficinas — McAllen, Guadalajara, Dallas + red de reps en LATAM
Página de cumplimiento con hero editorial de los 7 estándares
Página de cumplimiento — los 7 estándares certificables agrupados
Matriz de industrias × estándares en la página de cumplimiento
Matriz industria × estándar — 12 industrias mapeadas a certificaciones aplicables
Catálogo de cursos filtrado por estándar HACCP
Catálogo de capacitación — 133 cursos filtrables por estándar, industria y modalidad
Detalle de curso Auditor HACCP Avanzado con checkout Stripe
Detalle de curso con checkout Stripe activo — se puede pagar directo desde el sitio
Página Nosotros con badge Approved Trainer de International HACCP Alliance
Credenciales verificables — Approved Trainer de International HACCP Alliance
Formulario de contacto con validación y envío a Resend
Formulario de contacto — validación en cliente, envío server-side vía Resend al buzón del despacho
Página Software con oferta de digitalización en Microsoft Power Platform
Página Software — oferta de consultoría en digitalización sobre Power Platform
sigues tú

Sé nuestro siguiente caso publicable.

20% de descuento en tu plan a cambio de que publiquemos tu proyecto como este.