Inicio Hosting WordPress SEO Marketing VacaWeb.com 🚀 Hosting desde $85 MXN/mes
Negocios

Facturación Electrónica CFDI para Servicios de Hosting y Tecnología en México

1 Nov 2025 11 min de lectura VacaWeb Blog

La facturación electrónica (CFDI) es obligatoria para personas morales y personas físicas con actividad empresarial en México desde 2014. En 2025, el SAT exige CFDI 4.0 con el Complemento de Carta Porte para transporte terrestre y validaciones más estrictas de RFC y datos fiscales. Esta guía técnica cubre cómo integrar la emisión de CFDI en tu sitio web y qué proveedor PAC elegir.

Arquitectura técnica de la facturación electrónica en México

El proceso de emisión de un CFDI involucra cuatro actores: el emisor (tú), un PAC (Proveedor Autorizado de Certificación), el SAT y el receptor (tu cliente). El flujo es:

# Flujo técnico de emisión de CFDI:
# 1. Tu sistema genera el XML del CFDI (estructura según Anexo 20 del SAT)
# 2. El XML se envía al PAC para validación y timbre
# 3. El PAC envía al SAT para validar (o valida con certificado delegado)
# 4. El PAC regresa el CFDI timbrado (con sello del SAT y UUID único)
# 5. Tu sistema almacena el XML timbrado y lo envía al cliente

# Verificar que tienes los certificados CSD (Certificado de Sello Digital)
ls -la *.cer *.key 2>/dev/null
# Si no los tienes, generarlos en: https://www.sat.gob.mx/tramites/16672/genera-tu-certificado

# Verificar la vigencia del certificado
openssl x509 -in tu_certificado.cer -noout -dates
# Busca: notAfter=FECHA_VIGENCIA
🧾
Diagrama de flujo de emisión CFDI 4.0 en México: el sistema web genera el XML según el Anexo 20 del SAT, lo envía al PAC (Finkok, Facturapi, DIVERZA) que valida la estructura, timbra con el sello del SAT y devuelve el XML con el UUID y QR de verificación. Todo en menos de 3 segundos.

Integrar Facturapi (PAC) en WordPress/WooCommerce

<?php
// Facturapi es uno de los PACs más usados por desarrolladores en México
// Documentación: https://www.facturapi.io/docs/

function emitir_cfdi_woocommerce($order_id) {
    $orden = wc_get_order($order_id);
    $api_key = getenv('FACTURAPI_SECRET_KEY'); // sk_XXXXXXXXXX

    // Obtener datos fiscales del cliente (almacenados en meta del usuario)
    $user_id = $orden->get_user_id();
    $rfc = get_user_meta($user_id, 'rfc_fiscal', true);
    $razon_social = get_user_meta($user_id, 'razon_social', true);
    $regimen_fiscal = get_user_meta($user_id, 'regimen_fiscal', true) ?: '616';
    $uso_cfdi = get_user_meta($user_id, 'uso_cfdi', true) ?: 'G03'; // Gastos en general

    // Construir los conceptos de la factura
    $conceptos = [];
    foreach ($orden->get_items() as $item) {
        $conceptos[] = [
            'product' => [
                'description' => $item->get_name(),
                'product_key' => '43232408', // Clave SAT para servicios de hospedaje web
                'price' => round($item->get_subtotal() / 1.16, 2), // Precio sin IVA
                'tax_included' => false,
                'taxes' => [['type' => 'IVA', 'rate' => 0.16]],
            ],
            'quantity' => $item->get_quantity(),
        ];
    }

    $payload = [
        'customer' => [
            'legal_name' => $razon_social,
            'tax_id' => $rfc,
            'tax_system' => $regimen_fiscal,
            'email' => $orden->get_billing_email(),
            'address' => [
                'zip' => $orden->get_billing_postcode() ?: '06600',
            ],
        ],
        'items' => $conceptos,
        'payment_form' => '04', // Tarjeta de crédito
        'use' => $uso_cfdi,
        'currency' => 'MXN',
    ];

    $ch = curl_init('https://www.facturapi.io/v2/invoices');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . $api_key,
            'Content-Type: application/json',
        ],
    ]);

    $factura = json_decode(curl_exec($ch), true);
    curl_close($ch);

    if (isset($factura['id'])) {
        // Guardar el UUID de la factura
        update_post_meta($order_id, '_cfdi_uuid', $factura['uuid']);
        update_post_meta($order_id, '_facturapi_id', $factura['id']);

        // Descargar y enviar el PDF al cliente
        enviar_pdf_factura($factura['id'], $orden->get_billing_email(), $api_key);

        return $factura['uuid'];
    }

    return false;
}

// Hook: generar factura automáticamente cuando el pago se completa
add_action('woocommerce_payment_complete', 'emitir_cfdi_woocommerce');

Claves SAT más usadas para servicios digitales

Clave SATDescripciónUso en ecommerce
43232408Servicios de alojamiento de sitios webHosting, dominios
43232407Servicios de plataforma de tecnología de la informaciónSaaS, APIs
81161901Diseño de sitios webServicios de diseño web
43232301Servicios de administración de redesVPS administrado, soporte TI
84121700Servicios de publicidadGoogle Ads, SEO
G03Gastos en general (uso CFDI)Para clientes empresariales
Advertencia: A partir de CFDI 4.0, el RFC y la razón social del receptor deben coincidir exactamente con los datos del SAT. Un error de un carácter en la razón social hará que el CFDI sea rechazado. Implementa una validación en tiempo real del RFC usando el servicio de validación del SAT o la API de tu PAC antes de procesar el pago.

