Fecha: 2026-05-27 Contexto: factura.com tiene límites de empresas (emisores), clientes (receptores) y por RFC que chocan con la arquitectura multi-tenant de Cileo.
factura.com opera con límites por cuenta que impactan directamente en Cileo:
| Recurso | Límite factura.com | Impacto en Cileo |
|---|---|---|
| Empresas (emisores) | Limitado | Cada owner es un emisor distinto |
| Clientes (receptores) | Limitado | Cada tenant es un receptor |
| RFCs por cuenta | Limitado | Cada owner tiene RFC propio |
Modelo de credenciales actual (complejo):
FACTURA_API_KEY (global) → headers generales
factura_api_key (por owner) → encriptado en FiscalData
factura_api_secret_key (por owner) → encriptado en FiscalData
- Multi-RFC sin límite: API multi-RFC sin costo adicional por organización
- Sin límite de emisores: cada owner es una organización
- Sin límite de receptores: customers ilimitados por organización
- Validación SAT automática: al crear un customer valida RFC contra el SAT
- Borradores: soporta drafts antes de timbrar
- SDK Node.js oficial:
npm install facturapi - Webhooks: eventos async de timbrado, cancelación, etc.
- Idempotency Key: evita duplicados al reintentar
- external_id: para linkear facturas con registros de Cileo
- Facturación asíncrona: para facturas grandes no bloquea
| Concepto | Costo |
|---|---|
| Suscripción API | $299 MXN/mes |
| Por timbre | $0.60 MXN (IVA incl.) |
| Organizaciones extra (RFCs) | Sin costo adicional |
| Facturación Web | $199 MXN/mes + $0.60/timbre |
| Usuarios adicionales | $99 MXN/mes c/u |
A alto volumen: precios personalizados con ventas.
Actualmente en cileo-backend/src/app/factura/services/emiter.service.ts:
| factura.com | Facturapi | Fricción |
|---|---|---|
POST /v4/account/create (FormData con CSD) |
POST /v2/organizations + PUT /v2/organizations/{id}/certificates |
🟢 Baja — separan creación y subida de CSD |
POST /v4/account/{id}/update |
PUT /v2/organizations/{id}/tax-info |
🟢 Directo |
DELETE /v4/account/{id}/delete |
DELETE /v2/organizations/{id} |
🟢 Directo |
GET /v1/current/account |
GET /v2/organizations/{id} |
🟢 Directo |
GET /v4/series |
GET /v2/organizations/{id}/series |
🟢 Directo |
Actualmente en cileo-backend/src/app/factura/services/receiver.service.ts:
| factura.com | Facturapi | Fricción |
|---|---|---|
POST /v1/clients/create |
POST /v2/customers |
🟢 Mejor — valida RFC contra SAT |
POST /v1/clients/{id}/update |
PUT /v2/customers/{id} |
🟢 Directo |
POST /v1/clients/destroy/{id} |
DELETE /v2/customers/{id} |
🟢 Directo |
Actualmente en cileo-backend/src/app/factura/services/invoice.service.ts:
| factura.com | Facturapi | Fricción |
|---|---|---|
POST /v4/cfdi40/create (FormData) |
POST /v2/invoices (JSON) |
🟢 Mejor — JSON puro |
POST /v4/cfdi40/{uid}/timbrarborrador |
POST /v2/invoices/{id}/stamp |
🟢 Directo |
PUT /v4/cfdi40/{uid}/update (borrador) |
PUT /v2/invoices/{id} (borrador) |
🟢 Directo |
GET /v4/cfdi40/{uid}/pdf |
GET /v2/invoices/{id}/pdf |
🟢 Directo |
GET /v4/cfdi40/{uid}/xml |
GET /v2/invoices/{id}/xml |
🟢 Directo |
POST /v4/cfdi40/{uid}/cancel |
DELETE /v2/invoices/{id}/cancel |
🟢 Directo |
Actualmente en cileo-backend/src/app/billings/services/complemento-pago.service.ts:
| factura.com | Facturapi | Fricción |
|---|---|---|
POST /v4/cfdi40/create (payload complemento) |
POST /v2/invoices con type: "P" |
🟢 Facturapi tiene tipo Pago nativo |
┌─────────────────────────────────────┐
│ Variables de entorno │
│ FACTURA_API_KEY (global) │
│ FACTURA_API_SECRET_KEY (global) │
└──────────┬──────────────────────────┘
│
┌──────────▼──────────────────────────┐
│ FiscalData (por owner) │
│ factura_api_key (encriptado)│
│ factura_api_secret_key (encriptado)│
│ factura_emmiter_id │
└─────────────────────────────────────┘
┌──────────────────────────────────────┐
│ Variables de entorno │
│ FACTURAPI_USER_KEY (admin global) │
└──────────┬───────────────────────────┘
│
┌──────────▼───────────────────────────┐
│ FiscalData (por owner) │
│ facturapi_organization_id │
│ (La Live Key se obtiene de la org) │
└──────────────────────────────────────┘
Beneficio: se elimina la necesidad de encriptar/desencriptar credenciales por owner.
flowchart LR
A[Cileo Backend] -->|POST /v4/cfdi40/create| B[factura.com API]
B -->|FormData con items| C{¿Draft?}
C -->|Sí| D[Devuelve borrador]
C -->|No| E[Timbra directo]
D --> F[POST /v4/cfdi40/{uid}/timbrarborrador]
E --> G[Devuelve UUID]
F --> G
flowchart LR
A[Cileo Backend] -->|POST /v2/invoices| B[Facturapi API]
B -->|JSON con status| C{¿Draft?}
C -->|Sí| D[Devuelve invoice draft]
C -->|No| E[Timbra + devuelve invoice valid]
D --> F[POST /v2/invoices/{id}/stamp]
E --> G[UUID + PDF/XML listos]
F --> G
| Feature | factura.com | Facturapi |
|---|---|---|
| Multi-RFC ilimitado | ❌ Límites | ✅ Sin límite |
| Webhooks | ❌ No | ✅ 6 tipos de eventos |
| Idempotency Key | ❌ No | ✅ Evita duplicados |
| external_id | ❌ No | ✅ Link con DB propia |
| Catálogo de productos | ❌ No | ✅ Reutilizable vía API |
| SDK oficial Node.js | ❌ No | ✅ npm i facturapi |
| Async invoicing | ❌ No | ✅ Para facturas grandes |
| Validación SAT automática | ❌ No | ✅ Al crear customer |
- Hoy: suben CER+KEY en un solo
POSTcomo FormData - Facturapi:
PUT /v2/organizations/{id}/certificatescon el CSD en body - Impacto: cambio mecánico, separar la subida
- Hoy: FormData → factura.com
- Facturapi: JSON limpio
- Impacto: los campos son muy similares, cambia serialización
- Hoy: construyen
ComplementoPagoDtoespecífico - Facturapi:
type: "P"conreceived_payments - Impacto: más fácil, no hay que construir el XML del complemento
- Hoy:
factura_invoice_serieyfactura_complemento_de_pagos_serienuméricos - Facturapi: series alfanuméricas (hasta 25 chars)
- Impacto: migración one-time
- Hoy: una API key global + credenciales por owner encriptadas
- Facturapi: User Key (admin) + Live Key por organización
- Impacto: se elimina
factura_api_key/factura_api_secret_keydeFiscalData
La migración de factura.com a Facturapi tiene una fricción baja a media. El mapping endpoint es casi 1:1 y los cambios son más mecánicos que conceptuales. Facturapi además simplifica el modelo de credenciales que actualmente es lo más complejo de la integración.
Pasos siguientes sugeridos:
- Crear cuenta de prueba en Facturapi (14 días gratis)
- Probar los endpoints clave en sandbox
- Planificar migración de datos de emisores (owners) y receptores (tenants)
- Migrar facturación en paralelo con feature flag