Configurar features
Define capacidades con tipos de feature boolean, metered y de licencias en Commet.
Las features son bloques reutilizables que definen las capacidades que vendes. Crea una feature una vez y agrégala a múltiples planes con configuraciones distintas.
Tipos de feature
| Tipo | Descripción | Ejemplos |
|---|---|---|
| Boolean | Acceso on/off a una capacidad | SSO, branding personalizado, soporte prioritario |
| Metered | Basada en uso con cantidades incluidas | API Calls, Storage GB, Emails enviados |
| Seats | Licencias por usuario | Licencias de Editor, Admin, Viewer |
El consumo se define a nivel de plan, no a nivel de feature. Cuando agregas una feature a un plan, especificas cuánto está incluido, si hay excedente y a qué precio.
Crear features en el dashboard
Ve a Features y haz clic en Create Feature. Toda feature necesita un Name (visible para el cliente) y un Code (identificador interno para el SDK, ej. api_calls). Los códigos de feature solo aceptan letras minúsculas, números y guiones bajos (^[a-z0-9_]+$) y deben ser únicos dentro de tu organización.
Las features Metered también requieren un Event Code y un Unit Name (ej. "calls", "GB"). Las features de licencias opcionalmente aceptan un Seat Type (ej. "Editor", "Admin").
Verificar acceso a features
Restringe features según el plan del cliente.
const { data } = await commet.features.check({
code: 'custom_branding',
customerId: 'user_123',
})
if (!data.allowed) {
redirect('/upgrade')
}response = commet.features.check(
code='custom_branding',
customer_id='user_123',
)
if not response.data['allowed']:
redirect('/upgrade')result, err := client.Features.Check(ctx, "custom_branding", "user_123")
if err != nil {
return err
}
if !result.Data.Allowed {
// redirigir a upgrade
}ApiResponse<CheckResult> result = commet.features().check("custom_branding", "user_123");
if (!result.getData().isAllowed()) {
// redirigir a upgrade
}$result = $commet->features->check('custom_branding', 'user_123');
if (!$result->data['allowed']) {
// redirigir a upgrade
}curl "https://commet.co/api/features/custom_branding?customerId=user_123&action=canUse" \
-H "x-api-key: $COMMET_API_KEY"Obtener detalles de una feature
Devuelve números de uso, límites y datos de excedente.
const { data } = await commet.features.get({
code: 'api_calls',
customerId: 'user_123',
})
// data.current — uso en este período
// data.included — incluido en el plan
// data.remaining — unidades restantes
// data.overage — unidades sobre el límite
// data.unlimited — true si no hay toperesponse = commet.features.get(
code='api_calls',
customer_id='user_123',
)
# response.data['current'] — uso en este período
# response.data['included'] — incluido en el plan
# response.data['remaining'] — unidades restantes
# response.data['overage'] — unidades sobre el límite
# response.data['unlimited'] — true si no hay toperesult, err := client.Features.Get(ctx, "api_calls", "user_123")
if err != nil {
return err
}
// result.Data.Current — uso en este período
// result.Data.Included — incluido en el plan
// result.Data.Remaining — unidades restantes
// result.Data.Overage — unidades sobre el límite
// result.Data.Unlimited — true si no hay topeApiResponse<Feature> result = commet.features().get("api_calls", "user_123");
// result.getData().getCurrent() — uso en este período
// result.getData().getIncluded() — incluido en el plan
// result.getData().getRemaining() — unidades restantes
// result.getData().getOverage() — unidades sobre el límite
// result.getData().isUnlimited() — true si no hay tope$result = $commet->features->get('api_calls', 'user_123');
// $result->data['current'] — uso en este período
// $result->data['included'] — incluido en el plan
// $result->data['remaining'] — unidades restantes
// $result->data['overage'] — unidades sobre el límite
// $result->data['unlimited'] — true si no hay topecurl "https://commet.co/api/features/api_calls?customerId=user_123" \
-H "x-api-key: $COMMET_API_KEY"Pre-flight check
Verifica si un cliente puede usar una feature y si se le cobrará un extra.
const { data } = await commet.features.canUse({
code: 'team_members',
customerId: 'user_123',
})
if (!data.allowed) {
return { error: 'Haz upgrade para agregar más miembros' }
}
if (data.willBeCharged) {
// Mostrar confirmación de excedente
}response = commet.features.can_use(
code='team_members',
customer_id='user_123',
)
if not response.data['allowed']:
return {'error': 'Haz upgrade para agregar más miembros'}
if response.data['will_be_charged']:
# Mostrar confirmación de excedente
passresult, err := client.Features.CanUse(ctx, "team_members", "user_123")
if err != nil {
return err
}
if !result.Data.Allowed {
return errors.New("haz upgrade para agregar más miembros")
}
if result.Data.WillBeCharged {
// Mostrar confirmación de excedente
}ApiResponse<FeatureAccess> result = commet.features().canUse("team_members", "user_123");
if (!result.getData().isAllowed()) {
return Map.of("error", "Haz upgrade para agregar más miembros");
}
if (result.getData().isWillBeCharged()) {
// Mostrar confirmación de excedente
}$result = $commet->features->canUse('team_members', 'user_123');
if (!$result->data['allowed']) {
return ['error' => 'Haz upgrade para agregar más miembros'];
}
if ($result->data['willBeCharged']) {
// Mostrar confirmación de excedente
}curl -X POST https://commet.co/api/usage/check \
-H "x-api-key: $COMMET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": "user_123",
"featureCode": "team_members",
"quantity": 1
}'Listar todas las features
const { data } = await commet.features.list('user_123')response = commet.features.list(customer_id='user_123')result, err := client.Features.List(ctx, "user_123")ApiResponse<List<Feature>> result = commet.features().list("user_123");$result = $commet->features->list('user_123');curl "https://commet.co/api/features?customerId=user_123" \
-H "x-api-key: $COMMET_API_KEY"Relacionado
- Trackear uso — Envía eventos de uso para features metered
- Administrar planes — Agrega features a tus planes
- Modelos de consumo — Cómo se comportan las features en cada modelo
- Gestión de licencias — Administra licencias por usuario
¿Cómo está esta guía?