Escenarios Prácticos: Facturación Electrónica y Hosting

Escenario 1 — Agencia digital que emite 200+ CFDI al mes: Integra la API de Facturama en el servidor para automatizar la emisión de CFDI 4.0 cada vez que un cliente paga. El servidor necesita acceso HTTPS a los PAC del SAT:

// Emitir CFDI 4.0 via Facturama API desde PHP
$cfdi_data = [
  'Serie' => 'A',
  'Folio' => '1001',
  'CfdiType' => 'I', // Ingreso
  'PaymentForm' => '03', // Transferencia
  'PaymentMethod' => 'PUE',
  'Receiver' => [
    'Rfc' => 'XAXX010101000', // RFC genérico público en general
    'Name' => 'PUBLICO EN GENERAL',
    'FiscalRegime' => '616',
    'CfdiUse' => 'S01'
  ],
  'Items' => [[ 'Quantity' => 1, 'ProductCode' => '81161500',
    'UnitCode' => 'E48', 'Unit' => 'Unidad de servicio',
    'Description' => 'Hosting Web Mensual', 'UnitPrice' => 500.00,
    'Subtotal' => 500.00, 'TaxObject' => '02',
    'Taxes' => [['Total' => 80.00, 'Name' => 'IVA', 'Base' => 500.00,
      'Rate' => 0.16, 'IsRetention' => false]]
  ]]
];

Escenario 2 — PyME que necesita timbrado desde su sitio web: El hosting debe tener acceso a internet saliente sin restricciones de firewall para conectar a los PAC (Proveedores Autorizados de Certificación). En algunos hosting compartidos el egress está limitado; en VPS de VacaWeb no hay restricciones.

Errores Comunes en Facturación Electrónica

ErrorSíntomaCausaSolución
CSD caducadoNo se puede timbrarCertificado de Sello Digital vencidoRenovar CSD en el portal del SAT
RFC receptor inválidoRechazo del PACRFC con formato incorrectoValidar RFC con expresión regular del SAT
Clave de producto incorrectaCFDI sin valor fiscalCatálogo SAT no consultadoUsar buscador de claves en el portal SAT
Sin conexión al PACTimbrado falla en producciónPuerto 443 bloqueado en servidorAbrir egress HTTPS desde servidor
Complemento de pago faltanteCFDI inválido para deducciónPago en parcialidades sin complementoEmitir CFDI de pago al recibir cada parcialidad

Preguntas Frecuentes sobre CFDI y Hosting

¿Qué es un PAC y cuáles están autorizados en México?

PAC = Proveedor Autorizado de Certificación. Son empresas autorizadas por el SAT para timbrar CFDI. Los más usados en 2025: Facturama, SW Sapien, Finkok, Edisoft, Contabilidad en Nube. El SAT mantiene la lista actualizada en su portal. El timbrado cuesta entre $0.50 y $2.00 MXN por CFDI según volumen.

¿Mi hosting necesita configuración especial para integrar facturación?

Necesitas PHP 7.4+ con extensiones OpenSSL y cURL habilitadas (estándar en todos los hosting modernos). El servidor debe poder hacer peticiones HTTPS salientes al endpoint del PAC. En algunos hosting compartidos, las peticiones salientes están restringidas; verifica esto antes de elegir plan.

¿Qué versión de CFDI es obligatoria en 2025?

CFDI 4.0 es obligatorio desde enero 2023 para todas las personas físicas y morales. Incluye nuevos campos obligatorios: nombre y domicilio fiscal del receptor, clave de régimen fiscal del receptor y uso del CFDI. Los CFDI 3.3 ya no son válidos para timbrar aunque siguen siendo válidos los emitidos antes de la fecha límite.

¿Puedo emitir facturas desde WordPress?

Sí, con plugins como "CFDI para WooCommerce" o "WP-CFDI". Conectan con la API de tu PAC favorito. El cliente llena sus datos fiscales en el checkout y recibe el CFDI por email automáticamente. Asegúrate de que el plugin esté actualizado a CFDI 4.0 y use el catálogo de claves SAT más reciente.

¿Cuánto tiempo debo conservar los archivos XML de los CFDI?

El Código Fiscal de la Federación establece 5 años como plazo mínimo de conservación de comprobantes fiscales. Se recomienda conservarlos 10 años para mayor seguridad legal. Guarda los XML en servidor con backup automático a almacenamiento en nube (S3, Google Drive) y en formato original sin modificaciones.

👨‍💻
Juan Vaca
Cloud Infrastructure Expert & Founder de VacaWeb

Fundador de VacaWeb con más de 15 años administrando infraestructura Linux en producción. Especialista en LiteSpeed, CloudLinux, cPanel/WHM y arquitectura de hosting de alto rendimiento para el mercado mexicano. Ha diseñado y migrado la infraestructura de más de 1,200 sitios web empresariales.

Compartir: