Ir al contenido

Planes y Cuotas

Qué es esto

Cada proyecto de ComStack tiene un conjunto de capacidades: qué funciones están activas, cuántas páginas puede contener, cuántos idiomas admite o si puede realizar llamadas telefónicas. Esta página describe el sistema que controla todo esto: módulos, planes, niveles y plantillas.

Cómo funciona

El sistema de derechos tiene cuatro capas:

TérminoQué significa
MóduloUna capacidad funcional: voice_web, voice_phone, whatsapp, knowledge_base, custom_pages, website, github_sync, chrome_ingest, api_keys. Cada uno puede activarse o desactivarse de forma independiente.
PlanEl documento de derechos materializado (settings/plan) que define lo que un proyecto puede hacer en este momento. Contiene límites por módulo y restricciones generales del proyecto.
NivelEl nivel comercial: trial o standard. Determina qué límites del plan se aplican.
PlantillaUna plantilla de proyecto que define el esquema estructural: qué módulos están disponibles, qué límites se aplican por nivel y la duración de la prueba.
CuotaUn límite numérico dentro de un plan: max_pages, max_locales, max_members, max_numbers, max_keys, max_sessions_per_day.

Principio clave: El código de cumplimiento lee UN solo documento: settings/plan. Nunca necesita saber nada sobre plantillas, cupones o suscripciones. Esto hace que la capa de cumplimiento sea extremadamente sencilla y la capa comercial infinitamente flexible.

Cuándo utilizarlo

Consulta esta página cuando necesites entender por qué una operación de proyecto devuelve un error de cuota, qué límites se aplican a un nivel determinado o cómo se materializan los límites del plan a partir de las plantillas de proyecto.

Parámetros / campos / entradas

Módulos

La configuración de los módulos reside en el documento raíz del proyecto en modules.*.

MóduloPropósitoCampos clave de configuración
voice_webAgente de voz en vivo basado en navegadorenabled, voice, greeting, instructions
voice_phoneLlamadas telefónicas PSTN vía Twilioenabled, numbers[]
whatsappVoz de WhatsApp Business vía Twilioenabled, numbers[]
knowledge_basePáginas de documentación optimizadas para agentesenabled, access, locales[]
custom_pagesPáginas de contenido enriquecido para usuariosenabled, access, locales[]
websiteSitio de documentación Starlight publicadoenabled
github_syncSincronizar contenido desde un repositorio GitHubenabled
chrome_ingestIngerir páginas web vía extensión de Chromeenabled
api_keysAutenticación de clave API MCP/HTTPenabled

access ahora es solo una semilla predeterminada. El control de acceso por página se trasladó al campo audience a nivel de documento (public · agents · members · internal). El valor access del módulo inicializa el audience de las nuevas páginas de ese tipo y, por lo demás, es inerte.

Esquema del plan

{
"tier": "trial",
"status": "active",
"modules": {
"website": { "enabled": true, "max_pages": 10 },
"voice_web": { "enabled": true, "max_sessions_per_day": 5 },
"voice_phone": { "enabled": false },
"whatsapp": { "enabled": false },
"knowledge_base": { "enabled": true, "max_pages": 20, "max_locales": 2 },
"custom_pages": { "enabled": true, "max_pages": 10, "max_locales": 2 },
"github_sync": { "enabled": false },
"chrome_ingest": { "enabled": true },
"api_keys": { "enabled": true, "max_keys": 1 }
},
"max_members": 2,
"expires_at": "2026-05-24T14:00:00Z",
"source": "trial",
"coupon_code": null
}
CampoTipoDescripción
tierstring"trial" o "standard". Informativo: el cumplimiento utiliza los límites, no el nombre del nivel.
statusstring"active" o "suspended". Un plan suspendido bloquea todas las operaciones del proyecto.
modulesmapDerechos por módulo. Cada clave coincide con el nombre de un módulo.
max_membersnumberMáximo de miembros del proyecto en todos los roles.
expires_atTimestamp | nullCuándo expira el plan. null = sin expiración (planes de pago).
sourcestringCómo se creó este plan: "trial", "coupon", "migration", "admin" o "stripe".
coupon_codestring | nullEl código de cupón canjeado para activar este plan. null para pruebas.

Niveles

