Facturación de plazas de empleado
El add-on de facturación por empleado — una suscripción mensual dedicada de la cuenta que paga, cuya cantidad son las plazas contratadas; dar de alta o reactivar a un empleado ocupa una plaza libre sin cobro, y solo comprar plazas cobra.
Los empleados se facturan mediante plazas contratadas, no por el límite
users del plan — un empleado nunca computa contra ese límite. El add-on es
una suscripción mensual dedicada (employee-seats), totalmente separada de la
suscripción del plan: su quantity es el número de plazas contratadas de la
cuenta, y son solo facturación: el módulo control_horario lo da el plan
(Profesional, Avanzado y Enterprise; un superadmin también puede concederlo a
mano) y sin él no se pueden comprar plazas (403 employee_seats_not_in_plan). La suscripción
pertenece a la cuenta que paga, no a uno de sus NIF, así que los endpoints
viven bajo https://api.factuarea.com/v1/accounts/{account}/employee-seats —
{account} es el account.id que lees en GET /v1/me — y usan
employees:read (estado, preview) o employees:write (comprar o reducir plazas,
contratar, cambiar cantidad, cancelar). Quién paga y quién puede operar
explica de qué cuenta se trata.
Plazas contratadas, ocupadas y libres
La cuenta elige cuántas plazas paga, y ese número es lo que factura la suscripción:
- Las plazas contratadas son las que la cuenta ha comprado y por las que se
le factura (
quantityde la suscripciónemployee-seats). - Las plazas ocupadas son los empleados
activede todos los NIF de la cuenta. - Las plazas libres son las contratadas menos las ocupadas.
En una cuenta que se cobra hay siempre al menos tantas plazas contratadas como ocupadas. Desactivar a un empleado libera una plaza, pero no cambia las contratadas ni la factura: para pagar menos, reduce las plazas.
Cómo se facturan las plazas
Dar de alta, activar o reactivar a un empleado ocupa una plaza libre: sin cobro, sin método de pago y sin llamar a la pasarela de pago. Nunca se cobra en el alta de un empleado; solo se cobra al comprar plazas.
- Dar de alta o reactivar a un empleado ocupa una plaza libre. Si no hay ninguna, mira qué pasa sin plaza libre.
- Desactivar a un empleado libera la plaza y deja las contratadas y la factura como están. La plaza sigue disponible para la siguiente incorporación.
- Cada renovación factura las plazas contratadas, estén ocupadas o no.
Una cuenta que ya tenía el add-on empieza con las plazas que pagaba, así que su factura no cambia.
Cuándo se cobran las plazas
Las plazas se cobran solo cuando las compras, nunca al dar de alta o reactivar a un empleado. Comprar se aplica siempre que tu plan factura:
- una suscripción de plan de pago, también cuando está
past_due(un pago pendiente no suspende la facturación de plazas); - un plan Esencial, Profesional o Avanzado concedido por Factuarea sin suscripción abierta.
Solo estas cuentas no se cobran y sus empleados ni consumen ni compran plazas:
| Caso exento | Motivo |
|---|---|
| Empresas enterprise y gestionadas | Se facturan por contrato, fuera del checkout de autoservicio. |
| Una prueba activa | No se cobra nada; mira Empleados creados durante la prueba. |
| Sandbox (claves de prueba) y cuentas con el modo real apagado | No se hace ningún cobro real. |
| Una cuenta gestionada que paga su proveedor | Las plazas van en la factura del proveedor; mira quién paga. |
GET /v1/accounts/{account}/employee-seats lo informa en seats_billable: true significa que tu plan
debe pagar por plaza, false es un estado legítimo sin cobro.
Para una cuenta enterprise facturada por contrato (sin suscripción de Stripe), el add-on se concede gratis: sin cobro, sin método de pago obligatorio.
La primera compra de plazas
No necesitas contratar antes de añadir empleados. En una cuenta que se cobra y no
tiene suscripción employee-seats, la primera compra de plazas la crea con la
nueva cantidad y cobra el primer periodo.
Los empleados que ya estaban activos cuando se creó la suscripción no se cobran además: en una cuenta existente quedan cubiertos por las plazas que ya pagaba, y una cuenta con empleados activos y sin plazas contratadas empieza sin ninguna hasta que las compre.
Comprar plazas
PATCH /v1/accounts/{account}/employee-seats con {"contracted_seats": N} fija
las plazas contratadas a un valor absoluto. Cuando N es mayor que las
actuales, las que faltan se compran ahora:
- El cobro es inmediato y prorrateado por lo que resta del periodo, con la tarjeta de la cuenta.
Idempotency-Keyes obligatoria: un reintento con la misma clave no cobra dos veces.- La respuesta es el estado con su bloque
seats. - Sin método de pago la llamada responde
402 employee_seat_payment_method_requiredy con un cobro rechazado402 employee_seat_charge_failed; en ambos casos no se compra nada.
curl -X PATCH https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/employee-seats \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"contracted_seats": 8}'Desde MCP, la tool update_employee_seats recibe el mismo contracted_seats y un
idempotency_key. Previsualiza el cobro antes con contracted_seats.
Cualquier compra anula una reducción pendiente.
Reducir plazas
El mismo PATCH con un número menor programa una reducción. Se permite
cualquier cantidad, desde 0: no hay suelo.
- Sin llamar a la pasarela de pago y sin abono. La reducción queda como una reducción pendiente que se aplica en la renovación, y las plazas siguen disponibles hasta entonces.
- Por debajo de las ocupadas, envía
deactivate: una lista de UUID de exactamenteocupadas − cantidadempleados activos de la cuenta. Si no cuadra, la respuesta es422 contracted_seats_selection_requiredconparam=deactivateydetailsproduct,requested,occupied,required,selectedeinvalid. - Paquete de oferta. Si, en la renovación, la reducción deja el producto por
debajo del mínimo de una línea de un paquete de oferta
aplicado, todo el paquete terminaría. La vista previa publica
offer_package_lossy la escritura exigeaccept_offer_package_loss: true; sin ella la respuesta es422 offer_package_loss_unconfirmedconparam=accept_offer_package_lossydetailsproduct,package_id,name,effective_atylines(cada una conconcept,from_price,to_priceeinterval). El mínimo pactado nunca limita la reducción; solo decide si el paquete termina. - Reducción pendiente. El estado muestra
pending_reductionconcontracted,effective_atydeactivations(idyname). Unos días antes de la renovación el titular de la cuenta recibe un aviso con esos nombres, y en la renovación una tarea desactiva a los empleados elegidos y fija la cantidad. - Anularla o sustituirla. Una compra, un
PATCHa la cantidad actual, o un alta, activación, reactivación, lote o traspaso de NIF que ocupe lo que la reducción iba a quitar, la anula; el eventoaccount.seats_updatedlleva entoncescause=reduction_superseded. OtroPATCHmenor la sustituye. - Reducir a 0 exige
deactivatecon todas las plazas ocupadas (y confirmar la pérdida del paquete, si lo hay) y cancela el add-on a fin de periodo.
curl -X PATCH https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/employee-seats \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"contracted_seats": 3, "deactivate": ["0198f2d4-1b7e-7c3a-9d41-6a5e8b2c4f10"]}'Crear un empleado sin plaza libre
Cuando la cuenta se cobra y no hay plaza libre, decide la superficie:
- La aplicación web responde
422 contracted_seats_exhaustedcondetailsproduct,contracted,occupied,free,requiredymissing, sin crear ni cobrar nada. La aplicación lleva entonces a comprar plazas primero y a crear después. - La API v1 y MCP compran las plazas que faltan con un cobro prorrateado y
después crean al empleado, con los mismos
402de siempre cuando no hay tarjeta o el cobro falla (mira los errores de pago). La plaza comprada queda contratada. Un reintento no cobra dos veces.
Envía una Idempotency-Key en las altas: sin ella, un reintento tras un alta que
sí llegó a crearse crea otro empleado, porque la API no distingue un reintento de
un alta nueva.
Empleados creados durante la prueba
Durante una prueba activa no se cobra nada y los empleados que creas no consumen plazas. Puedes elegir las plazas que contratarás sin cobro: se cobran cuando la empresa empieza a pagar.
Cuando empieza el cobro, los empleados activos ocupan las plazas contratadas que
haya. Los más antiguos siguen active y los que no caben pasan a inactive
sin cargo; con 0 plazas contratadas, todos. Reactiva a los que quieras conservar
cuando hayas comprado plazas.
Añadir una tarjeta durante la prueba no desactiva a nadie; solo lo hace el inicio del cobro.
Errores de pago
Una compra de plazas es atómica: cuando falla, no se compra, no se crea ni se cobra nada.
| Respuesta | Significado |
|---|---|
402 employee_seat_payment_method_required | No hay método de pago registrado. error.details.payment_setup_url enlaza al sitio donde añadir la tarjeta; después reintenta. |
402 employee_seat_charge_failed | La pasarela de pago rechazó el cobro. |
403 employee_seats_not_in_plan | El plan no incluye el control horario (Profesional o superior), así que no se pueden comprar plazas. No se cobra nada; bajar o mantener las plazas sigue permitido. |
503 employee_batch_quote_unavailable | Solo cuando los lotes de empleados están activados para la cuenta: no hay una cotización fiable de plazas. Reintenta la misma petición. |
Quién paga y quién puede operar
La suscripción la tiene la cuenta que paga, que normalmente es la propia cuenta. Se cobra al método de pago de la cuenta, y solo la opera un titular o un administrador:
- Para comprar o reducir plazas, contratar, cancelar o cambiar la cantidad, la persona que emitió la clave tiene que ser hoy titular o administrador de la cuenta.
- Para leer o escribir, el ámbito de la clave tiene que incluir la empresa titular de la cuenta.
Si no, la llamada responde 403 forbidden_action y no
cambia nada. Una clave fact_test_ lee el estado y la vista previa, pero la
actualización, subscribe, cancel y change-quantity responden
403 live_credential_required sin cambiar
nada: mira el modo de prueba.
Una cuenta gestionada que paga su proveedor. Para una cuenta gestionada real
que paga su proveedor, las plazas de sus empleados no se compran en la cuenta. Van
en la suscripción managed-accounts del
proveedor, al precio de la plaza, y su cantidad sigue a los empleados activos de
la cuenta sea cual sea el nivel de acceso del proveedor. El cliente no puede
operar el add-on, porque lo que cambiaría está en la factura del proveedor:
- La actualización,
subscribe,cancelychange-quantityresponden403 billing_managed_by_providera sus claves, y a sus personas en la aplicación y en MCP, sin cobro y sin cambio. statusypreviewresponden el mismo403, porque la suscripción que leerían es la del proveedor.- El proveedor tampoco compra esas plazas:
{account}de una cuenta gestionada responde404 account_not_founden estas rutas.
Cuando el cliente asume el pago, la cuenta paga por sí misma y sus titulares y administradores operan el add-on como los de cualquier otra cuenta. Precio de las cuentas gestionadas y cambio de pagador enumera qué más no puede comprar el cliente mientras paga el proveedor.
Consulta el estado de facturación
GET /v1/accounts/{account}/employee-seats devuelve el estado del add-on: si la
suscripción está activa ( subscribed ), cuántas plazas se facturan (
quantity, las plazas contratadas), cuántos empleados están activos, y el coste
recurrente por plaza con IVA. Los importes son euros como cadena de dos
decimales (por ejemplo "1.82") y valen null — nunca un 0 engañoso — cuando
el coste no se puede resolver (sin suscripción, sin plan activo, enterprise fuera
de Stripe, sandbox).
El bloque seats añade el detalle de las plazas contratadas:
| Campo | Significado |
|---|---|
contracted, occupied, free | Plazas que paga la cuenta, las que ocupan los empleados activos y la diferencia. |
agreed_minimum, agreed_minimum_ends_at | El mínimo y su fecha de fin de la línea del paquete de oferta aplicado; 0 y null sin paquete. No es un bloqueo para reducir. |
reducible_to | La cantidad más baja a la que puede llegar una reducción. Siempre 0. |
pending_reduction | null, o la reducción pendiente con contracted, effective_at, deactivations y offer_package_loss. |
enforced | true cuando los empleados nuevos consumen plazas; false en prueba, sandbox y cuentas exentas. |
seats es null en una cuenta gestionada que paga su proveedor.
curl https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/employee-seats \
-H "Authorization: Bearer $FACTUAREA_API_KEY"Previsualiza el cobro
GET /v1/accounts/{account}/employee-seats/preview devuelve el importe
prorrateado de las plazas que compraría una operación, calculado a partir de
la próxima factura de Stripe, sin cobrar. Salvo los rechazos de quién paga y
la validación de sus parámetros, nunca falla — degrada a una vista previa neutra.
| Parámetro | Notas |
|---|---|
count | Vista previa por lote para N empleados (≥1, hasta 1000). |
employee_ids | Vista previa por UUID v7 de los empleados que se van a activar. |
contracted_seats | Vista previa de fijar las plazas contratadas a ese valor. Excluyente con count y employee_ids. |
amount es la base imponible en euros como cadena de dos decimales, y
tax_amount y total usan el mismo formato; recurring_base_cents y
recurring_total_cents siguen en céntimos, como indican sus nombres.
requires_payment_method es true cuando no hay método de pago registrado.
La vista previa dice además cómo cubrirían las plazas contratadas la operación:
free_seats_used,seats_to_buyeincluded_in_seats(truecuando las plazas libres lo cubren todo, así queamountes0y no hace falta tarjeta).seats: el bloqueseatstras la operación.- Con
contracted_seats,amountytotalson el cobro de hoy yrecurring_quantityla cantidad de la próxima factura. - En una reducción, el importe es
0y la vista previa añadedeactivations_required(cuántos empleados debes elegir),cancels_pending_reductionyoffer_package_loss. already_coveredvale siemprefalse: la cobertura por periodo ya no decide ningún cobro.
curl -G https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/employee-seats/preview \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
--data-urlencode "contracted_seats=8"Contrata el add-on
POST /v1/accounts/{account}/employee-seats/subscribe garantiza que la
suscripción mensual employee-seats existe con las plazas contratadas de la
cuenta y cobra el primer periodo con el método de pago registrado. No es
obligatorio: la primera compra de plazas crea la suscripción por
sí sola. No recibe cantidad: para elegir cuántas plazas quieres, usa
PATCH. El cobro es atómico — si no cuaja, no se contrata nada:
- Sin método de pago →
402 employee_seat_payment_method_required; el sobre de error llevaerror.details.payment_setup_urlpara completar el alta de la tarjeta. - Un cobro rechazado →
402 employee_seat_charge_failed.
curl -X POST https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/employee-seats/subscribe \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"Si una petición devuelve 402 employee_seat_payment_method_required, envía al
usuario al payment_setup_url del error, deja que añada una tarjeta y reintenta.
No se cobra, crea ni contrata nada hasta que el cobro se complete.
Sincroniza la cantidad y cancela
POST /v1/accounts/{account}/employee-seats/change-quantity devuelve la cantidad
de la suscripción a las plazas contratadas de la cuenta (un SET sin
prorrateo ni factura). Ya no sigue a los empleados activos. Es
idempotente — un no-op cuando la cantidad ya coincide.
POST /v1/accounts/{account}/employee-seats/cancel equivale a reducir a 0:
cancela el add-on a fin de periodo y acepta los mismos deactivate y
accept_offer_package_loss que la reducción.
- Sin
deactivate, se desactiva en la renovación a todos los empleados activos (sin422), y el titular recibe el aviso unos días antes. - Una lista
deactivateque no cuadra con todos responde422 contracted_seats_selection_required. - Si cancelar rompe un paquete de oferta no confirmado, la respuesta es
422 offer_package_loss_unconfirmed.
El mes en curso ya está pagado, así que subscribed sigue true hasta que el
periodo acaba. La suscripción del plan nunca se toca.
curl -X POST https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/employee-seats/cancel \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"Todo cambio de las plazas contratadas o de la reducción pendiente se anuncia con
el evento account.seats_updated.
Consulta los esquemas en la
Referencia de API, y
la operación para fijar las plazas en
public-api.v1.employee-seats.update.
Flujo típico
- Previsualiza el coste de las plazas que quieres con
contracted_seats. - Asegúrate de que hay un método de pago registrado, para que la compra no se
rechace con
402. - Compra las plazas con
PATCHy unaIdempotency-Key. - Crea o reactiva empleados: cada uno ocupa una plaza libre, sin cobro.
- Lee el estado para mostrar las plazas contratadas, ocupadas y libres.
- Reduce las plazas cuando necesites menos, eligiendo quién sale si hay más empleados que plazas; se aplica en la renovación.
Próximos pasos
el rol de empleado solo-portal y todo el sistema.
los NIF de tu cuenta: el cargo del NIF adicional, su estado y sus estadísticas.
lo que paga un proveedor por los empleados de sus cuentas gestionadas.