> ## Documentation Index
> Fetch the complete documentation index at: https://docs.facture.ar/llms.txt
> Use this file to discover all available pages before exploring further.

# Integrar Facturear con tu e-commerce

> Cómo conectar tu tienda online con Facturear para facturar cada venta: Tiendanube, Shopify, WooCommerce, VTEX, Magento, MercadoLibre y Mercado Pago desde Integraciones, o cualquier otra plataforma con la API.

# Integrar Facturear con tu e-commerce

Si vendés online, Facturear puede traer las ventas de tu tienda y facturarlas: todas solas apenas se pagan, o las que vos elijas después de revisarlas. Para las plataformas más usadas no tenés que programar nada: se conectan desde **Integraciones**. Si tu tienda es propia o usa otra plataforma, integrás con la API.

***

## Plataformas que se conectan desde Integraciones

| Plataforma | Cómo se conecta | Modo automático |
| - | - | - |
| Tiendanube | Autorizás a Facturear en tu tienda | Al instante |
| Shopify | Escribís tu tienda (`mitienda.myshopify.com`) y aprobás el acceso | Al instante |
| WooCommerce | Escribís la dirección de tu tienda y aprobás el acceso en WordPress | Al instante |
| VTEX | Cargás el nombre de la cuenta, una App Key y su App Token | Dentro de la hora |
| Magento 2 / Adobe Commerce | Cargás la dirección de la tienda y el Access Token de una integración | Dentro de la hora |
| MercadoLibre | Conectás tu cuenta de MercadoLibre. Ver [MercadoLibre](/es/guides/mercadolibre) | Al instante |
| Mercado Pago | Conectás tu cuenta. Manual (traés las transferencias y elegís cuáles facturar) o confirmando cada cobro por WhatsApp. Ver [Mercado Pago](/es/guides/mercado-pago-transferencias) | No |

Tiendanube, Shopify y WooCommerce avisan a Facturear en cada pedido pagado, por eso el modo automático factura al instante. VTEX y Magento no mandan avisos: Facturear revisa los pedidos una vez por hora.

***

## Conectar tu tienda

<Steps>
  En el menú, entrá a **Configuración → Integraciones** y elegí tu plataforma

  Conectá la cuenta. En Tiendanube, Shopify y WooCommerce tocás **Conectar con …** y aprobás el acceso en tu tienda. En VTEX y Magento seguís los pasos de la pantalla para generar la clave y la pegás

  En **Datos de la factura**, elegí el **CUIT** que factura, el **Punto de venta** y la **Alícuota de IVA de tus productos**

  En **Envío al comprador**, marcá **Enviar la factura por mail** si querés que le llegue al mail que dejó en la tienda (y, si querés, una copia para vos)

  Elegí **¿Cómo querés facturar?** y tocá **Empezar a facturar**
</Steps>

### Automática, por WhatsApp o manual

* **Automática**: cada pedido pagado se factura solo. Aplica a lo que entra desde que la activás; lo anterior lo facturás a mano.
* **Confirmar por WhatsApp**: cada pedido pagado te llega al WhatsApp vinculado para que lo factures o lo marques como no facturable desde el chat, y el PDF te vuelve ahí. Ver [WhatsApp](/es/guides/whatsapp#confirmar-ventas-por-whatsapp).
* **Manual**: importás los pedidos de un período, los revisás y elegís cuáles facturar. Sirve si no todo lo que vendés se factura igual.

Lo podés cambiar cuando quieras. Las ventas de todas tus integraciones, las que esperan revisión y las que se facturaron solas, las ves en **Facturación → Ventas**. Ver [Ventas](/es/guides/desde-integraciones).

### Cómo arma la factura

Facturear toma los precios de la tienda como finales y separa el neto y el IVA con la alícuota que elegiste. Si el comprador dejó un CUIT y es responsable inscripto o monotributista, sale Factura A; si no, Factura B. Si tu CUIT es monotributista, sale Factura C. El envío se suma como un ítem más.

<Note>
  Si conectás WooCommerce y el firewall del sitio bloquea a Facturear, mirá [WooCommerce: el firewall de la tienda bloquea a Facturear](/es/guides/woocommerce-firewall).
</Note>

***

## Otras plataformas: la API

Si tu tienda no está en la lista, tu sistema llama a la API de Facturear cuando se confirma cada venta.

**Flujo típico:**

```javascript theme={null}
const CLASE_A = [1, 6, 13, 16]  // condiciones frente al IVA que reciben Factura A

// Webhook handler para nueva venta confirmada
app.post('/webhook/nueva-venta', async (req, res) => {
  const orden = req.body
  const cliente = orden.cliente

  // Condición frente al IVA del receptor (ids de ARCA): 5 Consumidor Final si no la informó
  const condicion = Number(cliente.condicionIVAReceptorId) || 5
  const conCuit = Boolean(cliente.cuit)

  // Determinar tipo de factura según el cliente (emisor Responsable Inscripto)
  const invoiceType = conCuit && CLASE_A.includes(condicion)
    ? 1    // Factura A
    : 6    // Factura B (default para consumidores)

  // Los precios de la tienda incluyen IVA 21%: separar neto e IVA
  const total = orden.productos.reduce((acc, p) => acc + p.cantidad * p.precioUnitario, 0)
  const neto = Math.round((total / 1.21) * 100) / 100
  const iva = Math.round((total - neto) * 100) / 100

  // Emitir factura en Facturear (queda encolada)
  const respuesta = await fetch('https://www.facture.ar/api/invoices', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.FACTUREAR_API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      cuitId: process.env.FACTUREAR_CUIT_ID,
      invoiceType,
      ptoVta: 1,
      concepto: 1,                                   // Productos
      docTipo: conCuit ? 80 : 99,
      docNro: conCuit ? Number(cliente.cuit.replace(/-/g, '')) : 0,
      condicionIVAReceptorId: condicion,
      clientName: cliente.nombre || 'Consumidor Final',
      impNeto: neto,
      impIVA: iva,
      impTotal: total,
      iva: [{ id: 5, baseImp: neto, importe: iva }],
      description: `Orden #${orden.id}`,
      items: orden.productos.map(p => {
        const unitarioNeto = Math.round((p.precioUnitario / 1.21) * 100) / 100
        return {
          description: p.nombre,
          quantity: p.cantidad,
          unitPrice: unitarioNeto,
          discount: 0,
          ivaRate: 21,
          subtotal: Math.round(unitarioNeto * p.cantidad * 100) / 100
        }
      })
    })
  })

  const resultado = await respuesta.json()
  if (!respuesta.ok) {
    throw new Error(`${resultado.error}: ${JSON.stringify(resultado.details)}`)
  }

  // Guardar el batchId en la orden: el CAE llega después
  await actualizarOrden(orden.id, { facturearBatchId: resultado.batchId })

  res.json({ ok: true })
})
```

La API encola la factura y responde enseguida con un `batchId`, sin CAE. Para completar la orden con el CAE, el número de comprobante y el PDF, consultá el lote en `GET https://www.facture.ar/api/invoices/batches/{batchId}` o suscribite a `invoice.completed`/`invoice.failed` con [webhooks](/es/guides/webhook-integracion): `invoice.completed` trae el CAE, el número y el `invoice.id`. Con el `invoiceId` del resultado descargás el PDF en `GET https://www.facture.ar/api/invoices/{invoiceId}/pdf`.

