Saltar al contenido principal
La facturación por asiento te permite cobrar a los clientes en función del número de usuarios, miembros del equipo o licencias que necesiten. Es el modelo de precios estándar para herramientas de colaboración en equipo, software empresarial y productos SaaS B2B.

¿Qué es la Facturación por Asiento?

La facturación por asiento (también llamada precios por usuario o por asiento) cobra a los clientes en función del número de usuarios que acceden a tu producto. En lugar de una tarifa fija, el precio se ajusta según el tamaño del equipo.

Casos de Uso Comunes

IndustriaEjemploModelo de Precios
Colaboración en EquipoSlack, Notion, AsanaPor usuario activo/mes
Herramientas para DesarrolladoresGitHub, GitLab, JiraPor asiento/mes
Software CRMSalesforce, HubSpotPor licencia de usuario
Herramientas de DiseñoFigma, CanvaPor asiento de editor
Software de Seguridad1Password, OktaPor usuario/mes
VideoconferenciasZoom, TeamsPor licencia de anfitrión

Beneficios de la Facturación por Asiento

Para Tu Negocio:
  • Los ingresos escalan naturalmente a medida que los clientes crecen
  • Precios predecibles que los clientes pueden presupuestar
  • Ruta de actualización clara de individual a equipo a empresarial
  • Mayor valor de vida útil a medida que los equipos se expanden
Para Tus Clientes:
  • Pagar solo por lo que utilizan
  • Fácil de entender y prever costos
  • Flexibilidad para agregar/quitar usuarios según sea necesario
  • Precios justos que coinciden con el tamaño del equipo

Cómo Funciona la Facturación por Asiento en Dodo Payments

Dodo Payments implementa la facturación por asiento utilizando el sistema de Complementos. Así es como funciona:

Resumen de Arquitectura

Una suscripción Team Pro cuesta $99/mes e incluye 5 asientos. Si tienes más de 5 usuarios, pagas $15/mes adicionales por cada asiento extra. Por ejemplo, si tu equipo necesita 15 asientos:
  • Plan Base: $99/mes (incluye 5 asientos)
  • Complementos: 10 asientos extra × $15/mes = $150/mes
  • Costo mensual total: $99 + $150 = $249 por 15 asientos

Componentes Clave

ComponentePropósitoEjemplo
Producto BaseSuscripción principal con asientos incluidos”Plan de Equipo - $99/mes (5 asientos incluidos)“
Complemento de AsientoCargo por asiento para usuarios adicionales”Asiento Extra - $15/mes cada uno”
CantidadNúmero de asientos adicionales comprados10 asientos extra

Estrategias de Precios

Elige la estrategia de precios por asiento que se ajuste a tu negocio:

Estrategia 1: Base + Complemento por Asiento

Incluye un número fijo de asientos en el plan base, cobra por asientos adicionales. Ejemplo:
Starter Plan: $49/month
├── Includes: 3 seats
├── Extra seats: $10/month each
└── 8 total seats = $49 + (5 × $10) = $99/month
Mejor para: Productos donde equipos pequeños pueden funcionar con la oferta base.

Estrategia 2: Precios Puro por Asiento

Cobra una tarifa fija por asiento sin tarifa base. Ejemplo:
Per User: $12/month
├── 5 users = $60/month
├── 20 users = $240/month
└── 100 users = $1,200/month
Implementación: Establece el precio del plan base en $0, usa solo el complemento por asiento. Mejor para: Precios simples y transparentes; modelos basados en uso.

Estrategia 3: Precios por Asiento por Niveles

Diferentes planes base con diferentes tarifas por asiento. Ejemplo:
Starter: $0/month base + $15/seat
├── Lower features, higher per-seat cost

Professional: $99/month base + $10/seat
├── More features, lower per-seat cost

Enterprise: $499/month base + $7/seat
└── All features, volume discount on seats
Implementación: Crea productos separados para cada nivel con diferentes precios de complemento. Mejor para: Fomentar actualizaciones a niveles superiores; ventas empresariales.

