# `Stripe.Resources.PromotionCode`
[🔗](https://github.com/jeffhuen/tiger_stripe/blob/main/lib/stripe/resources/promotion_code.ex#L2)

PromotionCode

A Promotion Code represents a customer-redeemable code for an underlying promotion.
You can create multiple codes for a single promotion.

If you enable promotion codes in your [customer portal configuration](https://docs.stripe.com/customer-management/configure-portal), then customers can redeem a code themselves when updating a subscription in the portal.
Customers can also view the currently active promotion codes and coupons on each of their subscriptions in the portal.

# `promotion`

```elixir
@type promotion() :: %{
  optional(:coupon) =&gt; String.t() | Stripe.Resources.Coupon.t() | nil,
  optional(:type) =&gt; String.t() | nil,
  optional(String.t()) =&gt; term()
}
```

* `coupon` - If promotion `type` is `coupon`, the coupon for this promotion. Nullable.
* `type` - The type of promotion. Possible values: `coupon`.

# `restrictions`

```elixir
@type restrictions() :: %{
  optional(:currency_options) =&gt;
    %{required(String.t()) =&gt; restrictions_currency_options()} | nil,
  optional(:first_time_transaction) =&gt; boolean() | nil,
  optional(:minimum_amount) =&gt; integer() | nil,
  optional(:minimum_amount_currency) =&gt; String.t() | nil,
  optional(String.t()) =&gt; term()
}
```

* `currency_options` - Promotion code restrictions defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).
* `first_time_transaction` - A Boolean indicating if the Promotion Code should only be redeemed for Customers without any successful payments or invoices
* `minimum_amount` - Minimum amount required to redeem this Promotion Code into a Coupon (e.g., a purchase must be $100 or more to work). Nullable.
* `minimum_amount_currency` - Three-letter [ISO code](https://stripe.com/docs/currencies) for minimum_amount Max length: 5000. Nullable.

# `restrictions_currency_options`

```elixir
@type restrictions_currency_options() :: %{
  optional(:minimum_amount) =&gt; integer() | nil,
  optional(String.t()) =&gt; term()
}
```

* `minimum_amount` - Minimum amount required to redeem this Promotion Code into a Coupon (e.g., a purchase must be $100 or more to work).

# `t`

```elixir
@type t() :: %Stripe.Resources.PromotionCode{
  active: boolean(),
  code: String.t(),
  created: integer(),
  customer: String.t() | Stripe.Resources.Customer.t(),
  customer_account: String.t(),
  expires_at: integer(),
  id: String.t(),
  livemode: boolean(),
  max_redemptions: integer(),
  metadata: %{required(String.t()) =&gt; String.t()},
  object: String.t(),
  promotion: promotion(),
  restrictions: restrictions(),
  times_redeemed: integer()
}
```

* `active` - Whether the promotion code is currently active. A promotion code is only active if the coupon is also valid.
* `code` - The customer-facing code. Regardless of case, this code must be unique across all active promotion codes for each customer. Valid characters are lower case letters (a-z), upper case letters (A-Z), and digits (0-9). Max length: 5000.
* `created` - Time at which the object was created. Measured in seconds since the Unix epoch. Format: Unix timestamp.
* `customer` - The customer who can use this promotion code. Nullable. Expandable.
* `customer_account` - The account representing the customer who can use this promotion code. Max length: 5000. Nullable.
* `expires_at` - Date at which the promotion code can no longer be redeemed. Format: Unix timestamp. Nullable.
* `id` - Unique identifier for the object. Max length: 5000.
* `livemode` - Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.
* `max_redemptions` - Maximum number of times this promotion code can be redeemed. Nullable.
* `metadata` - Set of [key-value pairs](https://docs.stripe.com/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Nullable.
* `object` - String representing the object's type. Objects of the same type share the same value. Possible values: `promotion_code`.
* `promotion` - Expandable.
* `restrictions` - Expandable.
* `times_redeemed` - Number of times this promotion code has been used.

# `expandable_fields`

# `object_name`

---

*Consult [api-reference.md](api-reference.md) for complete listing*
