SSD Nodes Learn Hosting plans →
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-22

Mejor software de facturación autoalojado para un VPS

Compara Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai y ERPNext en un VPS: facturación recurrente, impuestos, portal de clientes, pagos y licencias.

¿Qué software de facturación autoalojado debería elegir?

El software de facturación autoalojado se reduce a cinco opciones realistas para un único VPS, y no son sustitutos equivalentes. Invoice Ninja es el producto más completo: las facturas recurrentes, el portal de clientes, las pasarelas de pago y los formatos de factura electrónica funcionan desde el día de la instalación. InvoiceShelf es la opción totalmente open source más ligera. InvoicePlane es una aplicación PHP sencilla que no requiere orquestación. Kimai factura las horas registradas en lugar de las líneas de factura. ERPNext es un sistema contable completo que también genera facturas.

Dos problemas arruinan una instalación de facturación autoalojada con mucha más frecuencia que la falta de una función. El primero es el correo electrónico. Una factura que termina en la carpeta de spam es una factura impagada, y nada le informa de que ha ocurrido. El segundo son las copias de seguridad. Esta es la única base de datos autoalojada cuya pérdida se convierte en un problema fiscal y no sólo en una molestia.

Lea la licencia antes de revisar la lista de funciones. Tres de estas cinco opciones usan copyleft, una tiene una licencia permisiva y otra permite acceder al código fuente, pero impone límites reales sobre lo que puede hacer con ella.

Las cinco opciones y para quién es cada una

Invoice Ninja

Una aplicación Laravel, actualmente en la línea v5. El autoalojamiento es gratuito y no tiene funciones bloqueadas: incluye facturas recurrentes, presupuestos, proyectos, control de horas, gastos, un portal de clientes y pasarelas de pago como Stripe y PayPal. El proyecto se describe como «una aplicación de facturación, presupuestos, proyectos y control de horas basada en Laravel, cuyo código fuente está disponible». El único elemento de pago es la marca. En palabras del propio proyecto: «Ofrecemos una licencia white-label de 40 USD al año para eliminar la marca Invoice Ninja de las partes de la aplicación visibles para los clientes». Ese precio es el vigente en agosto de 2026.

Elíjalo si quiere el producto más completo y acepta ejecutar la pila más grande.

InvoiceShelf

Un fork de Crater, distribuido bajo la GNU Affero General Public License version 3 (AGPL-3.0). Incluye facturas, presupuestos, facturación recurrente, gastos, impuestos, varias divisas, un portal de clientes y varias empresas. Los pagos y la eliminación de marca están disponibles en repositorios oficiales de módulos separados, ambos bajo AGPL-3.0 y ambos gratuitos. Los pagos con tarjeta utilizan el checkout de Stripe.

Elíjalo si quiere una aplicación pequeña y completamente de código abierto, y no necesita treinta pasarelas.

InvoicePlane

Una aplicación PHP basada en CodeIgniter, distribuida bajo la licencia MIT y la única opción de esta lista que se instala descomprimiendo archivos en la raíz web. No requiere Docker ni un paso de compilación de Node. Los PDF se generan con mPDF, por lo que las plantillas utilizan HTML y CSS. Los clientes reciben un enlace de invitado para consultar y pagar una factura.

El inconveniente son los pagos. La documentación indica claramente que InvoicePlane 1.6 sólo admite Stripe de forma predeterminada y que los demás proveedores se eliminaron en esa versión. Los requisitos publicados para la línea 1.6 son PHP 8.0 a 8.1 con MySQL 5.5 o la versión correspondiente de MariaDB. Lea las notas de la versión que descargue, porque la línea 1.7 todavía está en desarrollo.

Elíjalo si utiliza hosting compartido o un VPS de 512 MB.

Kimai

Un sistema de control de horas bajo AGPL-3.0 que genera facturas a partir de las hojas de horas. Es la opción adecuada para quien factura por horas. Las plantillas de factura se cargan como archivos DOCX, ODS o XLSX, los únicos formatos admitidos según la documentación, y se convierten a PDF o HTML. Puede diseñar la factura en un procesador de textos en lugar de escribir CSS, algo que a la mayoría de los usuarios les resulta más sencillo.