Estrategia 4: Paquetes de Asientos

Vende asientos en paquetes en lugar de individualmente. Ejemplo:
5-Seat Pack: $50/month ($10/seat)
10-Seat Pack: $80/month ($8/seat)
25-Seat Pack: $175/month ($7/seat)
Implementación: Crea múltiples complementos para diferentes tamaños de paquete. Mejor para: Simplificar decisiones de compra; fomentar compromisos más grandes.

Configuración de la Facturación por Asiento

Paso 1: Planifica Tu Estructura de Precios

Antes de la implementación, define tu estructura de precios:
1

Define el Plan Base

Decide qué se incluye en la suscripción base:
  • Precio base (puede ser $0 para puro por asiento)
  • Número de asientos incluidos
  • Características disponibles en este nivel
2

Establece el Precio por Asiento

Determina el costo del complemento por asiento:
  • Precio por asiento adicional
  • Cualquier descuento por volumen (a través de múltiples complementos)
  • Máximo de asientos permitidos (si corresponde)
3

Considera la Frecuencia de Facturación

Alinea el precio por asiento con tu ciclo de facturación:
  • Suscripciones mensuales → cargos mensuales por asiento
  • Suscripciones anuales → cargos anuales por asiento (a menudo con descuento)

Paso 2: Crea el Complemento por Asiento

En tu panel de Dodo Payments:
  1. Navega a ProductosComplementos
  2. Haz clic en Crear Complemento
  3. Configura el complemento:
CampoValorNotas
Nombre”Asiento Adicional” o “Miembro del Equipo”Nombre claro y fácil de entender
Descripción”Agrega otro miembro del equipo a tu espacio de trabajo”Explica lo que obtienen los clientes
PrecioTu precio por asientop. ej., $10.00
MonedaCoincide con tu producto baseDebe ser la misma moneda
Categoría de ImpuestosIgual que el producto baseAsegura un manejo de impuestos consistente
Crea nombres de complementos descriptivos que tengan sentido en las facturas. “Asiento Adicional del Equipo” es más claro que “Complemento de Asiento” para los clientes que revisan sus facturas.

Paso 3: Crea el Producto de Suscripción

Crea tu producto de suscripción:
  1. Navega a ProductosCrear Producto
  2. Selecciona Suscripción
  3. Configura precios y detalles
  4. En la sección de Complementos, adjunta tu complemento por asiento

Paso 4: Adjunta el Complemento al Producto

Vincula el complemento por asiento a tu suscripción:
  1. Edita tu producto de suscripción
  2. Desplázate a la sección de Complementos
  3. Haz clic en Agregar Complementos
  4. Selecciona tu complemento por asiento
  5. Guarda los cambios
Tu producto de suscripción ahora admite precios por asiento. Los clientes pueden comprar cualquier cantidad de asientos adicionales durante el proceso de pago.

Gestión de Asientos

Agregando Asientos a Nuevas Suscripciones

Al crear una sesión de pago, especifica la cantidad de asientos:
const session = await client.checkoutSessions.create({
  product_cart: [{
    product_id: 'prod_team_plan',
    quantity: 1,
    addons: [{
      addon_id: 'addon_seat',
      quantity: 10  // 10 additional seats
    }]
  }],
  customer: { email: '[email protected]' },
  return_url: 'https://yourapp.com/success'
});

Cambiando la Cantidad de Asientos en Suscripciones Existentes

Utiliza la API de Cambio de Plan para ajustar los asientos:
// Add 5 more seats to existing subscription
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  addons: [{
    addon_id: 'addon_seat',
    quantity: 15  // New total: 15 additional seats
  }]
});

Eliminando Asientos

Para reducir la cantidad de asientos, especifica la cantidad menor:
// Reduce from 15 to 8 additional seats
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: [{
    addon_id: 'addon_seat',
    quantity: 8  // Reduced to 8 additional seats
  }]
});

Eliminando Todos los Asientos Adicionales

