Si tu integración pinta el estado de la cuenta o decide cuándo ofrecer una mejora de plan, ahora tienes cuatro datos que antes no estaban en el contrato. Todos son opcionales y aditivos: nada de lo que ya leías cambió.
Cuántas redes sociales admite el plan
Plan.social_accounts_max dice cuántas cuentas de red social —líneas de WhatsApp, cuentas de Facebook e Instagram, sumadas— puede tener conectadas el espacio de trabajo.
{ "slug": "oficina", "social_accounts_max": null }
null significa sin tope, y es lo que devuelven los planes de pago. Un plan que traiga 1 admite una sola cuenta entre las tres redes, no una por red.
Es un techo distinto de los que ya conocías: wa_numbers_included cuenta números de WhatsApp y meta_accounts_included cuenta cuentas de Meta, cada uno contra su propia red. Este mira el total. Cuando lo alcanzas, conectar otra cuenta responde 403 con error: "social_accounts_quota" y un usage que trae el desglose por red.
Cuándo el tope de contactos no bloquea
Plan.contacts_limit_soft distingue dos formas de aplicar max_contacts:
| Valor | Qué pasa al llegar al tope |
|---|
false (lo habitual) | La suscripción pasa a contacts_limit y el espacio de trabajo queda bloqueado. |
true | Solo se frena el alta de contactos. El espacio de trabajo sigue operando. |
Con el tope blando, un contacto entrante que llega por encima del límite no se pierde: se guarda en espera y se incorpora cuando el cupo vuelve a alcanzar.
Dónde aterriza una prueba que vence
WorkspaceSubscription.fallback_plan_id es el plan al que pasa la suscripción cuando se le acaba la prueba, en vez de quedar inactiva. null —el valor de casi todas— es el comportamiento de siempre: la prueba vence y la cuenta se bloquea hasta que se elija un plan.
Y en GET /billing/access, landed_on_fallback te avisa de la ventana en la que la prueba ya venció y la cuenta ya opera con el plan de destino, aunque la suscripción todavía diga trial:
{
"subscription_status": "trial",
"landed_on_fallback": true,
"plan_slug": "<el plan de destino>",
"limits": { "contacts_max": 100 }
}
Cuando landed_on_fallback es true, manda el plan que viene en la respuesta, no el subscription_status. plan_id, plan_slug y limits ya son los del plan de destino; el estado de la fila se pone al día en el corte siguiente. Si tu integración decide por subscription_status, vas a ver una prueba vencida donde hay una cuenta que funciona.