FacturaFlow es una plataforma web para emitir, firmar y enviar Facturae con total trazabilidad. Está pensada para despachos, pymes y cooperativas que trabajan con FACe, FACeB2B y Veri*Factu, y que necesitan centralizar certificados, firmas y entregas sin complicaciones.
- Registrar emisores, clientes y productos desde una única interfaz.
- Generar facturas en formato Facturae con QR Veri*Factu listo para enviar.
- Firmar con AutoFirma en el puesto del usuario y con el certificado de plataforma en el servidor.
- Enviar automáticamente a FACe, FACeB2B y AEAT, con seguimiento de cada entrega.
- Recibir facturas de FACeB2B, revisar su estado y gestionarlas desde el mismo panel.
- Trabajar con varias entidades o clientes creando instancias independientes que comparten la misma plataforma.
Antes de empezar, asegúrate de tener:
- Acceso a FACeB2B como "cliente" y como ESF (Empresa de Servicios de Facturación).
- Acceso a FACe como proveedor si vas a enviar facturas a Administraciones Públicas.
- PHP 8.1 o superior con extensiones
openssl,curl,soap,json,dom,libxml,mbstring,zip. - Composer, Git y un servidor web (Apache/Nginx) que ejecute PHP.
- Un certificado P12/PFX del emisor (cada usuario) y un certificado P12 de plataforma (ESF) para firmar los envíos.
Sigue estas etapas por orden. El resultado será una carpeta segura de plataforma y tantas instancias web como necesites.
Esta carpeta guarda certificados y claves. Debe quedar fuera del DocumentRoot del servidor.
sudo mkdir -p /var/www/cifra
sudo chown -R root:www-data /var/www/cifra
sudo find /var/www/cifra -type d -exec chmod 750 {} \;
sudo find /var/www/cifra -type f -exec chmod 640 {} \;- Copia tu P12 de plataforma a
/var/www/cifra/max.p12(puedes usar otro nombre si lo reflejas en la configuración). - Si la contraseña está sin cifrar, guárdala en un archivo de texto sencillo (
max.pass,faceb2b.passop12.pass) dentro de/var/www/cifra/. - Si prefieres cifrarla (recomendado), continúa con el paso siguiente y añade la clave cifrada en
faceb2b.json.
Esta clave permite guardar la contraseña del P12 cifrada.
sudo bash -c 'openssl rand -base64 48 > /var/www/cifra/secret.key'
sudo chown root:www-data /var/www/cifra/secret.key
sudo chmod 640 /var/www/cifra/secret.keyCrea /var/www/cifra/faceb2b.json para definir la ruta al certificado y su contraseña.
{
"p12_path": "/var/www/cifra/max.p12",
"p12_pass": "enc:v1:...clave_cifrada...",
"rest_base": "https://api.face.gob.es/faceb2b",
"timeout": 30
}Si usas un .pass en texto plano, puedes omitir p12_pass en el JSON.
Cada entidad usuaria necesita su propia copia del proyecto dentro del DocumentRoot.
# Ejemplo para la entidad "acme"
sudo mkdir -p /var/www/html/users/acme
cd /var/www/html/users/acme
sudo git clone https://github.com/ciamaximalista/facturaflow .
sudo chown -R www-data:www-data /var/www/html/users/acmeEjecuta Composer como el usuario que corre el servidor web.
cd /var/www/html/users/acme
sudo -u www-data composer install --no-dev --prefer-distJunto al index.php de la instancia, crea config_plataforma.json apuntando a la carpeta cifra.
{
"cifra_dir": "../../cifra"
}Ajusta el camino si la plataforma está en otra ruta. Para la instalación en /var/www/html/ruralnext/facturaflow/repoblacion, usa "../../../../cifra".
Cada instancia almacena información del emisor y sus facturas en data/.
cd /var/www/html/users/acme
sudo mkdir -p data
sudo chown -R www-data:www-data data
sudo find data -type d -exec chmod 750 {} \;
sudo find data -type f -exec chmod 640 {} \;- Apunta el
DocumentRootdel dominio o subcarpeta a la ruta de la instancia (/var/www/html/users/acme). - Habilita PHP y las extensiones necesarias.
- Recarga el servicio web.
Accede a la URL pública de la instancia. La primera vez, el asistente te pedirá:
- Datos fiscales del emisor.
- Certificado P12 del usuario y su contraseña.
- Preferencias de serie, numeración y logo.
Una vez completado, el usuario podrá generar y firmar facturas desde el navegador.
- Emitir: crea clientes y productos, genera una nueva factura y firma con AutoFirma. El sistema firma el XML y el QR Veri*Factu.
- Enviar: selecciona la factura y envíala a FACe, FACeB2B o AEAT. El sistema registra el envío con acuses y errores.
- Recibir: sincroniza con FACeB2B para traer nuevas facturas y actualiza su estado (aceptada, rechazada, pagada).
- Historial: consulta firmas, versiones y logs para auditoría completa.
FacturaFlow detecta AutoFirma en tu navegador y no necesita servicios locales adicionales.
- Instala AutoFirma desde la web oficial y ejecútala al menos una vez.
- Si el protocolo
afirma://no se abre, instala el Configurador AutoFirma y vuelve a intentarlo. - Puedes revisar
~/.autofirma/AutoFirma.log(Linux) o los registros del sistema si algo falla.
- Mantén
/var/www/cifrafuera delDocumentRooty con permisos estrictos. - Usa contraseñas cifradas (
enc:v1:) siempre que sea posible. - Cada instancia debe tener su carpeta
data/con permisos 750/640 y propiedadwww-data.
Para actualizar una instancia sin perder datos:
cd /var/www/html/users/<usuario>
sudo -u www-data git pull
sudo -u www-data composer install --no-dev --prefer-distLos archivos de configuración (config_plataforma.json, carpeta data/) no se sobrescriben si mantienes esos nombres.
- Repositorio: https://github.com/ciamaximalista/facturaflow
- Incidencias, dudas y nuevas funcionalidades: abre un issue o envía un pull request.
