Facturación de consumo por equipo

El consumo de tokens, WhatsApp y envíos de email se factura aparte de la cuota del plan. Cada equipo puede tener tarifas propias y frecuencia mensual o semanal. Al cerrar el ciclo se crea un draft en Stripe; no se cobra hasta que se finalice.

Dónde está

Solo el rol root ve esta pantalla. En Gestión de Cuentas, el icono de euro de cada fila abre las tarifas de ese equipo.

Cuentas → icono euro → Tarifas

/account-management/{id}/rates

Dos facturas distintas
  • Cuota del plan: Assistant, Business u otro producto contratado. Sigue saliendo en las facturas de Stripe de suscripción.
  • Consumo: tokens IA, envíos WhatsApp y envíos de email. Va en una factura de uso por equipo y periodo. Al cierre se crea un draft en Stripe.
Tarifas

Hay tres productos. Si el equipo no tiene tarifa propia, se usa la de plataforma y, si tampoco existe, la de configuración.

  • Multiplicador de tokens: el cliente ve N × tokens reales a tarifa OpenRouter, sin recargo extra. Por defecto ×10.
  • Envío WhatsApp: EUR por mensaje saliente. Por defecto 0,003 EUR.
  • Envío mail: EUR por cada email enviado, desde el primero. El plan cubre el uso de la plataforma y el límite de suscriptores, no los envíos. Por defecto 0,002 EUR.

Al guardar una tarifa nueva, la anterior se conserva (SCD2) para el consumo ya ocurrido. El historial de la página muestra Desde / Hasta / Actual.

Frecuencia

Mensual o semanal, por equipo. Si hay Assistant, tokens, WhatsApp y emails de todas las apps siguen su ciclo (del 24 al 24 si Assistant renueva el 24). Si no hay Assistant, se usa el plan más antiguo. Un Shop u otro plan posterior no abre otro ciclo. Sin plan, el mes va del 1 al 1 y la semana de lunes a lunes. Al cambiar a semanal, ese día queda como ancla.

  • Semanal: ventanas de 7 días desde el día del cambio (miércoles a miércoles si cambias un miércoles).
  • Mensual: del día D al D (del 15 al 15 si cambias un día 15).
  • Si el ancla es 29, 30 o 31 y el mes no tiene ese día, se usa el último día del mes. Al mes siguiente se recupera el ancla (31 ene → 28/29 feb → 31 mar → 30 abr → 31 may).
Al cambiar la frecuencia

Si solo cambias importes y dejas la misma frecuencia, se guarda sin aviso. Si cambias Mensual ↔ Semanal, aparece el aviso ¿Cambiar facturación? con los ítems y el total.

  • Se cierra el ciclo en curso hasta las 00:00 del día del cambio. Ese tramo queda como factura de ajuste.
  • El día del cambio entra en el ciclo nuevo. La nueva modalidad arranca ese día a las 00:00.
  • Confirmar cierra el ciclo en Humano. El draft de Stripe se crea en el siguiente barrido diario.
Qué se imprime en la factura

Cada documento (ajuste o ciclo abierto) lleva las mismas tres líneas, aunque el importe sea 0,00 EUR:

  • Tokens IA · periodo: tokens facturados (reales × multiplicador) e importe.
  • Debajo, el desglose por módulo cuando hay origen: Chat, Projects, Insights u otros. Si todo el consumo va sin módulo, solo se muestra el total.
  • Envíos WhatsApp · periodo: número de envíos e importe.
  • Envíos email · periodo: todos los emails enviados en el ciclo e importe.

El preview de la página y el modal de confirmación listan esos ítems. El KPI Tokens muestra el total del preview (ciclo abierto más ajustes pendientes).

Preview
  • A facturar, coste OpenRouter, markup (diferencia por el multiplicador) y tokens totales.
  • Debajo, una tabla por factura: título, periodo, tokens del tramo, líneas y total. El pie es el total pendiente.
  • Meses anteriores usa meses de calendario, no ciclos 15–15 o mié–mié.
Estado actual
  • Al cerrar un ciclo (o un ajuste de frecuencia) se crea un draft en Stripe. Hay que finalizarlo para cobrar.
  • Al cambiar la frecuencia se guarda un ajuste pendiente (invoiced_at vacío). El barrido diario lo convierte en draft si hubo consumo.
  • Las semanas ya cerradas se convierten en draft en el barrido diario (hasta las dos últimas).
  • Se facturan todos los envíos del periodo. El límite de suscriptores del plan no resta emails de la factura.
Línea de comandos

Para fijar una tarifa sin pasar por la pantalla (team_id 0 = default de plataforma):

php artisan billing:set-team-rate {team_id} {product} {amount}
php artisan billing:issue-usage-invoice-drafts [--team=] [--dry-run]

product: tokens_multiplier, whatsapp_send o mailer_send. Opcional: --from= y --currency=.

Relacionado

Webhooks de Stripe (cuota del plan y facturas de suscripción)

Manual: facturas y pagos de clientes (CRM), distinto de este consumo de plataforma