Kimai no tiene portal de clientes ni pasarela de pago, por lo que debe enviar el PDF por correo electrónico. La facturación electrónica estructurada está disponible mediante un plugin de pago de la tienda llamado E-Invoice Plus, con un precio indicado de 99 EUR al año, sin IVA, para una instalación autoalojada en agosto de 2026. Incluye los perfiles EN16931, XRechnung, ZUGFeRD, Factur-X y Peppol.

Elíjalo si la factura es el resultado del tiempo registrado.

ERPNext

GPL-3.0 y una categoría de software diferente. Una factura de venta es un tipo de documento dentro de un sistema contable completo, con un plan contable, asientos contables, inventario y nóminas. Es la opción adecuada cuando la facturación deja de ser el trabajo principal. Para un autónomo con ocho clientes es demasiado software. Ponerlo en funcionamiento es un proyecto independiente, descrito en ejecutar ERPNext en un VPS.

Las facturas recurrentes dependen de un programador que no puede ver

Invoice Ninja, InvoiceShelf, InvoicePlane y ERPNext generan facturas recurrentes. Kimai no incluye una función de facturación recurrente en el núcleo, porque allí una factura se crea a partir de las entradas de la hoja de horas de un periodo.

El modo de fallo es el mismo en todas las aplicaciones basadas en Laravel y es silencioso. Una tarea programada crea las facturas recurrentes, php artisan schedule:run, y algo externo a la aplicación debe ejecutarla cada minuto. Si nadie la ejecuta, la lista de facturas recurrentes sigue mostrando una próxima fecha de envío, pero esa fecha simplemente pasa. No aparece ninguna factura. No se registra ningún error porque no se ejecutó ningún código.

Después de crear la primera factura recurrente, establezca su próxima fecha de envío unos minutos más tarde y espere. Si no llega nada, el programador no está funcionando. En una instalación de Docker, normalmente significa que el servicio de cron o del programador definido en el archivo compose nunca se inició o terminó.

docker compose ps
docker compose logs --tail 50

Todos los servicios del archivo deberían mostrar running. El servicio que permanezca en estado exited es aquel cuyos registros debe leer.

Multidivisa e impuestos: qué comprobar antes de comprometerse

Las listas de funciones indican «multidivisa», pero esta expresión puede significar cosas muy distintas. Realice estas cuatro comprobaciones en una instancia de demostración, con cifras reales de su negocio, porque estos errores los detecta su contable y no usted.

  1. ¿La factura guarda el tipo de cambio aplicado en la fecha de emisión? Debe hacerlo. Si la aplicación recalcula los totales con un tipo de cambio actualizado, los informes del último trimestre cambian cada vez que los abre y sus libros dejan de coincidir con lo que ya presentó.
  2. ¿El impuesto se aplica a cada línea, a la factura o a ambos? Un tipo único para toda la factura es correcto hasta que una línea tenga tipo cero.
  3. ¿Puede introducir precios con impuestos incluidos y también sin impuestos? Convertirlos después introduce diferencias de redondeo de un céntimo por línea, y esos céntimos se acumulan durante el año.
  4. ¿Qué muestra el documento para un cliente de otro país que no debe pagar IVA? La factura debe imprimir la nota de exención, no sólo un cero en la columna de impuestos.

Invoice Ninja y ERPNext gestionan los cuatro casos. InvoiceShelf incluye los impuestos y la multidivisa entre sus funciones. InvoicePlane y Kimai son más sencillos, así que pruébelos con su factura más compleja y no con la más sencilla.

Portal del cliente y pasarelas de pago

Un portal del cliente es una página donde el cliente consulta sus facturas, descarga el PDF y paga. Es más importante de lo que parece, porque reclamar pagos por correo electrónico consume más tiempo que emitir la factura.

Invoice Ninja destaca en este aspecto. Ofrece un portal completo, numerosas pasarelas, métodos de pago guardados y facturación automática para facturas recurrentes. InvoiceShelf tiene un portal del cliente y añade el pago mediante Stripe Checkout a través de su módulo de pagos. InvoicePlane proporciona un enlace de invitado para cada factura y admite Stripe. Kimai no ofrece ninguna de estas funciones, por lo que el PDF se envía como archivo adjunto.

