Vibecodea tu primera app en una tarde
Sin experiencia previa: elige algo pequeño, dale un encargo claro a un agente y publica una primera versión que puedas probar.
Elige una tumba fácil
Escoge una app Muerto con un alcance claro y pequeño. Puedes cambiarla antes de copiar el prompt.
Consigue tu herramienta
No necesitas entender todas las herramientas. Escoge un camino y sigue.
Probar sin instalar
Pega el prompt en ChatGPT o Claude en el navegador y pide una versión que puedas previsualizar.
Construir de verdad
Usa Claude Code (documentación en español), Codex o Cursor para editar y probar un proyecto en tu computadora.
Claude Code también tiene una página de producto. Todos estos enlaces son los recursos oficiales usados en el FAQ del sitio.
Copia el prompt y sus skills
Copia primero el encargo y después cada archivo SKILL.md en la ruta indicada.
Build me a single-player flowchart tool like Whimsical. Requirements: - A local web app: Vite + React, shapes rendered as SVG. No backend, runs as a static build, fully offline. - Shapes: rectangle, rounded rectangle, diamond, ellipse, sticky note, text label. Drag to move, handles to resize, double-click to edit text inline. - Connectors attach to shape anchor points, stay attached when shapes move, route orthogonally with arrowheads, and can carry a text label. - Snap-to-grid plus alignment guides while dragging; keyboard support for copy/paste, delete, arrow-key nudge, and undo/redo via a history stack. - A toolbar with the shape palette and 8 preset fill colors. No free-form style panel. - Boards autosave to IndexedDB (via localforage), with JSON import/export; export the selection or the whole board as PNG and SVG. - No accounts, no telemetry, nothing leaves the browser. - Out of scope: real-time multiplayer, comments, wireframe component kits, and mind-map mode. Flowcharts and stickies only. - README: npm install / npm run dev, plus the keyboard shortcut list.
--- name: roles-y-permisos description: quién puede ver qué, y quién puede borrarlo. --- # Roles y permisos Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando agregues espacios de trabajo, invitaciones, roles o cualquier verificación de acceso. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - Más de una persona comparte el mismo contenido o proyecto. - Hay algo que un miembro del equipo no debería ver: facturación, datos de clientes, exportaciones. - Vendes por asiento y necesitas invitar, quitar y contar miembros. - Existe una vista de administrador distinta de la vista normal. Esta capa separa "tengo cuenta" de "puedo hacer esto". Es lo que casi siempre falta en un rebuild de fin de semana: el demo funciona con un usuario y filtra datos ajenos en cuanto entra el segundo. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Postgres** con organizaciones y membresías, verificación centralizada en el servidor, sin lógica de permisos en el cliente. 1. Agrega organizaciones y membresías: cada recurso cuelga de una organización, nunca directamente de un usuario. 2. Empieza con tres roles fijos (`owner`, `member`, `viewer`). Los permisos por recurso llegan cuando alguien los pida de verdad, no antes. 3. Escribe una sola función que responda `puedeHacer(usuario, accion, recurso)` y llámala en cada endpoint. Una función, no quince `if` sueltos repartidos por el código. 4. Filtra siempre por organización en la consulta, no después de traer las filas. 5. Invitaciones por token con correo, expiración y aceptación explícita. 6. Registra quién cambió roles y cuándo: es el primer dato que te van a pedir cuando algo salga mal. ## En qué te vas a trabar - **Ocultar un botón no es un permiso.** Si el endpoint no verifica, el permiso no existe, sin importar qué tan bien escondido esté en la UI. - **El caso difícil es el último dueño:** no dejes que se elimine a sí mismo y deje la organización huérfana sin nadie que pueda administrarla. - **Los permisos por campo (ver el precio pero no el margen) multiplican la complejidad.** Evítalos hasta tener clientes que de verdad los pidan. ## Criterio de terminado No declares esto listo hasta que un usuario de una organización no pueda ver ni un solo registro de otra, la eliminación del último dueño esté bloqueada, y `puedeHacer` sea el único lugar donde vive la lógica de permisos.Roles y permisos
Claude: ~/.claude/skills/roles-y-permisos/SKILL.md · Codex/Cursor: ~/.agents/skills/roles-y-permisos/SKILL.md--- name: autenticacion description: que alguien entre a su cuenta y siga siendo la misma persona mañana. --- # Autenticación Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando toques registro, inicio de sesión, sesiones o recuperación de contraseña. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - La app guarda algo que pertenece a una persona y no a todo el mundo. - Se va a cobrar: sin cuenta no hay a quién cobrarle ni qué desbloquear. - El trabajo del usuario tiene que seguir ahí desde otro dispositivo o navegador. - Hay un panel, un historial o una configuración que no debe ser pública. Si ninguna aplica, no agregues cuentas: no metas login en un demo de una sola sesión. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Better Auth** (o Lucia) sobre **Postgres**, sesiones en cookie `httpOnly`, correo transaccional por **Resend**. No escribas tu propia capa de criptografía de sesión. 1. Modela tres tablas: `users`, `sessions` y `accounts` (proveedores OAuth). Usa el esquema que la librería ya define; no inventes uno propio. 2. Arranca solo con correo + contraseña. Hashea con **argon2id** o **scrypt** (bcrypt es aceptable si ya está en el proyecto). Nunca guardes la contraseña en claro y nunca la mandes por correo. 3. Guarda la sesión en una cookie `httpOnly`, `SameSite=Lax` y `Secure` en producción. Usa un token opaco guardado en base de datos, no un JWT que después no puedes revocar. 4. Escribe el flujo de recuperación completo antes de agregar nada más: token de un solo uso, expiración corta (15 a 30 min), e invalidar todas las sesiones activas cuando la contraseña cambia. 5. Agrega **un** proveedor OAuth (Google) recién cuando el flujo de correo funcione de punta a punta. Uno, no cinco. 6. Pon límite de intentos por IP y por correo en `login` y en `forgot-password`. 7. Deja los secretos en `.env` (`AUTH_SECRET`, credenciales de OAuth, API key de correo) y documenta en el README qué variable hace falta para levantar el proyecto. ## En qué te vas a trabar - **El correo transaccional es el cuello de botella real.** Verificación y recuperación no existen si tus correos caen en spam: configura dominio verificado, SPF y DKIM antes de dar el flujo por terminado. - **OAuth se ve gratis hasta que lo pruebas.** Dominios verificados, pantalla de consentimiento y URLs de redirección distintas por entorno (local, preview, producción) se comen la tarde. - **Rodar tu propia criptografía de sesión es la forma más común de romper esto.** Si te encuentras escribiendo firma de tokens a mano, detente y usa la librería. ## Criterio de terminado No declares la autenticación lista hasta que, en un navegador limpio, puedas: registrarte, recibir el correo de verificación, cerrar sesión, volver a entrar, pedir "olvidé mi contraseña", cambiarla con el enlace recibido y comprobar que la sesión anterior quedó invalidada.Autenticación
Claude: ~/.claude/skills/autenticacion/SKILL.md · Codex/Cursor: ~/.agents/skills/autenticacion/SKILL.md--- name: base-de-datos description: dónde vive la información y cómo la cambias sin perderla. --- # Base de datos Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando elijas motor, modeles tablas o escribas migraciones. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - La app tiene que recordar algo después de recargar la página. - Hay varios usuarios, varios dispositivos, o cualquier historial que conservar. - Vas a consultar, filtrar u ordenar sobre más de unos cientos de registros. - Necesitas exportar, respaldar o migrar lo que la gente guardó. Esta es casi siempre la primera skill que activas en un rebuild: casi todo lo demás cuelga de aquí. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Postgres** administrado (**Neon** o **Supabase**) con **Drizzle** o **Prisma** para el esquema y las migraciones versionadas en el repo. **SQLite** local (`better-sqlite3`) si la app es de un solo usuario. 1. Postgres por defecto. SQLite solo si la app corre en una máquina y una persona. 2. Modela primero las entidades que el usuario nombraría en voz alta, no las pantallas que vas a construir. 3. Cada cambio de esquema es un archivo de migración generado por tu ORM (`drizzle-kit generate`, `prisma migrate`), en orden y aplicado en despliegue. Nada de `ALTER TABLE` a mano en producción. 4. Pon llaves foráneas e índices desde el inicio: id de organización, id de usuario y las columnas por las que ordenas. 5. Define borrado suave (`deletedAt`) donde el usuario pueda arrepentirse. 6. Verifica que el respaldo restaura de verdad. Un respaldo que nunca probaste no es un respaldo. ## En qué te vas a trabar - **Guardar todo como JSON en una columna se siente rápido el primer día** y bloquea cualquier consulta el mes tres. Modela columnas reales para lo que vas a filtrar u ordenar. - **Las funciones sin servidor abren muchas conexiones**: usa pooling (el que trae Neon o Supabase) o vas a tumbar la base sin tráfico real. - **Las migraciones destructivas necesitan dos pasos** (escribir en ambos lados, después borrar), no valentía. No borres una columna en el mismo despliegue en que dejas de usarla. ## Criterio de terminado No declares el esquema listo hasta que puedas correr las migraciones desde cero contra una base vacía, restaurar un respaldo de prueba y confirmar que las consultas más frecuentes usan un índice y no un escaneo completo.Base de datos
Claude: ~/.claude/skills/base-de-datos/SKILL.md · Codex/Cursor: ~/.agents/skills/base-de-datos/SKILL.mdBuild me a link-in-bio page to replace Linktree. Requirements: - A single static page: avatar, name, short bio, and a list of link buttons defined in one links.json file (title, url, optional emoji). Editing the JSON is the CMS. - Clean mobile-first design, dark mode via prefers-color-scheme, subtle hover states. No framework needed · one HTML file with embedded CSS is fine, or Astro if you must. - Add click tracking with zero third parties: each link goes through a /go/:slug redirect that appends a line to a local clicks.log (or a SQLite row) then 302s. Add a /stats page (basic-auth from .env) showing clicks per link. - Proper OG tags + generated OG image so the page previews well when shared. - Include deploy instructions for a plain VPS with Caddy or nginx.
--- name: pagos-y-suscripciones description: cobrar todos los meses sin perseguir a nadie. --- # Pagos y suscripciones Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando toques checkout, planes, prueba gratis, cancelaciones o el estado de cuenta que decide qué puede usar cada quien. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - Quieres cobrar por la versión que estás construyendo, no solo usarla tú. - Hay funciones que solo deben existir en un plan de paga. - Vendes por asiento, por uso o con prueba gratuita. - Necesitas facturas, impuestos o comprobantes para tus clientes. Cobrar una vez es fácil; lo difícil es que tu base de datos y la del proveedor de pagos digan lo mismo después de un pago fallido, un cambio de plan a medio mes o un reembolso. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Stripe Checkout + Customer Portal**, o **Lemon Squeezy** / **Paddle** si prefieres que ellos sean el comerciante registrado. 1. No construyas formularios de tarjeta. Redirige a Checkout alojado y vuelve con una sesión. 2. Guarda solo tres cosas de tu lado: `customerId`, `subscriptionId` y estado del plan. El proveedor es la fuente de la verdad del dinero, no tu tabla. 3. Deriva los permisos del estado (`active`, `trialing`, `past_due`, `canceled`), nunca de "pagó una vez". 4. Escucha los webhooks de suscripción y hazlos idempotentes: llegan repetidos y desordenados. 5. Manda a Customer Portal para cambios de plan, tarjeta y cancelación. Es la pantalla que menos vale la pena rehacer tú mismo. 6. Prueba con tarjetas de fallo: pago rechazado, disputa y reembolso. Ese es el camino que rompe la app en producción. ## En qué te vas a trabar - **Impuestos y facturación son el moat real:** IVA, retenciones y comerciante registrado no son código, son cumplimiento. No los subestimes por ser "solo un webhook". - **Si tu webhook falla en silencio, la gente paga y no recibe acceso.** Alerta cuando falle, no dejes que lo descubra el cliente. - **Prorrateos y cambios de plan a medio ciclo son la fuente número uno de facturas equivocadas.** Prueba ese camino explícitamente, no solo el flujo feliz. ## Criterio de terminado No declares esto listo hasta que un pago rechazado, una disputa y un reembolso pasen por el sistema completo sin dejar al usuario con acceso equivocado, y hasta que el estado de tu base de datos coincida con el de Stripe después de cada webhook de prueba.Pagos y suscripciones
Claude: ~/.claude/skills/pagos-y-suscripciones/SKILL.md · Codex/Cursor: ~/.agents/skills/pagos-y-suscripciones/SKILL.md--- name: analitica-de-producto description: saber qué usa la gente antes de construir lo siguiente. --- # Analítica de producto Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando agregues registro de eventos, conteo de visitas o cualquier tablero de métricas. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - Alguien más que tú ya usa la app y quieres saber si vuelve. - Necesitas ver dónde abandona la gente el registro o el checkout. - Vas a decidir qué construir después y no quieres decidirlo por intuición. - Estás replicando una herramienta cuyo producto es justamente el tablero de métricas. Si ninguna aplica, no instrumentes nada todavía: medir poco y bien vale más que medir por si acaso. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Plausible** o **Umami** autoalojado para páginas, más una tabla de eventos propia en **Postgres** para lo que importa del producto. 1. Escribe primero las cinco preguntas que quieres responder. Los eventos salen de ahí, no al revés. 2. Analítica de páginas con una herramienta sin cookies (Plausible o Umami): menos aviso legal, menos peso, suficiente para tráfico. 3. Eventos de producto en tu propia tabla: nombre, usuario, organización, propiedades en JSON, fecha. Es una tabla, no una plataforma. 4. Fija una convención de nombres (`objeto_accion`) y documéntala en el repo el primer día, antes de que existan diez nombres distintos para lo mismo. 5. Arma las vistas agregadas con SQL y guárdalas como consultas versionadas o vistas materializadas, no como clics sueltos en un dashboard externo. 6. Nunca guardes datos personales en las propiedades del evento: id de usuario sí, correo no. ## En qué te vas a trabar - **Los bloqueadores de anuncios se comen buena parte de los eventos del cliente.** Lo importante se registra en el servidor, no confíes solo en JavaScript del navegador. - **Un tablero con veinte gráficas es un tablero que nadie lee.** Tres números y un embudo bastan; resiste la tentación de agregar una gráfica más. - **Rastrear sin base legal ni aviso de privacidad es un problema, no una funcionalidad.** Revísalo antes de mandar el primer evento a producción. ## Criterio de terminado No declares la analítica lista hasta que puedas responder, con datos reales y no con intuición, las cinco preguntas que escribiste al inicio, y hasta que el tablero quepa en una sola pantalla sin hacer scroll.Analítica de producto
Claude: ~/.claude/skills/analitica-de-producto/SKILL.md · Codex/Cursor: ~/.agents/skills/analitica-de-producto/SKILL.md--- name: autenticacion description: que alguien entre a su cuenta y siga siendo la misma persona mañana. --- # Autenticación Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando toques registro, inicio de sesión, sesiones o recuperación de contraseña. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - La app guarda algo que pertenece a una persona y no a todo el mundo. - Se va a cobrar: sin cuenta no hay a quién cobrarle ni qué desbloquear. - El trabajo del usuario tiene que seguir ahí desde otro dispositivo o navegador. - Hay un panel, un historial o una configuración que no debe ser pública. Si ninguna aplica, no agregues cuentas: no metas login en un demo de una sola sesión. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Better Auth** (o Lucia) sobre **Postgres**, sesiones en cookie `httpOnly`, correo transaccional por **Resend**. No escribas tu propia capa de criptografía de sesión. 1. Modela tres tablas: `users`, `sessions` y `accounts` (proveedores OAuth). Usa el esquema que la librería ya define; no inventes uno propio. 2. Arranca solo con correo + contraseña. Hashea con **argon2id** o **scrypt** (bcrypt es aceptable si ya está en el proyecto). Nunca guardes la contraseña en claro y nunca la mandes por correo. 3. Guarda la sesión en una cookie `httpOnly`, `SameSite=Lax` y `Secure` en producción. Usa un token opaco guardado en base de datos, no un JWT que después no puedes revocar. 4. Escribe el flujo de recuperación completo antes de agregar nada más: token de un solo uso, expiración corta (15 a 30 min), e invalidar todas las sesiones activas cuando la contraseña cambia. 5. Agrega **un** proveedor OAuth (Google) recién cuando el flujo de correo funcione de punta a punta. Uno, no cinco. 6. Pon límite de intentos por IP y por correo en `login` y en `forgot-password`. 7. Deja los secretos en `.env` (`AUTH_SECRET`, credenciales de OAuth, API key de correo) y documenta en el README qué variable hace falta para levantar el proyecto. ## En qué te vas a trabar - **El correo transaccional es el cuello de botella real.** Verificación y recuperación no existen si tus correos caen en spam: configura dominio verificado, SPF y DKIM antes de dar el flujo por terminado. - **OAuth se ve gratis hasta que lo pruebas.** Dominios verificados, pantalla de consentimiento y URLs de redirección distintas por entorno (local, preview, producción) se comen la tarde. - **Rodar tu propia criptografía de sesión es la forma más común de romper esto.** Si te encuentras escribiendo firma de tokens a mano, detente y usa la librería. ## Criterio de terminado No declares la autenticación lista hasta que, en un navegador limpio, puedas: registrarte, recibir el correo de verificación, cerrar sesión, volver a entrar, pedir "olvidé mi contraseña", cambiarla con el enlace recibido y comprobar que la sesión anterior quedó invalidada.Autenticación
Claude: ~/.claude/skills/autenticacion/SKILL.md · Codex/Cursor: ~/.agents/skills/autenticacion/SKILL.mdCrea un sitio personal de una sola página para reemplazar Carrd. Requisitos: - Un sitio elegante de una sola página a partir de un archivo content.json: nombre, título principal, párrafo breve sobre mí, avatar, enlaces sociales y una lista opcional de proyectos con título + descripción + URL. Editar el JSON es el CMS. - Diseñalo bien: jerarquía tipográfica clara, mucho espacio en blanco, un color de acento definido mediante una variable CSS, modo oscuro con prefers-color-scheme y estados hover discretos. Debe verse diseñado, no como una plantilla. - Un formulario de contacto funcional sin servicios de terceros: haz POST a un endpoint pequeño que agregue los mensajes a messages.log y devuelva un agradecimiento en línea. Incluye un campo honeypot para bots. - Puntuaciones perfectas de Lighthouse: CSS incrustado, sin frameworks, sin webfonts salvo que estén alojadas localmente, etiquetas OG correctas + imagen OG generada. - HTML estático + un archivo pequeño de servidor para el formulario. Incluye instrucciones de despliegue para cualquier VPS o hosting estático + una alternativa de formulario serverless.
--- name: despliegue description: que exista en internet, con dominio, y que siga existiendo mañana. --- # Despliegue Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando pongas la app en línea, configures dominio, variables de entorno o monitoreo. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - Alguien que no eres tú tiene que abrir la app. - Necesitas dominio propio, HTTPS y una URL estable para compartir. - Hay secretos (llaves de API, base de datos) que no pueden vivir en el repo. - Quieres enterarte de los errores antes de que te los reporten. Este es el paso que separa una carpeta en tu máquina de algo que alguien más puede usar, y también donde una réplica "gratis" empieza a costar dinero de verdad. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Vercel** o **Railway** para la app, Postgres administrado aparte, secretos en el panel del proveedor, un contenedor propio solo si el trabajo es pesado y constante. 1. Despliegue desde Git: cada push a `main` publica, cada rama abre una vista previa. 2. Variables de entorno en el proveedor, con `.env.example` versionado. Ningún secreto en el repo, nunca. 3. Dominio propio y HTTPS desde el inicio: cookies, OAuth y correo dependen del dominio final, así que no lo dejes para el último día. 4. Base de datos administrada con respaldos automáticos y restauración probada al menos una vez. 5. Agrega registro de errores (**Sentry** o el del proveedor) y una alerta a tu correo o Telegram. 6. Deja escrito en el README cómo correrlo en local y cómo desplegarlo. Tu yo de dentro de seis meses lo va a necesitar. ## En qué te vas a trabar - **Las funciones sin servidor tienen tiempo límite:** nada de procesos largos ahí, van a segundo plano (cola, cron, worker). - **Los planes gratuitos duermen, limitan conexiones o cortan ancho de banda** justo cuando llega gente. Revisa los límites del plan antes de anunciar el lanzamiento. - **El costo real de una réplica suma base de datos, almacenamiento, correo y llamadas a modelos.** Súmalos antes de prometer que sale gratis. ## Criterio de terminado No declares el despliegue listo hasta que un push a `main` publique solo, una rama nueva abra su propia vista previa, y una alerta de error de prueba te llegue de verdad.Despliegue
Claude: ~/.claude/skills/despliegue/SKILL.md · Codex/Cursor: ~/.agents/skills/despliegue/SKILL.md--- name: onboarding-y-limites-por-plan description: llevar a la primera victoria y cobrar por límites que el servidor sí aplica. --- # Onboarding y límites por plan Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando armes trial, activación inicial, cuotas, feature flags o pantallas de upgrade. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - Una cuenta nueva necesita datos o configuración antes de obtener valor. - Hay prueba gratuita, plan gratis o más de un plan pagado. - Cobras por usuarios, proyectos, almacenamiento, uso o funciones. - Necesitas lanzar una función a un grupo sin desplegar otra versión. Si todos reciben el mismo producto y no cobras, crea un estado vacío excelente. No construyas un motor de entitlements porque algún día podría haber planes. ## Cómo armarla Usa **Postgres** como fuente de verdad para onboarding y entitlements. Mantén flags operativos en configuración versionada; agrega **PostHog feature flags** solo si ya usas PostHog y necesitas rollout gradual. 1. Define una sola “primera victoria” medible, como publicar, importar, cobrar o invitar. Diseña el onboarding hacia ese evento, no hacia completar un tour. 2. Guarda pasos por cuenta con `completedAt`, versión y actor. Deriva lo que puedas de acciones reales; no marques “conectó calendario” porque cerró un modal. 3. Separa tres conceptos: producto contratado, estado de cobro y entitlements efectivos. Un webhook actualiza suscripción; una función central resuelve `puedeUsar` y `limiteDe`. 4. Define planes y límites con slugs estables. Guarda nombres y copy aparte para poder cambiar marketing sin romper permisos históricos. 5. Aplica límites en una transacción del servidor. Antes de crear, cuenta o reserva uso; la UI solo explica el resultado, nunca es la barrera real. 6. Calcula trial con fechas del servidor y una política explícita al vencer. Conserva la información en modo lectura cuando sea razonable; no borres trabajo para forzar upgrade. 7. Muestra el consumo antes del límite y explica qué acción lo reduce. Un upgrade modal debe decir qué se agotó, cuánto incluye el plan y qué pasa al bajar de plan. 8. Instrumenta inicio, primera victoria, abandono y upgrade. Revisa el embudo por canal y plan sin guardar datos personales en eventos. ## En qué te vas a trabar - **Pago activo no equivale a permiso.** Asientos extra, add-ons, créditos y periodos de gracia exigen una capa de entitlements separada del nombre del plan. - **Los contadores compiten.** Dos peticiones simultáneas pueden rebasar una cuota; usa bloqueo, contador atómico o reserva con expiración. - **Bajar de plan deja exceso existente.** Define por recurso si bloqueas nuevas altas, pones solo lectura o programas eliminación; comunícalo antes del cambio. - **Un trial tiene costo variable.** Limita modelos, SMS, almacenamiento y otros recursos medidos aunque la tarjeta todavía no exista. ## Qué NO hacer - No disperses `plan === "pro"` por componentes y endpoints. - No confíes en esconder botones para aplicar cuotas. - No reinicies trials al cambiar correo, organización o proveedor OAuth. - No bloquees exportación o cancelación para presionar una mejora de plan. ## Checklist - [ ] La primera victoria tiene evento y se alcanza sin completar pasos decorativos. - [ ] Onboarding, cobro y entitlements tienen estados separados. - [ ] Una función central decide funciones y límites para todos los endpoints. - [ ] Dos peticiones simultáneas no rebasan una cuota. - [ ] Trial vencido, pago atrasado, upgrade y downgrade tienen pruebas. - [ ] La persona ve consumo, límite y consecuencia antes de llegar al bloqueo. - [ ] Exportar, cancelar y recuperar datos no dependen de aceptar un upgrade.Onboarding y límites por plan
Claude: ~/.claude/skills/onboarding-y-limites-por-plan/SKILL.md · Codex/Cursor: ~/.agents/skills/onboarding-y-limites-por-plan/SKILL.md--- name: pagos-y-suscripciones description: cobrar todos los meses sin perseguir a nadie. --- # Pagos y suscripciones Instrucciones para el agente que está construyendo esta app. Sigue esta skill cuando toques checkout, planes, prueba gratis, cancelaciones o el estado de cuenta que decide qué puede usar cada quien. ## Cuándo usar esta skill Actívala en cuanto se cumpla cualquiera de estas condiciones: - Quieres cobrar por la versión que estás construyendo, no solo usarla tú. - Hay funciones que solo deben existir en un plan de paga. - Vendes por asiento, por uso o con prueba gratuita. - Necesitas facturas, impuestos o comprobantes para tus clientes. Cobrar una vez es fácil; lo difícil es que tu base de datos y la del proveedor de pagos digan lo mismo después de un pago fallido, un cambio de plan a medio mes o un reembolso. ## Cómo construirla Usa este stack salvo que el proyecto ya tenga otro decidido: **Stripe Checkout + Customer Portal**, o **Lemon Squeezy** / **Paddle** si prefieres que ellos sean el comerciante registrado. 1. No construyas formularios de tarjeta. Redirige a Checkout alojado y vuelve con una sesión. 2. Guarda solo tres cosas de tu lado: `customerId`, `subscriptionId` y estado del plan. El proveedor es la fuente de la verdad del dinero, no tu tabla. 3. Deriva los permisos del estado (`active`, `trialing`, `past_due`, `canceled`), nunca de "pagó una vez". 4. Escucha los webhooks de suscripción y hazlos idempotentes: llegan repetidos y desordenados. 5. Manda a Customer Portal para cambios de plan, tarjeta y cancelación. Es la pantalla que menos vale la pena rehacer tú mismo. 6. Prueba con tarjetas de fallo: pago rechazado, disputa y reembolso. Ese es el camino que rompe la app en producción. ## En qué te vas a trabar - **Impuestos y facturación son el moat real:** IVA, retenciones y comerciante registrado no son código, son cumplimiento. No los subestimes por ser "solo un webhook". - **Si tu webhook falla en silencio, la gente paga y no recibe acceso.** Alerta cuando falle, no dejes que lo descubra el cliente. - **Prorrateos y cambios de plan a medio ciclo son la fuente número uno de facturas equivocadas.** Prueba ese camino explícitamente, no solo el flujo feliz. ## Criterio de terminado No declares esto listo hasta que un pago rechazado, una disputa y un reembolso pasen por el sistema completo sin dejar al usuario con acceso equivocado, y hasta que el estado de tu base de datos coincida con el de Stripe después de cada webhook de prueba.Pagos y suscripciones
Claude: ~/.claude/skills/pagos-y-suscripciones/SKILL.md · Codex/Cursor: ~/.agents/skills/pagos-y-suscripciones/SKILL.mdPide, prueba, corrige
Empieza con: Lee el prompt y construye la versión más pequeña que pueda probar hoy. Dime cómo abrirla.
Qué esperar: el agente se equivoca con seguridad. Abre la app, toca cada botón y pega el error exacto cuando algo falle.
1«no funciona: [pega el error]»
2«hazlo más simple»
3«explícame qué hiciste»
Ponla en internet
El camino corto: sube el proyecto a Git y pídele al agente: despliega esto en Vercel o Netlify y dime exactamente qué debo hacer
.
Si necesitas cuentas o pagos, instala primero las skills correspondientes y prueba esos flujos con especial cuidado. No guardes contraseñas ni llaves secretas en el código.
Preséntala en el Cementerio
Comparte qué hiciste y el enlace. Lo revisamos antes de publicarlo: nada sale sin ojos humanos.
Inicia sesión para que tu proyecto lleve tu nombre y podamos evitar spam.
iniciar sesión y presentar