WooCommerce · WordPress

VeriFactu en WooCommerce. Un hook de WordPress y cada pedido acaba en AEAT.

WooCommerce mueve la mayoría del ecommerce pequeño en España y su sistema de hooks está hecho para esto. No hay plugin de Cofactu en WordPress.org todavía; hay un webhook y un `add_action` que lo llama. Si prefieres no tocar PHP, Make o Zapier hacen lo mismo.

Flujo del pedido a AEAT

  1. 01 Pedido pagado en tu tienda

    WooCommerce dispara su evento de pago, como ya hace hoy.

  2. 02 Un POST al webhook de Cofactu

    Desde el hook nativo o desde Make. JSON normalizado, API key en la cabecera.

  3. 03 Factura encadenada

    Cofactu numera, calcula la huella SHA-256 encadenada y genera el PDF con QR.

  4. 04 Registrada en AEAT

    Con tu certificado, el registro sale a AEAT en segundo plano y guarda el CSV de respuesta.

Con código · el hook nativo

woocommerce_payment_complete

Se dispara cuando la pasarela confirma el cobro. Para pedidos contra reembolso o transferencia, usa además woocommerce_order_status_completed. Guarda el fichero en wp-content/mu-plugins/ y se carga solo.

php
<?php
// wp-content/mu-plugins/cofactu-verifactu.php
add_action('woocommerce_payment_complete', function (int $order_id): void {
    $order = wc_get_order($order_id);
    $lines = [];
    foreach ($order->get_items() as $item) {
        $subtotal = (float) $item->get_subtotal();          // sin IVA
        $tax      = (float) $item->get_subtotal_tax();
        $lines[]  = [
            'descripcion'    => $item->get_name(),
            'cantidad'       => (float) $item->get_quantity(),
            'precioUnitario' => $subtotal / max(1, $item->get_quantity()),
            'tipoIva'        => $subtotal > 0 ? round($tax / $subtotal * 100) : 0,
        ];
    }
    $nif = $order->get_meta('_billing_nif');                 // el meta de tu plugin de NIF
    wp_remote_post('https://api.cofactu.com/api/webhooks/ecommerce-orders', [
        'headers' => [
            'Authorization' => 'Bearer ' . COFACTU_API_KEY,   // define() en wp-config.php
            'Content-Type'  => 'application/json',
        ],
        'body' => wp_json_encode([
            'platform'        => 'woocommerce',
            'externalOrderId' => (string) $order->get_id(),
            'client'          => $nif ? [
                'nif'          => $nif,
                'nombre'       => $order->get_formatted_billing_full_name(),
                'email'        => $order->get_billing_email(),
                'direccion'    => $order->get_billing_address_1(),
                'codigoPostal' => $order->get_billing_postcode(),
                'ciudad'       => $order->get_billing_city(),
                'pais'         => $order->get_billing_country(),
            ] : null,                                           // F2 simplificada
            'lines' => $lines,
        ]),
        'timeout' => 15,
    ]);
});

Sin código

Sin tocar PHP: Make o Zapier

  1. 1

    Crea una API key en Cofactu (Configuración → API keys).

  2. 2

    En Make, módulo «WooCommerce → Watch Orders» con estado processing o completed; en Zapier, «WooCommerce → Order Paid» (WooCommerce necesita el plugin de Zapier para exponer el trigger).

  3. 3

    Módulo HTTP: POST a https://api.cofactu.com/api/webhooks/ecommerce-orders con Authorization: Bearer vf_live_….

  4. 4

    Mapea id a externalOrderId, billing a client y line_items a lines (subtotal / quantity es el precio unitario sin IVA).

El JSON que espera Cofactu

Un solo formato para todas las tiendas

POST https://api.cofactu.com/api/webhooks/ecommerce-orders con Authorization: Bearer vf_live_…. Precios sin IVA y tipoIva por línea; client: null emite una factura simplificada F2; externalOrderId hace la llamada idempotente. Desde Configuración → Integraciones → Ecommerce se lanza un pedido de prueba y se ve cada pedido con su estado en AEAT.

json
{
  "platform": "woocommerce",
  "externalOrderId": "2026-000123",
  "client": {
    "nif": "B12345678",
    "nombre": "Tienda Ejemplo SL",
    "email": "compras@ejemplo.com",
    "direccion": "C/ Mayor 1",
    "codigoPostal": "28001",
    "ciudad": "Madrid",
    "pais": "ES"
  },
  "lines": [
    {
      "descripcion": "Zapatillas running 42",
      "cantidad": 1,
      "precioUnitario": 79.34,
      "tipoIva": 21
    },
    {
      "descripcion": "Gastos de envío",
      "cantidad": 1,
      "precioUnitario": 4.13,
      "tipoIva": 21
    }
  ],
  "autoSubmit": true
}

Preguntas frecuentes

WooCommerce y VeriFactu, en corto

¿Hay plugin de Cofactu para WooCommerce en WordPress.org?

Todavía no. Es el primero del roadmap de integraciones, pero hoy se conecta con un mu-plugin de veinte líneas o con Make/Zapier, que hacen la misma llamada al webhook que hará el plugin.

¿Los PDF de factura que genera mi plugin de WooCommerce valen para VeriFactu?

No. Los plugins de «PDF Invoices» generan un documento, pero no un registro de facturación con huella encadenada, QR y envío a AEAT. Puedes seguir usándolos como albarán o justificante; la factura fiscal la emite Cofactu.

¿Cómo recojo el NIF del cliente en el checkout?

Con cualquier plugin de campos de NIF/CIF para WooCommerce (los hay gratuitos) que lo guarde como meta del pedido, y leyendo ese meta en el hook. Sin NIF, client: null emite una factura simplificada F2.

¿Y si WordPress vuelve a lanzar el hook (reintento, plugin de caché…)?

El webhook es idempotente por platform + externalOrderId: el mismo pedido nunca produce dos facturas. La segunda llamada devuelve la primera factura con su estado en AEAT.

¿Necesito certificado digital para que esto funcione?

Para el envío a AEAT sí: se carga una vez en Cofactu y el webhook lo usa en cada pedido. Sin certificado, las facturas se crean en borrador y las envías cuando lo tengas. El JSON es el mismo para las cuatro tiendas: platform, externalOrderId, client (o null para una factura simplificada F2) y lines con precio sin IVA y tipoIva por línea.

Tu tienda sigue siendo WooCommerce. La factura, VeriFactu.

Cuenta gratis, API key en un minuto y un pedido de prueba para ver la primera factura encadenada.

¿Listo para facturar sin sustos?

Empieza gratis o mira los planes. Tu primera factura VeriFactu en menos de 10 minutos.

Sin tarjetaCancela en 1 clicExporta cuando quieras