Hay un punto que se confunde constantemente. Alojar la aplicación de facturación por cuenta propia no implica almacenar números de tarjeta. Con Stripe Checkout, el cliente es redirigido a Stripe e introduce allí los datos de la tarjeta. Tu VPS nunca ve el número. El alcance de PCI (industria de tarjetas de pago) se mantiene reducido precisamente porque no implementaste el formulario de pago. Si más adelante necesitas más de un procesador o quieres dirigir los pagos según el país, esa función debe pertenecer a una capa independiente, como orquestación de pagos autoalojada con Hyperswitch.

Calidad del PDF y la plantilla que acabará editando

Tendrá que editar la plantilla. Todos los valores predeterminados de esta sección colocan su dirección en una ubicación incorrecta para su país.

Invoice Ninja renderiza las plantillas HTML y CSS a PDF mediante un Chromium sin interfaz gráfica incluido en la imagen. Por eso el contenedor es grande. Reserve memoria para este proceso: un navegador sin interfaz gráfica es el proceso que más recursos consume de la pila, por lo que un VPS de 1 GB queda muy ajustado. InvoicePlane usa mPDF, que está implementado completamente en PHP y consume pocos recursos, pero ignora parte del CSS moderno. Kimai adopta el enfoque contrario y le permite cargar un archivo DOCX u ODS. De este modo, el diseño se realiza en LibreOffice o Word por alguien que nunca ha escrito una hoja de estilos.

Si para usted es importante una factura con un diseño elaborado y el CSS no lo es, el enfoque de Kimai es mejor. Si quiere mantener la plantilla en un sistema de control de versiones y poder compararla mediante diferencias, HTML es la mejor opción.

¿La licencia permite usarlo con fines comerciales?

Los cinco permiten facturar a tus propios clientes. Las diferencias aparecen cuando haces algo más.

Invoice Ninja está sujeto a Elastic License 2.0. Hay dos cláusulas importantes.

No puedes proporcionar el software a terceros como un servicio alojado o gestionado cuando el servicio les permita acceder a un conjunto sustancial de las características o funcionalidades del software.
No puedes mover, cambiar, desactivar ni eludir la funcionalidad de la clave de licencia del software.

Por tanto, ejecutarlo para tu propia empresa está permitido, pero no puedes ejecutar instancias para clientes como producto. La segunda cláusula es el motivo por el que eliminar la marca cuesta $40 por una licencia y no consiste en aplicar un parche al código fuente.

InvoiceShelf, Kimai y Crater están sujetos a AGPL-3.0. El uso comercial es gratuito y no existe ningún nivel superior que debas contratar. La obligación está en la sección 13: si modificas el código y permites que otras personas usen tu versión modificada a través de una red, debes ofrecerles el código fuente de tus cambios. Una instancia sin modificar ya está cubierta por el código fuente público del proyecto original, por lo que la mayoría de quienes administran sus propios servicios nunca se enfrentan a esta obligación.

InvoicePlane usa MIT, la licencia con menos obligaciones del grupo, aunque su README indica que el nombre y el logotipo siguen perteneciendo al proyecto.

ERPNext usa GPL-3.0. Debes compartir las modificaciones que distribuyas, pero ejecutar el software de forma privada no implica ninguna obligación.

Esta es una descripción del texto de las licencias y no constituye asesoramiento jurídico.

¿El proyecto sigue teniendo mantenimiento? Compruebe el registro de commits

Crater fue durante varios años una aplicación de facturación open source muy utilizada, y muchas guías todavía la recomiendan. Su rama predeterminada no ha recibido ningún commit durante 741 días.

ChartGap since the last commit on the default branch, in days, checked 21 August 2026
The data behind this chart
[
  {
    "label": "ERPNext",
    "commit_gap": 0
  },
  {
    "label": "Invoice Ninja",
    "commit_gap": 1
  },
  {
    "label": "Kimai",
    "commit_gap": 1
  },
  {
    "label": "InvoicePlane",
    "commit_gap": 3
  },
  {
    "label": "InvoiceShelf",
    "commit_gap": 4
  },
  {
    "label": "Crater",
    "commit_gap": 741
  }
]

De los 6 proyectos de ese bloque, cinco recibieron un commit durante la última semana. InvoiceShelf es el fork que continuó el trabajo de Crater, con la misma licencia AGPL-3.0 y el mismo modelo de datos, por lo que cambiar de uno a otro es una migración de datos, no una reescritura. Instale InvoiceShelf, no Crater.

