Pagos para una empresa unipersonal: Stripe, Paddle, Lemon Squeezy o WeChat Pay

"Paddle: conceder acceso y gestionar el estado de suscripción con webhooks"
Aviso: este texto no es asesoría fiscal, legal, societaria, cambiaria ni de elegibilidad. Para Merchant of Record, VAT/GST/sales tax, entidades nacionales o extranjeras y liquidaciones, consulta las condiciones del servicio y a profesionales.
Tu pricing.ts define starter_monthly, pro_yearly, lifetime_license y wechat_one_time, pero la base solo tiene is_paid. Llega checkout.session.completed y el cliente vuelve por success_url, aunque entitlements sigue vacío. No falla el botón: el sistema no conecta productos, pedidos, suscripciones y acceso.
Antes de elegir proveedor hay cinco preguntas: qué vendes, cómo cobras, a quién, quién asume la transacción y el impuesto sobre ventas, y quién concede acceso tras el pago. Stripe, Paddle, Lemon Squeezy y WeChat Pay no son cuatro botones equivalentes; cubren responsabilidades distintas.
Define el modelo de venta antes del proveedor de pagos
Una compra única gira alrededor del pedido y la entrega. Una suscripción SaaS exige todo el billing lifecycle. El cobro por uso también necesita datos de consumo trazables. Lleva primero el modelo a products, prices y tablas locales.
| Modelo de venta | Puntos de partida | Eventos asíncronos clave | Tablas locales principales |
|---|---|---|---|
| Producto digital de compra única | Stripe / Paddle / Lemon Squeezy | checkout.session.completed / transaction.completed / order_created | orders + entitlements |
| Suscripción SaaS | Stripe Billing / Paddle Billing / Lemon Squeezy | customer.subscription.* / subscription.* | subscriptions + entitlements + usage_events si aplica |
| Suscripción y compra única | Stripe Billing / Paddle Billing | Varios eventos | orders + subscriptions + entitlements |
| China continental o WeChat | WeChat Pay (JSAPI/H5/Native) | Callback y consulta del pedido | orders + wechat_prepay |
Tres puntos importantes:
- Una venta única necesita pedido, entrega, reembolso y reenvío, no todo el ciclo de suscripción.
- Un SaaS recurrente necesita
subscriptionsconcurrent_period_start/end,cancel_atystatus; el consumo añadeusage_eventsauditables. - WeChat Pay es vía de pago y sistema de comercio, no Merchant of Record global ni plataforma de SaaS billing.
Las capacidades cambian. Antes de integrar, revisa región de cuenta, modo de producto, medios de pago, versión de API y condiciones.
Un Merchant of Record no elimina todas las responsabilidades
Un Merchant of Record, o MoR, es el vendedor registrado de una transacción. Paddle y Lemon Squeezy usan este modelo para productos digitales elegibles y gestionan pago, impuesto sobre ventas, reembolso o disputas dentro de ese alcance. Reduce la operación fiscal global, pero no elimina obligaciones de renta, entidad, producto, datos y contabilidad.
Con Stripe, el comercio suele seguir siendo el vendedor registrado. Stripe Tax ayuda a calcular sales tax, VAT y GST y ofrece herramientas de supervisión y registro, pero no convierte automáticamente a Stripe en Merchant of Record. Registro, declaración y entidad dependen de la jurisdicción y la transacción.
No elijas un MoR por un umbral fijo de ingresos. Compara estas dimensiones:
| Dimensión | Stack propio de pago y billing | Merchant of Record |
|---|---|---|
| Personalización | Combinar Checkout, Billing, Tax, facturas y procesos internos | Seguir política de producto, checkout, contrato y liquidación de la plataforma |
| Operación fiscal y de cobro | El comercio confirma registro, declaración, facturas, reembolsos y disputas | El MoR asume impuesto, pago y parte del cumplimiento en transacciones cubiertas |
| Costo | Sumar herramientas fiscales, ingeniería, finanzas y soporte a la comisión | Evaluar liquidación, reembolso, extras y límites, no solo porcentaje |
| Mejor encaje | Mucha personalización, operación existente o contratos especiales | Menos trabajo fiscal global y de suscripciones para productos elegibles |
El límite contractual y fiscal depende de entidad, territorio, producto y cliente. Una página comercial no sustituye las condiciones ni el asesoramiento.
Cómo elegir Stripe, Paddle, Lemon Squeezy o WeChat Pay
Si necesitas suscripciones y WeChat Pay, separa primero los problemas. Ciclo de suscripción, pagos globales y China pueden usar servicios distintos. Que un método aparezca en la plataforma no significa que funcione en cada región, modo Checkout o cobro recurrente.
| Servicio | Responsabilidad | Suscripciones y compras únicas | Pagos en China | Licencia nativa | Buen punto de partida |
|---|---|---|---|---|---|
| Stripe | Payment, Billing y Tax; normalmente no MoR | Checkout y Billing muy personalizables | Alipay/WeChat Pay dependen de región, divisa y modo | Sin License Key general | SaaS que controla pagos, suscripciones, impuestos y procesos |
| Paddle | Merchant of Record | Paddle Billing y Checkout | Revisar Dashboard y documentación por cuenta y región | La aplicación gestiona acceso | Software que quiere reducir impuesto global y operación recurrente |
| Lemon Squeezy | Merchant of Record | Digitales, suscripciones simples y consumo | Alipay/WeChat Pay en compras únicas; suscripción más limitada | License Keys | Productos digitales, licencias y primeras suscripciones |
| WeChat Pay | Vía de pago y sistema de comercio | JSAPI/H5/Native; ciclo de billing propio | China continental y WeChat | Ninguna | Compras únicas en RMB y checkout WeChat |
La documentación oficial confirmaba el 18 de julio de 2026:
- Stripe Checkout ofrece páginas alojadas, integradas y componentes combinables. Los métodos dependen de región, divisa y modo Checkout.
- Paddle entrega webhooks al menos una vez. Si el endpoint no devuelve
200en cinco segundos, reintenta. Puede duplicar o desordenar; usaevent_idyoccurred_at. - Lemon Squeezy lista Cards, PayPal, Apple Pay, Google Pay, Alipay, WeChat Pay, Cash App Pay y bank debits. Las suscripciones solo admiten Cards, Apple Pay, Google Pay y PayPal.
- WeChat Pay H5 necesita crear el pedido en servidor, recibir callback y consultar el estado. El retorno del navegador no es definitivo.
Comisiones, medios, liquidación, países y políticas cambian. Abre las páginas de precios y contratos actuales al preparar el presupuesto.
El webhook es la frontera de sincronización de acceso
Dos fallos comunes:
- Llega
checkout.session.completedy se visitasuccess_url, peroentitlementsno cambia y el cliente no accede. - El mismo evento entra dos veces en
webhook_eventsy el handler emite dos licencias.
Ambos tratan una solicitud HTTP o la página de éxito como verdad final. Los eventos pueden duplicarse, retrasarse o llegar desordenados; algunos estados requieren consulta o un evento posterior.
Principios para diseñar el endpoint webhook
| Principio | Stripe | Paddle | Lemon Squeezy | WeChat Pay |
|---|---|---|---|---|
| HTTPS endpoint | Obligatorio | Obligatorio | Obligatorio | Obligatorio |
| Verificación de firma | Stripe-Signature | Paddle-Signature | X-Signature | Firma WeChat Pay API v3 |
| Clave idempotente | ID de evento u objeto | event_id | Tipo + ID de objeto o clave única | out_trade_no e ID de transacción |
| Respuesta | Verificar y guardar, responder rápido y procesar aparte | 200 en cinco segundos | Responder éxito y procesar aparte | Seguir contrato API vigente |
| Compensación | Consultar pago o suscripción | Consultar entidades y reconciliar | Consultar pedido o suscripción | Consultar, conciliar y recuperar manualmente |
Reglas operativas:
- Webhook o callback inicia la sincronización.
success_urlsolo muestra procesamiento. - Verifica la firma y guarda el evento o campos necesarios en
webhook_events; mueve el trabajo complejo a un job asíncrono. - Impón una restricción única y registra
event_id,source,occurred_at,processed_at,statusypayload_hash. - Para el desorden, compara hora del proveedor, actualización del objeto o versión del estado, no solo llegada.
- Ejecuta reconciliation, consulta pedido o suscripción y conserva recuperación manual.
Tablas de pedidos, suscripciones, acceso y eventos
| Tabla | Campos principales | Stripe | Paddle | Lemon Squeezy |
|---|---|---|---|---|
orders | provider_order_id, customer_id, amount, currency, status, created_at | Checkout Session / PaymentIntent | transaction | order |
subscriptions | provider_subscription_id, customer_id, status, current_period_end, cancel_at | subscription | subscription | subscription |
entitlements | user_id, product_id, feature_key, source, status, expires_at | Derivado de order o subscription | Derivado de transaction o subscription | Derivado de order, subscription o license |
webhook_events | provider, event_id, occurred_at, processed_at, status, payload_hash | Idempotencia y auditoría | Idempotencia y orden | Idempotencia y auditoría |
No copies cada objeto de la API. Define campos estables para decidir acceso y guarda IDs del proveedor para consultas y reconciliation.
Estrategias de sincronización de acceso
| Estrategia | Cuándo usarla | Implementación |
|---|---|---|
| Lean cache | La mayoría de SaaS recurrentes | Guardar customer, subscription, status, price y product necesarios y actualizar por eventos |
| State mirror | Vistas offline o paneles operativos complejos | Replicar más datos, registrar actualización y evitar desajustes con reconciliation |
| License key | Producto digital único o software de escritorio | Guardar instance ID y verificar store, product, variant y customer; la clave no es un sistema de usuarios |
Paddle recomienda lean cache para la mayoría de aplicaciones. Usa state mirror solo si necesitas consultas locales más ricas. Las claves de Lemon Squeezy también exigen validar producto y cliente y vincular la instance con tu cuenta y dispositivo.
Puntos de integración de cada servicio
Estos puntos delimitan la primera implementación, no sustituyen la documentación completa.
Integrar Stripe
Un SaaS inicial puede usar Checkout alojado y Customer Portal en lugar de mantener un formulario de tarjeta. Stripe Billing gestiona suscripciones, facturas, consumo y recuperación de ingresos. Stripe Tax es herramienta fiscal, no Merchant of Record.
Productos y precios deben mapearse a acceso local: product_id es producto o paquete; price_id, mensual, anual, seat o usage. No dejes solo is_paid en users.
Consulta el tutorial de carrito Next.js y pago con Stripe para Checkout Session, endpoint webhook y pedidos.
Integrar Paddle
Confirma que el tutorial usa Paddle Billing, no Paddle Classic. Cambian API, webhooks, Paddle.js y Product/Price.
Paddle Checkout muestra la caja, pero la aplicación hace provisioning. Normalmente basta con customer, subscription, status, price, product y scheduled change. Crea state mirror solo si operaciones necesita datos completos.
Actualiza ambos modelos por webhook y ejecuta reconciliation. Un Merchant of Record no sabe automáticamente quién usa cada función.
Integrar Lemon Squeezy
Lemon Squeezy sirve para productos digitales, licencias y suscripciones simples. Ofrece Merchant of Record, checkout, suscripciones, usage-based billing, webhooks y License Keys. Confirma tarifas y alcance en el store plan actual.
Tras activar una clave, guarda instance ID y verifica store_id, product_id, variant_id y customer. Una clave ajena o revendida no debe activar Pro.
Para suscripción con WeChat Pay, revisa aparte los métodos recurrentes. La documentación lista WeChat Pay y Alipay, pero las suscripciones solo admiten Cards, Apple Pay, Google Pay y PayPal.
Límites de WeChat Pay
WeChat Pay funciona para China continental y WeChat, pero no es Merchant of Record global ni ciclo SaaS completo. El comercio gestiona estado, firma, consultas, reembolsos, reconciliation, facturas y acceso.
H5, JSAPI, Mini Program y Native son escenarios de pago. En H5, el backend crea el pedido y entrega h5_url; al volver el navegador, consulta el pedido y aplica el callback al mismo out_trade_no.
Verifica permisos, entidad, dominios, tarifas y parámetros en la documentación vigente de WeChat Pay.
Siguiente paso: convertir el botón en una máquina de estados comprobable
Después de elegir, divide la integración en tareas verificables:
- Crea
orders,subscriptions,entitlementsywebhook_events; añadeusage_eventspara consumo. - Implementa firma, idempotencia, desorden, confirmación rápida y recuperación para cada webhook o callback.
- Haz que la página de éxito consulte el pedido local en lugar de escribir
is_paid=true. - Añade pruebas de consulta, reconciliation, reembolso, renovación fallida y recuperación manual.
- Reenvía eventos e invierte actualizaciones en sandbox; el acceso no debe duplicarse ni revertirse por error.
Para backend y base de datos, continúa con Supabase Edge Functions y los artículos de backend y datos de esta serie. Completar no es volver de la página de pago: pedidos, suscripciones y acceso deben converger al estado correcto pese a duplicados, retrasos, desorden y reembolsos.
Elegir e implementar un sistema de pagos para un negocio unipersonal
Parte del modelo de venta, las responsabilidades y el mercado para elegir proveedores y crear una sincronización de acceso auditable.
⏱️ Estimated time: 45 min
- 1
Step 1: Definir el modelo de venta
Especifica compra única, suscripción SaaS, cobro por uso o modelo híbrido, con reglas de reembolso, renovación, cambio de plan y fin de acceso. - 2
Step 2: Asignar responsabilidades fiscales y operativas
Decide si combinarás pago, billing y Tax o usarás un Merchant of Record. Confirma entidad y obligaciones fiscales con las condiciones del proveedor y asesoría profesional. - 3
Step 3: Elegir vías de pago por mercado
Evalúa Stripe, Paddle y Lemon Squeezy para tarjetas y suscripciones globales, y WeChat Pay para compras únicas en China continental o WeChat, verificando región, categoría y elegibilidad. - 4
Step 4: Crear el estado local
Crea orders, subscriptions, entitlements y webhook_events. Usa IDs únicos de evento o pedido para idempotencia y auditoría. - 5
Step 5: Probar la sincronización asíncrona
Prueba firmas, duplicados, desorden, tiempos de espera, reembolsos, renovaciones fallidas y recuperación manual. La página de éxito solo muestra el estado.
FAQ
¿Cuál es la diferencia principal entre Stripe, Paddle y Lemon Squeezy?
¿Conviene empezar con un Merchant of Record o con Stripe?
¿Paddle o Lemon Squeezy activan automáticamente el acceso SaaS?
Si Lemon Squeezy admite WeChat Pay, ¿puede cobrar suscripciones con WeChat Pay?
¿WeChat Pay puede sustituir a Stripe para un SaaS global?
¿Cómo se manejan webhooks duplicados, desordenados o perdidos?
¿Qué tablas necesita un sistema de pagos mínimo?
9 min de lectura · Publicado el: 21 oct 2026
Guia de stack tecnico para solo founders
Si llegaste desde búsqueda, lo más rápido es ir al artículo anterior o siguiente de esta misma serie.
Anterior
Elegir base de datos en solitario: D1, Postgres, R2, S3 o SQLite
Clasifica datos de negocio, eventos, archivos, cachés, datos locales y copias antes de elegir D1, Postgres, R2, S3 o SQLite según costos y señales de migración.
Parte 8 de 9
Siguiente
Este es el artículo más reciente de la serie por ahora.



Comentarios
Inicia sesión con GitHub para dejar un comentario