<Note>
  Si el cliente informa un CUIT y no mandás `condicionIVAReceptorId`, Facturear la toma del padrón de ARCA. Si no corresponde a la clase del comprobante, la API responde `400`. Ver [Condición frente al IVA del receptor](/es/guides/condicion-iva-receptor).
</Note>

***

## Manejo de datos del cliente para determinar la factura

Una buena integración de e-commerce le pide al cliente sus datos fiscales al hacer el checkout:

```html theme={null}
<!-- Formulario de checkout - datos fiscales opcionales -->
<div class="datos-fiscales">
  <h4>Datos para factura (opcional)</h4>
  
  <label>Condición frente al IVA:</label>
  <!-- Los valores son los ids de ARCA para condicionIVAReceptorId -->
  <select name="condicion_iva">
    <option value="5">Consumidor Final</option>
    <option value="1">Responsable Inscripto</option>
    <option value="6">Monotributista</option>
    <option value="4">Exento</option>
  </select>
  
  <!-- Se muestra solo si selecciona Responsable Inscripto, Monotributista o Exento -->
  <div id="datos-empresa" style="display:none">
    <label>CUIT:</label>
    <input type="text" name="cuit" placeholder="XX-XXXXXXXX-X">
    <label>Razón Social:</label>
    <input type="text" name="razon_social">
  </div>
</div>
```

***

## Manejo de errores en producción

Las integraciones de e-commerce deben manejar los casos donde la facturación falla. Hay dos momentos: la API puede rechazar el pedido al enviarlo (`400` con `error` y `details` si los datos no son válidos, `403` con `SUBSCRIPTION_LIMIT_EXCEEDED` si superaste el límite del plan), o ARCA puede rechazar el comprobante cuando se procesa (el ítem del lote queda en `status: "error"`).

```javascript theme={null}
try {
  const factura = await emitirFactura(orden)
} catch (error) {
  // Log del error
  console.error('Error al emitir factura:', error)
  
  // Guardar la orden en cola para reintentar
  await encolarParaReintentar(orden.id, error)
  
  // Notificar al equipo (Slack, email, etc.)
  await notificarError(error, orden)
  
  // La venta igual fue exitosa — no bloquear al cliente
  res.json({ ok: true, advertencia: 'Factura pendiente de emisión' })
}
```

***

## Facturación en lotes para reconciliación

Si tu e-commerce tiene alto volumen y no querés facturar en tiempo real, podés usar la [API de lotes](/es/guides/facturacion-lotes) para emitir facturas en batch una vez al día o por hora.

***

## Recursos relacionados

* [Ventas: lo que traen tus integraciones](/es/guides/desde-integraciones)
* [Facturación en lotes](/es/guides/facturacion-lotes)
* [API Reference completa](/es/api-reference)
* [Emitir tu primera factura](/es/guides/primera-factura)
* [Entorno de testing](/es/guides/entorno-testing)

***

<Card title="Integrá tu e-commerce con Facturear" icon="rocket" href="https://facture.ar">
  Conectá tu tienda desde Integraciones o con la API y facturá cada venta sin cargarla a mano.
</Card>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.