Pasa un array de complementos vacío para eliminar todos los complementos:
// Remove all additional seats, keep only base plan seats
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: []  // Removes all add-ons
});

Prorrateo por Cambios de Asiento

Cuando los clientes agregan o eliminan asientos a mitad de ciclo, el prorrateo determina cómo se les factura.

Modos de Prorrateo

ModoAgregando AsientosEliminando Asientos
prorated_immediatelyCargar por los días restantes en el cicloCrédito por días no utilizados
difference_immediatelyCargar el precio completo del asientoCrédito aplicado a renovaciones futuras
full_immediatelyCargar el precio completo del asiento, reiniciar ciclo de facturaciónSin crédito

Ejemplos de Prorrateo

Escenario: 15 días de ciclo de facturación restantes, agregando 5 asientos a $10/asiento
Prorated charge = ($10 × 5 seats) × (15 days / 30 days)
                = $50 × 0.5
                = $25 immediate charge
El cliente paga $25 ahora, luego $50/mes en la renovación.

Vista Previa Antes de Cambiar

Siempre vista previa del prorrateo antes de realizar cambios:
const preview = await client.subscriptions.previewChangePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  addons: [{ addon_id: 'addon_seat', quantity: 20 }]
});

console.log('Immediate charge:', preview.immediate_charge.summary);
// Show customer: "Adding 5 seats will cost $25 today"

Seguimiento de Asientos con Webhooks

Monitorea los cambios de asientos escuchando los webhooks de suscripción:

Eventos Relevantes

EventoCuándo se ActivaCaso de Uso
subscription.activeNueva suscripción activadaProvisionar asientos iniciales
subscription.plan_changedAsientos agregados/eliminadosActualizar el conteo de asientos en tu aplicación
subscription.renewedSuscripción renovadaConfirmar que el conteo de asientos no ha cambiado
subscription.cancelledSuscripción canceladaDeprovisionar todos los asientos

Ejemplo de Manejador de Webhook

app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;

  switch (event.type) {
    case 'subscription.active':
      // New subscription - provision seats
      const seats = calculateTotalSeats(event.data);
      await provisionSeats(event.data.customer_id, seats);
      break;

    case 'subscription.plan_changed':
      // Seats changed - update access
      const newSeats = calculateTotalSeats(event.data);
      await updateSeatCount(event.data.subscription_id, newSeats);
      break;

    case 'subscription.cancelled':
      // Subscription cancelled - deprovision
      await deprovisionAllSeats(event.data.subscription_id);
      break;
  }

  res.json({ received: true });
});

function calculateTotalSeats(subscriptionData) {
  const baseSeats = 5;  // Included in plan
  const addonSeats = subscriptionData.addons?.reduce(
    (total, addon) => total + addon.quantity, 0
  ) || 0;
  return baseSeats + addonSeats;
}

Aplicando Límites de Asientos

Tu aplicación debe hacer cumplir los límites de asientos. Dodo Payments rastrea la facturación, pero tú controlas el acceso.

Estrategias de Aplicación

Previene estrictamente la adición de usuarios más allá del conteo de asientos.
async function inviteUser(teamId: string, email: string) {
  const team = await getTeam(teamId);
  const subscription = await getSubscription(team.subscriptionId);
  const totalSeats = calculateTotalSeats(subscription);
  const usedSeats = await countTeamMembers(teamId);

  if (usedSeats >= totalSeats) {
    throw new Error('No seats available. Please upgrade your plan.');
  }

  await sendInvitation(teamId, email);
}

Patrones Avanzados

Diferentes Tipos de Asientos

Ofrece diferentes tipos de asientos con diferentes precios:
Full Seats: $20/month - Full access to all features
View-Only Seats: $5/month - Read-only access
Guest Seats: $0/month - Limited external collaborator access
Implementación: Crea complementos separados para cada tipo de asiento.
const session = await client.checkoutSessions.create({
  product_cart: [{
    product_id: 'prod_team_plan',
    quantity: 1,
    addons: [
      { addon_id: 'addon_full_seat', quantity: 10 },
      { addon_id: 'addon_viewer_seat', quantity: 25 },
      { addon_id: 'addon_guest_seat', quantity: 50 }
    ]
  }]
});

