Cómo Generar Facturas Programáticamente — TongoRender Blog
Volver al Blog
tutorialsinvoiceautomationpdf

Cómo Generar Facturas Programáticamente

Aprende a automatizar la generación de facturas con plantillas HTML y una API de PDF. Tutorial paso a paso con ejemplos de código en JavaScript.

Equipo TongoRender3 de marzo de 202612 min

Crear facturas manualmente es tedioso, propenso a errores y simplemente no escala. Ya sea que manejes una plataforma SaaS que factura a cientos de clientes o una tienda en línea que procesa miles de pedidos, necesitas una forma de generar facturas profesionales automáticamente. En este tutorial, construiremos un sistema completo de generación de facturas usando plantillas HTML y la API de PDF de TongoRender.

El Problema: La Creación Manual de Facturas No Escala

Muchos negocios pequeños comienzan con una hoja de cálculo o una plantilla de Word para facturas. Esto funciona bien cuando tienes cinco clientes, pero se desmorona rápidamente:

  • Costo de tiempo — Cada factura toma de 5 a 15 minutos para crear manualmente. Con 100 facturas al mes, eso equivale a 8 a 25 horas de captura de datos tediosa.
  • Errores — La captura manual de datos lleva a errores de escritura, montos incorrectos y conceptos faltantes. Los errores en facturas dañan la confianza del cliente y crean dolores de cabeza contables.
  • Inconsistencia — Diferentes miembros del equipo producen facturas con diferentes formatos, haciendo que tu negocio se vea poco profesional.
  • Sin rastro de auditoría — Las facturas manuales dificultan el seguimiento de qué se envió, cuándo y a quién.

La Solución: Generación Basada en Plantillas vía API

El enfoque moderno es separar la plantilla de la factura (el diseño visual) de los datos de la factura (información del cliente, conceptos, montos). Tu aplicación genera el HTML fusionando la plantilla con los datos, luego lo envía a una API de PDF para producir un documento pulido.

Este enfoque te da:

  • Velocidad — Genera cientos de facturas por minuto.
  • Precisión — Los datos vienen directamente de tu base de datos, eliminando errores manuales.
  • Consistencia — Toda factura usa la misma plantilla e imagen de marca.
  • Automatización — Dispara la generación de facturas en eventos como renovación de suscripción, finalización de pedido o recepción de pago.

Paso 1: Diseña Tu Plantilla de Factura

Comienza con una plantilla HTML que represente el diseño de tu factura. Usa CSS para el estilo — la API de PDF lo renderizará exactamente como lo haría un navegador:

const plantillaFactura = (datos) => `
<!DOCTYPE html>
<html>
<head>
  <style>
    body { font-family: 'Helvetica Neue', Arial, sans-serif; color: #333; margin: 0; padding: 40px; }
    .header { display: flex; justify-content: space-between; margin-bottom: 40px; }
    .nombre-empresa { font-size: 24px; font-weight: bold; color: #1a1a2e; }
    .info-factura { text-align: right; }
    .numero-factura { font-size: 18px; font-weight: bold; color: #6c63ff; }
    table { width: 100%; border-collapse: collapse; margin: 30px 0; }
    th { background: #f8f9fa; text-align: left; padding: 12px; border-bottom: 2px solid #dee2e6; }
    td { padding: 12px; border-bottom: 1px solid #eee; }
    .fila-total { font-weight: bold; font-size: 18px; }
  </style>
</head>
<body>
  <div class="header">
    <div>
      <div class="nombre-empresa">${datos.empresa.nombre}</div>
      <div>${datos.empresa.direccion}</div>
      <div>${datos.empresa.email}</div>
    </div>
    <div class="info-factura">
      <div class="numero-factura">Factura #${datos.numeroFactura}</div>
      <div>Fecha: ${datos.fecha}</div>
      <div>Vencimiento: ${datos.fechaVencimiento}</div>
    </div>
  </div>
  <h3>Facturar A</h3>
  <p>${datos.cliente.nombre}<br/>${datos.cliente.direccion}<br/>${datos.cliente.email}</p>
  <table>
    <thead><tr><th>Descripción</th><th>Cant.</th><th>Precio Unitario</th><th>Total</th></tr></thead>
    <tbody>
      ${datos.conceptos.map(c => `
        <tr>
          <td>${c.descripcion}</td>
          <td>${c.cantidad}</td>
          <td>${c.precioUnitario.toFixed(2)}</td>
          <td>${(c.cantidad * c.precioUnitario).toFixed(2)}</td>
        </tr>
      `).join('')}
      <tr class="fila-total">
        <td colspan="3">Total</td>
        <td>${datos.total.toFixed(2)}</td>
      </tr>
    </tbody>
  </table>
</body>
</html>
`;