Prueba (Trial)

  • No todas las plantillas permiten pruebas: verifica trial.allowed en la plantilla.
  • La duración es configurable por plantilla (predeterminado: 14 días), almacenada en expires_at.
  • Límites: restrictivos (menos páginas, menos idiomas, sin teléfono/WhatsApp, miembros limitados).
  • Cuando expires_at vence, todos los endpoints autenticados devuelven 403 Trial expired. Los datos del proyecto se conservan: actualizar el plan restaura el acceso.

Estándar

  • Activado mediante cupón, anulación de administrador o pago.
  • Sin expiración (expires_at: null).
  • Límites: generosos (más de 200 páginas, 20 idiomas, teléfono/WhatsApp habilitado, 50 miembros).

Cumplimiento

Todo el cumplimiento lee settings/plan. Los fallos de cumplimiento devuelven 403.

VerificaciónCampo del plan
¿Módulo habilitado?modules.{type}.enabled
Límite de páginasmodules.knowledge_base.max_pages o modules.custom_pages.max_pages
Límite de idiomasmodules.knowledge_base.max_locales
Límite de miembrosmax_members
Límite de claves APImodules.api_keys.max_keys
Límite de números de teléfonomodules.voice_phone.max_numbers
Sesiones en vivo/díamodules.voice_web.max_sessions_per_day
¿Prueba expirada?expires_at

La cuota de sesiones en vivo se aplica de forma atómica antes de que se cree un token de Gemini Live: una transacción de Firestore lee el contador por (proyecto, usuario, día UTC) y rechaza con 429 si se alcanza el límite, evitando ráfagas concurrentes que superen el límite.

Materialización de Plantilla → Plan

Cuando se crea un proyecto:

  1. Se lee la plantilla del proyecto.
  2. Se determina el nivel: trial si no hay cupón y trial.allowed es verdadero; standard si se proporciona un cupón.
  3. Para cada módulo en la plantilla: si available: false, se omite; de lo contrario, se lee la configuración específica del nivel y se escribe en settings/plan.
  4. Se establece max_members desde la raíz del nivel.
  5. Se establece expires_at desde trial.duration_days (o null para estándar).

La actualización del plan modifica settings/plan directamente; no se requieren cambios en el código de cumplimiento.

Plantillas de proyecto

Actualmente hay dos plantillas disponibles:

PlantillaIdeal para
real-estate-euAgencias inmobiliarias en UE/España: voz, multilingüe, listados de propiedades
generic-businessCualquier negocio sin un sector dedicado: mucha documentación/FAQ, multilingüe, voz

La incorporación selecciona la plantilla según la industria extraída (industrias real-estatereal-estate-eu; todo lo demás → generic-business). La selección siempre se muestra al usuario y se puede anular.

Ciclo de vida del estado del proyecto

Independientemente del plan, cada proyecto tiene un campo status:

Estado¿Sitio accesible?¿Puede publicar?¿Puede configurar?
setupEl hosting existe pero no hay nada desplegadoSí (vista previa)
livePúblico en site_url
pausedMuestra página de mantenimientoNo
archivedSitio eliminadoNoNo

Para pasar a live se requiere: al menos una página, un título de sitio configurado y una solicitud explícita para establecer status: "live".

Ejemplo

Comprobación de por qué falla la creación de una página con un error de cuota:

  1. Llama a get-project-state: la respuesta incluye detalles del plan y estado del módulo.
  2. Compara modules.knowledge_base.max_pages con el recuento actual de páginas activas.
  3. Si se alcanza el límite, necesitas una actualización del plan (contacta a soporte) o eliminar primero las páginas archivadas.

Un 403 con "error": "Quota exceeded: knowledge_base.max_pages (20)" significa que el proyecto está en su límite del plan. Un 403 con "error": "Trial expired" significa que expires_at ha pasado.

Errores comunes

ErrorCausaSolución
403 Quota exceeded: knowledge_base.max_pagesSe alcanzó el límite de páginas del plan actualActualiza el plan o elimina páginas archivadas
403 Trial expiredexpires_at ha pasadoContacta a soporte para actualizar
403 Module not enabledEl módulo está desactivado en settings/planHabilita el módulo vía API de configuración de módulos
429 en creación de sesión en vivoSe alcanzó max_sessions_per_dayEspera al reinicio a medianoche UTC o actualiza para un límite mayor

Relacionado

Última actualización: