ForgeStack
forgestack/billing · PHP puro · Laravel + Symfony · 🇲🇽 Solo México

Suscripciones con OXXO y SPEI.
CFDI automático en cada cobro.

El motor de billing para PHP SaaS en México. OXXO no se renueva solo — nosotros lo gestionamos. Cada cobro genera su CFDI automáticamente. Dunning en español con WhatsApp.

Laravel 11 / 12 ✓ Symfony 7 ✓ PHP ≥ 8.2 CFDI 4.0 ✓ OXXO ✓ SPEI ✓
OXXO · SPEI · Tarjeta — renovación automática
CFDI 4.0 automático — obligatorio en cada cobro SAT
Advisory lock — cero doble cobros
Dunning en español por email + WhatsApp
El problema real del SaaS en México

Construir billing en México
es más difícil de lo que parece.

Stripe resuelve billing en EUA. En México tienes OXXO, CFDI obligatorio y clientes que no tienen tarjeta. Ninguna librería genérica cubre esto.

OXXO no se renueva solo

Los vouchers OXXO expiran en 3 días. Cada periodo de facturación necesita un nuevo voucher, entregado al cliente, y reconciliado cuando paga días después. Ningún paquete PHP resuelve esto de fábrica — tienes que construirlo desde cero.

CFDI antes de cobrar — o multa

El SAT exige emitir el CFDI antes de cobrar. Construir la máquina de estados timbra → cobra → rollback si algo falla son 2 a 3 semanas de ingeniería. Y si tu CFDI queda huérfano porque el cobro falló, tienes un problema de cumplimiento fiscal.

Dunning en inglés no funciona

El dunning genérico manda "Your payment failed" por email. Las PYMEs mexicanas leen WhatsApp — no el email. Y cuando el voucher OXXO expiró, necesitan un nuevo enlace de pago, no un mensaje de error en inglés.

Lo que incluye el módulo

Billing completo para el mercado mexicano

Motor de suscripciones PSR

Planes, periodos, trial, prorrateo y metered billing. Núcleo PHP puro — bridges para Laravel y Symfony incluidos. Sin dependencias de framework en el core.

Reconciliación OXXO y SPEI

Cuando el cliente paga en OXXO días después de recibir el voucher, el módulo reconcilia automáticamente y avanza el ciclo. Advisory lock previene dobles créditos.

CFDI en cada factura — automático

El módulo timbra el CFDI antes de ejecutar el cobro. Si el timbrado falla, el cobro se cancela. Si el cobro falla, el CFDI se cancela. Cumplimiento fiscal garantizado por diseño.

Dunning automático ES + EN

Emails de cobranza bilingües con enlace al nuevo voucher OXXO. Integración nativa con forgestack/whatsapp para envío por WhatsApp cuando el email no es suficiente.

Advisory lock — cero doble cobros

Lock de advisory DB + constraint único (subscription_id, periodo) + clave de idempotencia determinista. Tres capas de protección. El cobro doble es un P0 — aquí es imposible por diseño.

Trial gratuito + alertas de fin

Trial con fecha de expiración, evento TrialWillEnd configurable, periodo de gracia y conversión automática a plan de pago cuando el trial termina.

Integración con latam-pay y cfdi-mexico

Se conecta con forgestack/latam-pay para los cobros y forgestack/cfdi-mexico para el timbrado mediante adaptadores PSR-14. Cero configuración extra si ya tienes ambos paquetes.

Metered billing y uso por tenant

Factura por uso: API calls, transacciones, storage. Acumula uso por periodo y factura al cerrar el ciclo. Ideal para SaaS con precios variables.

La invariante que te protege del SAT

Primero timbra. Luego cobra.
Siempre. Sin excepciones.

La ley mexicana exige emitir el CFDI antes de cobrar. ForgeStack lo implementa como una invariante en el motor: si el timbrado falla, el cobro se cancela. Si el cobro falla, no hay CFDI huérfano. Si el módulo detecta un CFDI ya emitido para el mismo periodo, no timbra de nuevo — es idempotente.

Esta garantía no depende de que tu equipo la recuerde. Está en el código y se verifica en cada ciclo de facturación.

Timbrado falla → cobro cancelado automáticamente
Cobro falla → CFDI cancelado con el PAC automáticamente
CFDI ya emitido para el periodo → no timbra de nuevo (idempotente)
Webhook duplicado → reconciliación no-op garantizada
ciclo de facturación
subscription → ACTIVE
↓ billing cycle starts
invoice → DRAFT
↓ CFDI stamped (PAC)
invoice → STAMPED ✓ UUID: abc123…
↓ gateway charge (latam-pay)
invoice → PAID ✓ payment_id: xyz
↓ WhatsApp receipt sent
next cycle scheduled ✓
# Si el timbrado falla:
invoice → STAMP_FAILED
↳ cobro cancelado — sin cargo
PHP puro · sin lock-in de framework

Un motor. Laravel y Symfony.
El mismo billing.

El núcleo es PHP puro. Los bridges de framework son adaptadores delgados — un composer require es todo lo que necesitas.

Laravel 11 / 12
# Facade con ServiceProvider automático
use ForgeStack\Billing\Facades\Billing;
Billing::subscribe($cliente, $plan);
Billing::runCycle($tenantId);
Billing::cancel($subscriptionId);
CFDI timbrado · cobro ejecutado
Symfony 7
# Bundle + autowiring automático
use ForgeStack\Billing\BillingRunner;
class SubscriptionController {
public function __construct(
private BillingRunner $runner
) {}
$runner->runForTenant($tenantId);
}
Ciclo completado
El stack completo para México

Billing orquesta. Los demás ejecutan.

Billing actúa como el director de orquesta: gestiona el ciclo de vida de cada suscripción y delega el cobro y el timbrado a los módulos especializados. Cada módulo funciona por separado — juntos son el stack de compliance para México.

🇲🇽 Acceso anticipado — Lanzamiento 2027

Billing para México.
Listo el día que lo instalas.

Únete a la lista de espera. Los suscriptores anticipados bloquean el precio de MXN$1,580 — el precio regular al lanzamiento será MXN$1,999.

Sin spam. Solo te avisamos cuando el módulo esté disponible.

MXN$1,580
Precio anticipado
OXXO
· SPEI
Tarjeta también
Laravel
+ Symfony
PHP puro
40+
Horas ahorradas
¿También necesitas pagos? LATAM Pay → ¿Necesitas facturación CFDI? CFDI México →