Paso 2: Fusiona los Datos con la Plantilla

Obtén los datos de la factura de tu base de datos y pásalos a la función de la plantilla:

const datosFactura = {
  empresa: {
    nombre: 'Acme Corp',
    direccion: 'Av. Reforma 500, Ciudad de México, CDMX 06600',
    email: 'facturacion@acme.com.mx',
  },
  cliente: {
    nombre: 'Juan Pérez',
    direccion: 'Calle Principal 123, Guadalajara, JAL 44100',
    email: 'juan@ejemplo.com',
  },
  numeroFactura: 'FAC-2026-0042',
  fecha: '2026-03-01',
  fechaVencimiento: '2026-03-31',
  conceptos: [
    { descripcion: 'Servicios de Desarrollo Web', cantidad: 40, precioUnitario: 1500 },
    { descripcion: 'Diseño UI/UX', cantidad: 20, precioUnitario: 1250 },
    { descripcion: 'Hosting (Anual)', cantidad: 1, precioUnitario: 4800 },
  ],
  total: 40 * 1500 + 20 * 1250 + 4800,
};

Paso 3: Genera el PDF con TongoRender

Ahora envía el HTML renderizado a la API de TongoRender:

async function generarFacturaPDF(html) {
  const response = await fetch('https://api.tongorender.io/v1/render/pdf', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer rf_live_tu_clave_api',
    },
    body: JSON.stringify({
      html,
      options: {
        format: 'A4',
        margin: { top: '15mm', bottom: '15mm', left: '15mm', right: '15mm' },
        printBackground: true,
      },
    }),
  });

  if (!response.ok) {
    throw new Error(`Error al generar PDF: ${response.statusText}`);
  }

  return Buffer.from(await response.arrayBuffer());
}

Paso 4: Automatiza el Flujo de Trabajo

En una aplicación real, dispararías la generación de facturas automáticamente. Aquí tienes un ejemplo con Express.js:

app.post('/api/facturas/:pedidoId/pdf', async (req, res) => {
  const pedido = await db.pedidos.findById(req.params.pedidoId);
  const cliente = await db.clientes.findById(pedido.clienteId);

  const datosFactura = construirDatosFactura(pedido, cliente);
  const html = plantillaFactura(datosFactura);
  const pdfBuffer = await generarFacturaPDF(html);

  // Almacenar el PDF
  await storage.upload(`facturas/${datosFactura.numeroFactura}.pdf`, pdfBuffer);

  // Enviar al cliente
  await emailService.enviar({
    para: cliente.email,
    asunto: `Factura ${datosFactura.numeroFactura}`,
    adjuntos: [{ nombreArchivo: `${datosFactura.numeroFactura}.pdf`, contenido: pdfBuffer }],
  });

  res.json({ exito: true, numeroFactura: datosFactura.numeroFactura });
});

Consejos para Facturas con Aspecto Profesional

Usa una Paleta de Colores Consistente

Elige dos o tres colores de marca y úsalos de manera consistente. Usa tu color primario para el número de factura y totales, un color neutro para el texto del cuerpo, y un tono claro para los encabezados de tabla.

Incluye Tu Logo

Agrega el logotipo de tu empresa como imagen en el encabezado. Usa una URL absoluta (por ejemplo, https://tuempresa.com/logo.png) para que la API pueda obtenerlo durante la renderización.

Maneja Facturas de Múltiples Páginas

Para facturas con muchos conceptos, usa reglas CSS de salto de página para evitar cortes incómodos:

table { page-break-inside: auto; }
tr { page-break-inside: avoid; }
thead { display: table-header-group; } /* Repite el encabezado en cada página */

Incluye Requisitos Legales

Dependiendo de tu jurisdicción, las facturas pueden necesitar incluir RFC, número de IVA, términos de pago o datos bancarios. Inclúyelos en tu plantilla para que nunca se olviden.

Conclusión

La generación programática de facturas ahorra tiempo, elimina errores y escala con tu negocio. Combinando plantillas HTML con una API de PDF como TongoRender, obtienes control total sobre el diseño mientras delegas la complejidad de la renderización a un servicio administrado.

TongoRender hace la generación de facturas extremadamente simple: envía HTML, obtén un PDF. Sin navegador que gestionar, sin dependencias que instalar.

Prueba TongoRender gratis — Genera hasta 100 facturas al mes en el plan gratuito.

Comparte este artículoCompartir en Twitter