Instalar cada aplicación en un VPS

Todas, excepto InvoicePlane, funcionan con mayor facilidad mediante Docker Compose. Si esto es nuevo para usted, empiece con una primera pila de Docker Compose en un VPS y vuelva aquí.

Invoice Ninja incluye su propio repositorio de Compose.

git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --show

Copie esa clave en el archivo env del repositorio, junto con su APP_URL real. Después, establezca el propietario que espera la imagen e iníciela.

chmod 755 docker/app/public
sudo chown -R 1500:1500 docker/app
docker compose up -d

El propietario 1500:1500 coincide con el usuario dentro de la imagen. Si omite este paso, la aplicación no podrá escribir su caché ni los PDF que genera. En el asistente de configuración, indique db como host de la base de datos, porque ese es el nombre del servicio en la red de Compose. localhost apunta allí al propio contenedor de la aplicación.

InvoiceShelf publica archivos de Compose listos para usar, uno por cada motor de base de datos.

curl -fLO https://raw.githubusercontent.com/InvoiceShelf/docker/master/docker-compose.mysql.yml
mv docker-compose.mysql.yml docker-compose.yml

Abra ese archivo antes de iniciarlo. Todas las contraseñas que contiene son marcadores de posición, y el propio archivo lo indica en sus comentarios. APP_URL, SESSION_DOMAIN y SANCTUM_STATEFUL_DOMAINS tienen localhost como valor predeterminado, y los tres necesitan que establezca su nombre de host real antes del primer inicio de sesión. Después, inícielo.

docker compose up -d

Publica el puerto 8090 en el host y sirve el puerto 8080 dentro del contenedor. Coloque delante un proxy inverso con TLS (seguridad de la capa de transporte) antes de enviarle un solo cliente.

Archivo de Compose para producción de Kimai, de la documentación del proyecto
services:

  sqldb:
    image: mysql:8.3
    volumes:
      - mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=kimai
      - MYSQL_USER=kimaiuser
      - MYSQL_PASSWORD=kimaipassword
      - MYSQL_ROOT_PASSWORD=changemeplease
    command: --default-storage-engine innodb
    restart: unless-stopped
    healthcheck:
      test: mysqladmin -uroot -p$$MYSQL_ROOT_PASSWORD ping -h 127.0.0.1 --silent
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s

  kimai:
    image: kimai/kimai2:stable
    depends_on:
      sqldb:
        condition: service_healthy
        restart: true
    volumes:
      - data:/opt/kimai/var/data
      - plugins:/opt/kimai/var/plugins
    ports:
      - 8001:8001
    environment:
      - APP_SECRET=your-fantastic-long-random-and-ultra-secure-secret
      - TRUSTED_HOSTS=kimai.example.com
      - ADMINMAIL=admin@example.com
      - ADMINPASS=changemeplease
      - DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai?charset=utf8mb4&serverVersion=8.3.0
    restart: unless-stopped

volumes:
  data:
  mysql:
  plugins:

Establezca APP_SECRET con una cadena aleatoria larga propia y TRUSTED_HOSTS con el dominio que usará realmente. ADMINMAIL y ADMINPASS crean el primer administrador durante el primer arranque, así que cambie después esa contraseña en la interfaz y elimínela del archivo.

InvoicePlane no tiene contenedor. Cree primero una base de datos vacía.

sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

Descargue el archivo de la página de versiones del proyecto, extráigalo en la raíz web, copie ipconfig.php.example a ipconfig.php y establezca su URL dentro de ese archivo siguiendo los comentarios que contiene. Después, abra https://your-domain.example/index.php/setup y complete el instalador.

Por qué la factura llega a la carpeta de spam

Este fallo le cuesta dinero y la aplicación informará correctamente que la factura se envió.

No envíe correo de facturas desde la propia dirección IP del VPS. Una IP nueva de un VPS no tiene historial de envío, y los grandes proveedores tratan por defecto como sospechoso el primer mensaje procedente de una dirección desconocida de un rango de hosting. Envíe el correo mediante un relay SMTP (simple mail transfer protocol) en un dominio que haya autenticado. Configurar todo el flujo requiere una guía propia, y enviar correo de forma fiable desde una aplicación autohospedada cubre el relay, los registros DNS y las pruebas.

