> ## Documentation Index
> Fetch the complete documentation index at: https://commet.co/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Promo Codes

> Distribuye una Offer existente mediante un código que el customer ingresa en checkout.

Un Promo Code es un canal de distribución. La Offer referenciada contiene las condiciones económicas; el código controla quién puede canjearlas y cuándo.

## Crear una Offer compatible

Un Promo Code puede referenciar una Offer con fases ordenadas `percentage`, `amount_off` o `fixed_price`. Puede comenzar con una fase `free_trial` si después viene un descuento. Cada fase de descuento anterior a la última debe tener una duración finita.

```typescript theme={null}
const launchOffer = await commet.offers.create({
  name: 'Launch discount',
  phases: [
    { type: 'percentage', durationCycles: 2, percentage: 5000 },
    { type: 'percentage', durationCycles: 3, percentage: 2000 },
  ],
})
```

Para ofrecer un trial seguido de un descuento, poné el trial primero:

```typescript theme={null}
const trialOffer = await commet.offers.create({
  name: 'Acceso temprano',
  phases: [
    { type: 'free_trial', durationDays: 14 },
    { type: 'percentage', durationCycles: 3, percentage: 2000 },
  ],
})
```

## Crear el código

```typescript theme={null}
const promoCode = await commet.promoCodes.create({
  code: 'LAUNCH50',
  offerId: launchOffer.id,
  billingInterval: 'monthly',
  maxRedemptions: 100,
  expiresAt: '2026-12-31T23:59:59.000Z',
  planIds: ['pln_pro'],
})
```

El Promo Code contiene:

* el código visible para el customer;
* las restricciones opcionales por plan e intervalo;
* el límite de canjes;
* el vencimiento y estado activo.

Actualizar la Offer cambia los canjes futuros de los códigos que la referencian. Cada checkout completado cuenta como un canje y guarda una Offer Application inmutable con las fases aceptadas en ese momento. La edición no cambia los canjes anteriores ni sus renovaciones.

Los clientes fijados a una versión anterior a `2026-07-24` reciben solo la primera fase en los campos de descuento heredados del Promo Code cuando es `percentage` o `amount_off`. Los códigos que empiezan con `free_trial` o `fixed_price` no se pueden representar y no aparecen en esos endpoints antiguos. La API actual de Offers permite consultar la secuencia completa.

## Comportamiento en checkout

El customer ingresa el código durante checkout. Commet valida el código, resuelve la Offer referenciada en la moneda del checkout y registra una Offer Application con fuente `promo_code`.

Si la Offer empieza con un trial, el checkout de una suscripción nueva guarda el medio de pago sin cobrar. Aplicar ese código a un checkout pendiente del primer pago lo reemplaza por uno de setup para el trial. Estos códigos no pueden iniciar un trial durante un cambio de plan de una suscripción existente. El canje se cuenta una sola vez cuando termina el setup; la primera factura paga llega al finalizar el trial y usa la fase siguiente. Las renovaciones no suman canjes.

Si aplica una Introductory Offer automática elegible, el código se rechaza con `intro_offer_active`. Tampoco puede combinarse un Promo Code con un `offerId` explícito.

```typescript theme={null}
await commet.subscriptions.create({
  customerId: 'user_123',
  planCode: 'pro',
  promoCode: 'LAUNCH50',
})
```

## Relacionado

* [Offers](/docs/es/offers)
* [Promotional Offers](/docs/es/promotional-offers)
* [Introductory Offers](/docs/es/introductory-offers)
* [Administrar suscripciones](/docs/es/manage-subscriptions)


## Related topics

- [promo_code_expired](/docs/es/api-reference/errors/promo_code_expired.md)
- [Get promo code](/docs/es/api-reference/2026-06-07/promo-codes/get-promo-code.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.