
API Whitelabel: emitir facturas sin enviar correos al cliente
Si integras Factuplan en una app whitelabel, usa sendEmail false al emitir facturas vía API y evita que el correo salga con el logo de Factuplan al cliente.
Si estás integrando el API de Factuplan dentro de tu propio producto — un ERP, un POS, una app vertical, un SaaS para un nicho específico — probablemente quieres que la experiencia del cliente final sea 100% tu marca. Sin embargo, por defecto, cuando emites una factura por el endpoint POST /v1/developer/invoices, Factuplan envía un correo automático al cliente con el RIDE adjunto y con su propio logo y branding — tanto en pruebas (ak_test_*) como en producción (ak_live_*).
Si tu integración es whitelabel, ese correo rompe la ilusión. Tu cliente recibe la factura “de Factuplan”, no de tu app. La buena noticia: el API tiene una bandera explícita para apagar ese envío y dejarte a ti el control del correo. Se llama sendEmail y va en el body del request.
El problema: el correo automático no es whitelabel
El Modo A del API (el camino recomendado) hace todo el flujo de un golpe: crea el XML, lo firma con tu certificado P12, lo autoriza ante el SRI, genera el RIDE en PDF y envía el correo al cliente automáticamente.
Ese correo:
- Sale desde un dominio de Factuplan (no del tuyo).
- Trae la plantilla, los colores y el logo de Factuplan.
- Aparece igual en pruebas y en producción — no hay un “modo silencioso” implícito.
- Incluye el RIDE (PDF) y el XML autorizado como adjuntos.
Para un cliente final que está usando tu plataforma “Acme Facturación”, recibir un correo que dice “Factuplan” lo confunde, te pone en una conversación incómoda (“¿y qué es Factuplan?”) y, peor todavía, le entrega a tu cliente un canal directo para descubrir y comparar con tu proveedor de infraestructura. Si vendes whitelabel, eso te puede costar la relación.
La solución: sendEmail: false
El cuerpo del request del endpoint acepta una bandera booleana llamada sendEmail. Por defecto es true. Si la pones en false, Factuplan:
- Sigue creando el XML, firmándolo, autorizándolo ante el SRI y generando el RIDE.
- No envía ningún correo al cliente.
- Te deja a ti el XML y el PDF disponibles para descargar desde los endpoints
GET /v1/developer/receipts/{id}/xmlyGET /v1/developer/receipts/{id}/pdf.
Es la forma limpia de mantener el flujo automático del SRI sin que tu cliente final vea nada de Factuplan.
Ejemplo mínimo
{
"customer": {
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec"
},
"items": [
{
"code": "SERV-001",
"description": "Servicio de consultoría",
"quantity": 1,
"unitPrice": 150.0,
"taxType": "IVA_RATE",
"tax": 15
}
],
"payments": [
{ "method": "20", "amount": 172.5 }
],
"sendEmail": false
}Fíjate que el campo customer.email puede quedarse — el SRI no lo requiere ni Factuplan tampoco — pero como sendEmail está en false, ese correo nunca se va a usar para notificar. Puedes incluso omitirlo si tu modelo de datos no captura el email del receptor.
Ejemplo completo con cURL
curl https://api.factuplan.com.ec/v1/developer/invoices \
-X POST \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{
"customer": {
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A."
},
"items": [
{
"code": "SERV-001",
"description": "Servicio de consultoría",
"quantity": 1,
"unitPrice": 150.0,
"taxType": "IVA_RATE",
"tax": 15
}
],
"payments": [
{ "method": "20", "amount": 172.5 }
],
"sendEmail": false
}'La respuesta es la misma 201 Created que en el flujo normal, con el id del comprobante en estado PROCESSING. Después haces polling a GET /v1/developer/receipts/{id}/status hasta que llegue a AUTHORIZED y descargas tú mismo el RIDE para mandárselo al cliente desde tu propio servicio de correo.
Body completo del endpoint POST /v1/developer/invoices
Para que no tengas que saltar entre pestañas, este es el body completo que acepta el endpoint según la referencia del API. El campo sendEmail está al mismo nivel que customer, items y payments.
{
"customer": {
"customerId": "cust_id (opcional)",
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec",
"address": "Guayaquil, Ecuador",
"phone": "+593985691039",
"saveToContacts": true
},
"items": [
{
"quantity": 1,
"productId": "prod_id (opcional)",
"code": "SERV-001",
"auxiliaryCode": "AUX-001 (opcional)",
"description": "Servicio de consultoría",
"unitPrice": 150.0,
"discount": 0,
"taxType": "IVA_RATE",
"tax": 15,
"saveToProducts": false
}
],
"emissionPointId": "ep_id (opcional)",
"establishment": "001 (opcional)",
"emissionPoint": "001 (opcional)",
"additionalInfo": { "Vendedor": "Juan Pérez" },
"sendEmail": true,
"payments": [
{
"method": "20",
"amount": 172.5,
"term": 30,
"timeUnit": "dias"
}
]
}Campos del customer
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
customerId | string | No | Si se envía, ignora los demás campos y usa el cliente del directorio. |
identificationType | enum | Sí | RUC, CEDULA, PASSPORT, FINAL_CONSUMER. |
identification | string | Sí | RUC = 13 dígitos · CEDULA = 10 dígitos. |
legalName | string | Sí | Razón social o nombre completo. |
email | string | No | Útil solo si sendEmail queda en true. |
address | string | No | Aparece en el RIDE. |
phone | string | No | Formato libre. |
saveToContacts | boolean | No | Si true, lo guarda en tu directorio. |
Campos de cada item
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
quantity | number | Sí | Cantidad facturada. |
productId | string | No | Si se envía, los demás campos pueden omitirse. |
code | string | Sí | Identificador del ítem. |
auxiliaryCode | string | No | Código secundario (SKU, código de barras…). |
description | string | Sí | Aparece en el RIDE. |
unitPrice | number | Sí | Hasta 4 decimales de precisión. |
discount | number | No | Descuento por línea. |
taxType | enum | Sí | IVA_0, IVA_RATE, NOT_TAXABLE, EXEMPT. |
tax | number | Sí cuando taxType=IVA_RATE | 0, 5, 8, 12, 14, 15 (default 15). |
saveToProducts | boolean | No | Si true, lo guarda en tu catálogo. |
Campos al nivel raíz
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
customer | object | Sí | Datos del receptor del comprobante. |
items | array | Sí | Al menos un ítem facturable. |
payments | array | No | Si se omite, se aplica "01" (Sin utilización del sistema financiero). |
emissionPointId | string | No | UUID del punto de emisión. Tiene prioridad sobre establishment/emissionPoint. |
establishment | string | No | Código SRI (3 dígitos). |
emissionPoint | string | No | Código SRI (3 dígitos). |
additionalInfo | object | No | Pares clave/valor que aparecen en el RIDE. |
sendEmail | boolean | No (default true) | Si false, Factuplan no envía el correo automático al cliente. Indispensable para integraciones whitelabel. |
Formas de pago (payments)
Cada entrada lleva el código SRI en method, el amount y, opcionalmente, term + timeUnit. La suma de los amount debe ser exactamente igual al total con impuestos o el SRI rechaza la factura con 400.
| Código | Descripción |
|---|---|
01 | Sin utilización del sistema financiero |
15 | Compensación de deudas |
16 | Tarjeta de débito |
17 | Dinero electrónico |
18 | Tarjeta prepago |
19 | Tarjeta de crédito |
20 | Otros con utilización del sistema financiero |
21 | Endoso de títulos |
Y entonces, ¿cómo le mando el RIDE al cliente?
Una vez que el comprobante pasa a estado AUTHORIZED, descarga el PDF (RIDE) y el XML desde el API y envíalo por tu propio servicio de correo (Resend, Postmark, SES, Mailgun, SendGrid, lo que uses).
1. Espera la autorización
curl https://api.factuplan.com.ec/v1/developer/receipts/$RECEIPT_ID/status \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001"status empieza en PROCESSING y evoluciona a AUTHORIZED → COMPLETED. Si recibes un evento webhook, igual confirma el estado con GET /v1/developer/receipts/{id} antes de disparar el correo.
2. Descarga el RIDE (PDF)
curl https://api.factuplan.com.ec/v1/developer/receipts/$RECEIPT_ID/pdf \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001"Devuelve dos URLs: url (pre-firmada, expira en 5 minutos — ideal para descargarla a tu servidor y adjuntarla al correo) y previewUrl (permanente, ideal para enlazar desde tu panel).
3. Descarga el XML autorizado
curl https://api.factuplan.com.ec/v1/developer/receipts/$RECEIPT_ID/xml \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001"Misma estructura: url pre-firmada de 5 minutos + previewUrl permanente. Adjunta ambos al correo que envías desde tu dominio.
4. Manda el correo desde tu marca
Plantilla HTML con tu logo, tu dominio (facturas@tu-app.com), tu tono, tus enlaces. El cliente final recibe un solo correo y la marca es 100% la tuya. Factuplan queda invisible — exactamente lo que pide un contrato whitelabel.
¿Pruebas o producción? El logo aparece en ambos
Algo que confunde a los integradores nuevos: el correo con logo de Factuplan se manda igual en pruebas que en producción. No hay un “modo silencioso” automático para ak_test_*. Si emites con una API key de pruebas y sendEmail: true, tu cliente de pruebas (o tú mismo en QA) recibe el correo branded de Factuplan.
Por eso, si estás construyendo una integración whitelabel, lo más sano es dejar sendEmail: false desde el primer día, incluso en desarrollo. Así:
- Tu QA ve el flujo exacto que va a ver el cliente en producción.
- Nunca te queda un
sendEmail: true“olvidado” cuando promoves a prod. - Tus pruebas con correos reales pasan por tu propio servicio de correo y descubres ahí los problemas de entregabilidad.
Casos donde sí conviene dejar sendEmail: true
No siempre el envío automático es un problema. Si tu integración:
- Es interna (un ERP de tu empresa) y los receptores ya saben qué es Factuplan.
- Es un MVP y aún no tienes infraestructura de correo propia.
- Apunta a un cliente que prefiere usar el correo tal cual viene, sin personalizar.
…entonces deja sendEmail: true (o sencillamente omite el campo) y deja que Factuplan haga el envío. El esfuerzo de armar plantillas, manejar bounces, autenticar SPF/DKIM y monitorear deliverability no es trivial — si no lo necesitas para diferenciarte, no lo construyas todavía.
La pregunta clave para decidir: ¿el cliente final sabe que existe Factuplan, o crees que sería mejor que no lo supiera? Si la respuesta es la segunda, sendEmail: false es obligatorio.
Otros endpoints relacionados al flujo whitelabel
Si la idea es esconder a Factuplan, conviene revisar también:
GET /v1/developer/receipts/{id}/pdf— descarga el RIDE para adjuntarlo a tu correo.GET /v1/developer/receipts/{id}/xml— descarga el XML autorizado.GET /v1/developer/verify/{accessKey}— para verificar contra el SRI sin pasar por la UI de Factuplan.POST /v1/developer/sign(Modo C) — si quieres todavía más control: tú generas el XML, Factuplan solo te lo firma y tú te encargas de mandarlo al SRI por tu cuenta. Modo más complejo pero el más whitelabel posible.
Para un comparativo de qué tan flexible es el API de Factuplan frente a otros proveedores ecuatorianos, revisa Factuplan vs Dátil y la lista de los 10 mejores facturadores electrónicos de Ecuador.
Checklist rápido para una integración whitelabel limpia
sendEmail: falseen cada llamada aPOST /v1/developer/invoices.- Tu propio servicio de correo configurado (SPF, DKIM, DMARC, dominio dedicado).
- Plantilla HTML del correo con tu logo y tus enlaces — sin mencionar Factuplan.
- Webhook o polling a
GET /v1/developer/receipts/{id}/statuspara saber cuándo estáAUTHORIZED. - Adjuntar siempre el PDF (RIDE) y el XML autorizado al correo. El XML lo necesita el contador del receptor.
- Plantilla con el botón “Verificar en el SRI” enlazando al portal oficial — refuerza la legitimidad sin depender de Factuplan.
- Si tu cliente exige también ocultar Factuplan del PDF, abre conversación con el equipo de Factuplan para revisar plantillas personalizadas del RIDE.
¿Estás integrando el API y tienes una duda específica de implementación? Escríbenos a info@factuplan.com.ec o revisa la documentación completa del API REST. Si trabajas en Node.js o TypeScript, también está el SDK oficial que te ahorra cabecear con cURL.
Preguntas frecuentes
¿Qué hace exactamente sendEmail: false en el API de Factuplan?
Le indica al endpoint POST /v1/developer/invoices que NO envíe el correo automático con el RIDE al receptor. Factuplan sigue haciendo todo lo demás del Modo A (crea el XML, lo firma con tu P12, lo autoriza ante el SRI y genera el PDF), pero no dispara el correo. Tú quedas con el comprobante AUTHORIZED y descargas el RIDE y el XML por separado desde GET /v1/developer/receipts/{id}/pdf y /xml para mandarlos por tu propio servicio de correo.
¿Por qué es importante usar sendEmail: false en integraciones whitelabel?
Porque por defecto Factuplan envía el correo automático con su propio logo, plantilla y dominio, tanto en pruebas (ak_test_*) como en producción (ak_live_*). Si tu producto es whitelabel — un ERP, POS o SaaS vertical que vendes con tu marca — ese correo le revela al cliente final que estás usando Factuplan como infraestructura. Apagarlo con sendEmail: false te permite enviar el correo desde tu propio dominio, con tu plantilla y tu marca, manteniendo a Factuplan completamente invisible.
¿El logo de Factuplan también aparece en los correos de pruebas?
Sí. No existe un modo silencioso automático para las API keys de pruebas (ak_test_*). El correo se envía con el mismo branding de Factuplan tanto en pruebas como en producción. Por eso lo recomendado para integraciones whitelabel es dejar sendEmail: false desde el primer día, incluso en desarrollo y QA — así pruebas el flujo exacto que verá el cliente en producción y nunca te queda un sendEmail: true olvidado al subir a prod.
¿Dónde va el campo sendEmail dentro del body del request?
Al nivel raíz del body, al mismo nivel que customer, items y payments. No va dentro de customer. Es un booleano opcional cuyo valor por defecto es true. Ejemplo: { 'customer': { ... }, 'items': [...], 'payments': [...], 'sendEmail': false }. Si lo omites, Factuplan asume sendEmail: true y envía el correo automático.
Si pongo sendEmail: false, ¿cómo le entrego el RIDE al cliente?
Después de que el comprobante pase a estado AUTHORIZED (lo confirmas con GET /v1/developer/receipts/{id}/status), descargas el PDF con GET /v1/developer/receipts/{id}/pdf y el XML con GET /v1/developer/receipts/{id}/xml. Ambos endpoints devuelven una URL pre-firmada de 5 minutos (para descargarla a tu servidor y adjuntarla) y una previewUrl permanente. Luego mandas el correo desde tu propio servicio (Resend, Postmark, SES, Mailgun, SendGrid) con tu logo, tu dominio y los dos archivos adjuntos.
¿sendEmail: false afecta la autorización ante el SRI?
No. La autorización ante el SRI es completamente independiente del envío del correo. Factuplan sigue firmando el XML con tu certificado P12, enviándolo al SRI y obteniendo la autorización (status AUTHORIZED y authorizationNumber) exactamente igual que con sendEmail: true. Lo único que cambia es que el correo automático al receptor no se dispara. El comprobante queda igual de válido ante el SRI.
¿Puedo usar sendEmail: false junto con el customer.email o ya no tiene sentido?
Puedes mantener customer.email en el body — el campo no genera error, simplemente no se utiliza porque sendEmail está desactivado. De hecho, conviene guardarlo en tu propia base de datos porque es el correo al que tu sistema le va a enviar el RIDE desde tu servicio de correo. Si tu modelo de datos no captura el email del receptor, también puedes omitir customer.email del body sin problema: no es un campo requerido por el SRI.
Equipo Factuplan
Especialista en facturación electrónica
Equipo editorial de Factuplan, especializado en facturación electrónica y normativa tributaria del SRI.
Conocer al equipoArtículos relacionados

Mejores aplicaciones de facturación electrónica para tu negocio
Comparativa de las mejores aplicaciones de facturación electrónica para tu negocio en Ecuador, con Factuplan como la opción líder y por qué.

Compartir tu factura electrónica con un link único en Factuplan
Comparte tu factura electrónica con cualquier cliente enviando un link directo desde Factuplan: sin adjuntos, sin XML y sin descargar el PDF.

Las facturas electrónicas más rápidas del Ecuador en 2026
Por qué Factuplan emite las facturas electrónicas más rápidas del Ecuador: autorización en segundos, onboarding en 30 minutos y modo contingencia.
Empieza a facturar electrónicamente hoy
1 mes gratis al comprar tu firma electrónica con FirmaOK. Sin tarjeta de crédito, sin compromiso.