La dirección From es donde más errores se cometen en las configuraciones de facturación. Debe pertenecer a un dominio que controle y que su relay firme con DKIM (domainkeys identified mail). Poner la dirección del cliente en From parece cortés, pero rompe la entrega, porque el servidor receptor comprueba que el dominio de From coincide con el dominio que autenticó el mensaje. Gmail rechaza directamente la discrepancia:

550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy

Mantenga su propia dirección en From y ponga al cliente en Reply-To. Compruebe los registros publicados antes de enviar cualquier mensaje real.

dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.com

El primero debe devolver un registro SPF (sender policy framework) que indique su relay. El segundo debe devolver una política DMARC (domain-based message authentication, reporting and conformance). El tercero depende del selector que le haya proporcionado el relay. Una respuesta vacía significa que falta el registro DKIM o que se publicó con el nombre incorrecto, por lo que todos los mensajes que envíe fallarán la comprobación de firma.

Después, envíe una factura real a una cuenta propia de un proveedor grande y lea las cabeceras sin procesar. dkim=pass y spf=pass en la cabecera Authentication-Results son la única prueba válida. La marca "sent" de la aplicación sólo indica que entregó el mensaje al relay.

Copias de seguridad: la única base de datos que no puede perder

Perder un servidor multimedia significa volver a descargar los archivos. Incluso un servidor de fotos autoalojado como PhotoPrism o Immich normalmente contiene una segunda copia de los originales, que todavía existen en el teléfono que los tomó. Perder la base de datos de facturación significa que no puede demostrar qué facturó, qué le pagaron ni qué le deben todavía. Actúe en consecuencia.

Haga copias de seguridad de cuatro elementos. La base de datos. El volumen de almacenamiento, que contiene logotipos, archivos PDF generados y recibos de gastos. El archivo de entorno de la aplicación. Y los archivos PDF generados que se conservan como archivos normales, porque un PDF se puede abrir dentro de diez años sin la aplicación que lo creó.

El archivo de entorno es más importante de lo que suele pensarse. Laravel cifra los valores sensibles almacenados, incluidas las credenciales de la pasarela de pago, mediante APP_KEY de ese archivo. Si restaura la base de datos junto a una clave recién generada, esos valores no se descifran. Todas las facturas están presentes, pero la configuración de la pasarela es ilegible.

Un volcado de la pila de InvoiceShelf tiene este aspecto. Su servicio de base de datos se ejecuta en mariadb:10, por lo que la herramienta dentro del contenedor es mariadb-dump.

docker compose exec -T database mariadb-dump \
  --user=root --password=YOUR_ROOT_PASSWORD \
  --single-transaction --databases invoiceshelf > invoiceshelf.sql

--single-transaction toma una instantánea coherente de las tablas de InnoDB sin bloquearlas, de modo que la aplicación sigue atendiendo peticiones mientras se ejecuta el volcado. -T impide que Docker asigne un terminal, que de otro modo podría corromper la salida redirigida y producir un archivo de volcado que no se pueda importar.

Envíe esa copia fuera del servidor según una programación mediante copias de seguridad cifradas de restic en almacenamiento externo, y establezca una retención suficientemente larga para cubrir el período que indique su contable.

Después, restáurela. Inicie el volcado en un contenedor temporal, inicie sesión y abra la factura del mes pasado. Hasta que no lo haya hecho una vez, no sabrá si la copia de seguridad funciona.

Lo que le pedirá su asesor fiscal

No siga el consejo fiscal de un tutorial. Lo siguiente es lo que puede producir este software, para que pueda llevar la lista a la persona que le asesora.

Datos exportables. Debe poder exportar sus facturas y pagos a CSV desde la interfaz, sin usar un cliente de base de datos y sin abrir un ticket de soporte. Un volcado SQL es una copia de seguridad, no una exportación, porque su asesor fiscal no puede abrirlo.

Numeración inmutable. Los números de factura deben seguir una secuencia y no reutilizarse nunca, sin saltos. Eliminar una factura deja un salto que después tendrá que explicar. En su lugar, anúlela o emita un abono; todas las aplicaciones de esta lista lo permiten. La obligación de usar una numeración sin saltos depende del lugar donde esté registrado, por lo que conviene consultarlo pronto.