Descuentos por Asientos Anuales

Ofrece precios de asientos anuales con descuento:
Monthly: $15/seat/month
Annual: $12/seat/month (20% savings)
Implementación: Crea productos separados para planes mensuales y anuales con diferentes precios de complemento.

Requisitos Mínimos de Asientos

Requiere un número mínimo de asientos para ciertos planes:
async function validateSeatCount(planId: string, seatCount: number) {
  const minimums = {
    'prod_starter': 1,
    'prod_team': 5,
    'prod_enterprise': 25
  };

  if (seatCount < minimums[planId]) {
    throw new Error(`${planId} requires at least ${minimums[planId]} seats`);
  }
}

Mejores Prácticas

Mejores Prácticas de Precios

  • Comunicación Clara: Muestra el precio por asiento de manera prominente en tu página de precios
  • Asientos Incluidos: Considera incluir algunos asientos en el precio base para reducir la fricción
  • Descuentos por Volumen: Ofrece tarifas por asiento más bajas para equipos más grandes para ganar acuerdos empresariales
  • Incentivos Anuales: Descuenta los planes anuales para mejorar el flujo de efectivo y la retención

Mejores Prácticas Técnicas

  • Cachear Conteos de Asientos: Cachea los conteos de asientos de suscripción localmente para evitar llamadas a la API en cada solicitud
  • Sincronizar Regularmente: Sincroniza periódicamente tu conteo de asientos local con Dodo Payments a través de la API
  • Manejar Fallos: Si un cambio de asiento falla, muestra mensajes de error claros y opciones de reintento
  • Registro de Auditoría: Registra todos los cambios de asientos para disputas de facturación y cumplimiento

Mejores Prácticas de Experiencia del Usuario

  • Retroalimentación en Tiempo Real: Muestra el impacto inmediato en el costo al ajustar asientos
  • Pasos de Confirmación: Requiere confirmación antes de realizar cambios en la facturación
  • Transparencia en el Prorrateo: Explica claramente los cargos prorrateados antes de aplicarlos
  • Fáciles Downgrades: No hagas difícil reducir asientos (esto genera confianza)

Solución de Problemas

Síntoma: Tu aplicación muestra un conteo de asientos diferente al de la suscripción.Causas:
  • Webhook no recibido o procesado
  • Condición de carrera durante el cambio de asiento
  • Datos en caché no actualizados
Soluciones:
  1. Implementa manejadores de webhook para subscription.plan_changed
  2. Agrega un botón “Sincronizar con facturación” que obtenga la suscripción actual
  3. Establece TTL de caché para asegurar una actualización regular
Síntoma: Cliente confundido por el monto del cargo a mitad de ciclo.Causas:
  • Modo de prorrateo no comunicado claramente
  • Cliente no vio la vista previa antes de confirmar
Soluciones:
  1. Siempre usa previewChangePlan antes de realizar cambios
  2. Muestra un desglose claro: “Agregando X asientos = $Y hoy (prorrateado por Z días)”
  3. Documenta tu política de prorrateo en el centro de ayuda
Síntoma: Complemento de asiento no disponible durante el checkout.Causas:
  • Complemento no adjunto al producto
  • Complemento archivado o eliminado
  • Desajuste de moneda entre producto y complemento
Soluciones:
  1. Verifica que el complemento esté adjunto en la configuración del producto
  2. Revisa el estado del complemento en el panel de Complementos
  3. Asegúrate de que las monedas coincidan exactamente
Síntoma: El cliente quiere reducir asientos pero tiene usuarios asignados.Soluciones:
  1. Muestra qué usuarios deben ser eliminados antes de reducir asientos
  2. Implementa un flujo de trabajo: Eliminar usuarios → Reducir asientos
  3. Considera un período de gracia antes de hacer cumplir la reducción de asientos

Documentación Relacionada