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.featureAccess.get({
code: 'custom_branding',
customerId: 'user_123',
})
if (!data.allowed) {
redirect('/upgrade')
}response = commet.feature_access.get(
'custom_branding',
customer_id='user_123',
)
if not response.data.allowed:
redirect('/upgrade')result, err := client.FeatureAccess.Get(ctx, "custom_branding", &commet.GetFeatureAccessParams{
CustomerID: "user_123",
})
if err != nil {
return err
}
if !result.Data.Allowed {
// redirigir a upgrade
}ApiResponse<FeatureLookup> result = commet.featureAccess()
.get("custom_branding", GetFeatureAccessParams.builder("user_123").build());
if (!result.getData().allowed()) {
// redirigir a upgrade
}$result = $commet->featureAccess->get('custom_branding', 'user_123');
if (!$result->data->allowed) {
// redirigir a upgrade
}curl "https://commet.co/api/v1/feature-access/custom_branding?customerId=user_123" \
-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.featureAccess.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.overageQuantity — unidades sobre el límite
// data.unlimited — true si no hay toperesponse = commet.feature_access.get(
'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_quantity — unidades sobre el límite
# response.data.unlimited — true si no hay toperesult, err := client.FeatureAccess.Get(ctx, "api_calls", &commet.GetFeatureAccessParams{
CustomerID: "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.OverageQuantity — unidades sobre el límite
// result.Data.Unlimited — true si no hay topeApiResponse<FeatureLookup> result = commet.featureAccess()
.get("api_calls", GetFeatureAccessParams.builder("user_123").build());
// result.getData().current() — uso en este período
// result.getData().included() — incluido en el plan
// result.getData().remaining() — unidades restantes
// result.getData().overageQuantity() — unidades sobre el límite
// result.getData().unlimited() — true si no hay tope$result = $commet->featureAccess->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->overageQuantity — unidades sobre el límite
// $result->data->unlimited — true si no hay topecurl "https://commet.co/api/v1/feature-access/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.featureAccess.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.feature_access.can_use(
'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.FeatureAccess.CanUse(ctx, "team_members", &commet.CanUseFeatureParams{
CustomerID: "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 != nil && *result.Data.WillBeCharged {
// Mostrar confirmación de excedente
}ApiResponse<FeatureLookup> result = commet.featureAccess()
.canUse("team_members", CanUseFeatureParams.builder("user_123").build());
if (!result.getData().allowed()) {
return Map.of("error", "Haz upgrade para agregar más miembros");
}
if (Boolean.TRUE.equals(result.getData().willBeCharged())) {
// Mostrar confirmación de excedente
}$result = $commet->featureAccess->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 las features de un cliente
const { data } = await commet.featureAccess.list({ customerId: 'user_123' })response = commet.feature_access.list(customer_id='user_123')result, err := client.FeatureAccess.List(ctx, &commet.ListFeatureAccessParams{
CustomerID: "user_123",
})ApiResponse<List<FeatureAccess>> result = commet.featureAccess()
.list(ListFeatureAccessParams.builder("user_123").build());$result = $commet->featureAccess->list('user_123');curl "https://commet.co/api/v1/feature-access?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?