Conservación. Conserve los volcados de la base de datos y los PDF generados durante el tiempo que exijan sus normas. El PDF es el documento que se envió realmente y es el artefacto relevante si alguna vez se impugna una factura.

Historial de cambios. Es útil poder mostrar quién editó una factura y cuándo. Este aspecto es el que más varía entre estas aplicaciones. Invoice Ninja mantiene un registro de actividad por registro.

La facturación electrónica estructurada se ha convertido en un requisito real, y no en una función adicional conveniente, en algunas partes de la UE. Invoice Ninja genera los formatos habituales, incluidos ZUGFeRD y XRechnung, Facturae, FatturaPA y EN16931 genérico. El envío a través de la red Peppol desde una instancia autohospedada se realiza mediante el propio punto de acceso de Invoice Ninja: debe registrar su entidad con ellos y comprar créditos por cada envío, por lo que es un servicio de pago desde August 2026. Kimai admite los mismos formatos mediante su plugin de pago. Actualmente, las otras tres aplicaciones no generan facturas electrónicas estructuradas, lo que constituye el motivo más importante para elegir Invoice Ninja si factura dentro de la UE.

FAQ

¿Debo instalar Crater o InvoiceShelf?

InvoiceShelf. La rama predeterminada de Crater no ha recibido ningún commit durante 741 días a fecha de 21 August 2026, y su propio gestor de incidencias remite a los usuarios al fork. InvoiceShelf utiliza la misma licencia AGPL-3.0 y el mismo modelo de datos, por lo que pasar de uno a otro requiere una migración de base de datos, no una reescritura. Cualquier guía que siga recomendando Crater se escribió antes de que el proyecto dejara de tener actividad.

¿Puedo usar Invoice Ninja para mi propio negocio sin pagar?

Sí. Invoice Ninja autohospedado ofrece todas sus funciones sin coste bajo la Elastic License 2.0, incluidas las facturas recurrentes, el portal de clientes y las pasarelas de pago. Hay dos funciones que tienen coste. Para eliminar la marca de Invoice Ninja de las páginas visibles para los clientes se necesita la licencia white-label, "$40 per year" según las palabras del propio proyecto a fecha de August 2026. El envío de facturas electrónicas a través de la red Peppol se factura por separado. La licencia prohíbe ejecutar el software como un servicio alojado para otras personas.

¿Por qué mis correos de facturas llegan a la carpeta de spam?

Casi siempre se debe a que el mensaje no está autenticado para el dominio de la dirección indicada en From. Envíe los mensajes a través de un relay SMTP en lugar de hacerlo directamente desde el VPS. Después, publique registros SPF y DMARC para su dominio y añada el registro DKIM con el selector que le proporcione el relay. Mantenga su propia dirección en From y coloque al cliente en Reply-To. Establecer la dirección del cliente como remitente hace que Gmail rechace el mensaje con 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. Confirme la corrección buscando dkim=pass y spf=pass en la cabecera Authentication-Results de un mensaje de prueba.

¿Cuál debo elegir si facturo por horas?

Kimai. Es principalmente un gestor de tiempos, por lo que la factura se genera a partir de las entradas aprobadas de la hoja de horas y las líneas contienen el trabajo registrado. Las plantillas son archivos DOCX, ODS o XLSX que se diseñan en un procesador de textos, lo que resulta más sencillo que editar CSS. La contrapartida es que Kimai no tiene portal de clientes ni pasarela de pago, así que debe enviar el PDF por correo y recibir el pago mediante transferencia. Invoice Ninja también permite registrar tiempo y sí tiene portal, por lo que debe elegirlo si el pago con tarjeta en línea es más importante que el detalle de la hoja de horas.

¿Qué necesito incluir exactamente en las copias de seguridad?

La base de datos, el volumen de almacenamiento que contiene los logotipos y los PDF generados, el archivo de entorno y los PDF renderizados que se conservan como archivos normales. El archivo de entorno es el elemento que más se olvida: las aplicaciones Laravel, como Invoice Ninja e InvoiceShelf, cifran las credenciales almacenadas con APP_KEY. Por eso, restaurar una base de datos junto a una clave recién generada deja ilegibles los ajustes de la pasarela de pago. Restaure todo en una instancia desechable una vez y abra una factura antigua. Es la única forma de saber si la copia de seguridad funciona.