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

# Product Collections

> Group related products together for unified checkout experiences, plan selection, and upgrade/downgrade paths within the Customer Portal.

<Info>
  Product Collections group related products (e.g., Starter, Pro, Enterprise plans) under one umbrella. Display all options in a single checkout, define upgrade/downgrade paths, and let customers switch plans directly from the Customer Portal.
</Info>

<Frame>
  <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/checkout-page.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=1890932384bc32c8126c7993f3581855" alt="Screenshot of the Product Collection checkout page showing multiple products displayed" style={{ maxHeight: '500px', width: 'auto' }} width="1440" height="960" data-path="images/product-collection/checkout-page.png" />
</Frame>

## Key Highlights

Product Collections let you:

* Group related products (plans, tiers, pricing options) for organized management.
* Include multiple products, such as Starter, Pro, and Lifetime, each with its own pricing model.
* Display all products in one checkout view, so customers compare and choose their preferred plan.
* Enable customers to upgrade or downgrade between products in the same collection via the Customer Portal.
* Control which products are visible, in what order, and which is pre-selected at checkout.

## Creating a Product Collection

Create and manage collections from the dashboard or via API.

<Steps>
  <Step title="Create the collection">
    Define the collection with a name and optional description. Upload an image to represent it in checkout.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/collection-form.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=4740b9da84da8c24177a9592549222af" alt="Screenshot of the Product Collection creation form in the dashboard showing fields for name, description, and image upload" style={{ maxHeight: '500px', width: 'auto' }} width="1440" height="960" data-path="images/product-collection/collection-form.png" />
    </Frame>

    **Collection fields:**

    * **Name** (required): Display name (e.g., "SaaS Plans", "License Tiers").
    * **Description** (optional): Brief explanation shown in checkout.
    * **Image** (optional): Visual branding for the collection.
  </Step>

  <Step title="Add products to the collection">
    Add existing products to your collection. Organize them into groups for better structure.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/collection-form-products.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=41b2da4d40e8dd9a12d059f4fa3f285f" alt="Screenshot of the Product Collection products page showing a list of products and the ability to add them to the collection" style={{ maxHeight: '500px', width: 'auto' }} width="1440" height="960" data-path="images/product-collection/collection-form-products.png" />
    </Frame>

    **Product organization:**

    * **Groups**: Optionally organize products into named groups (e.g., "Monthly Plans", "Annual Plans").
    * **Ungrouped products**: Products without a group appear at the collection level.
    * **Ordering**: Drag and drop to set the display order.

    <Warning>
      Each product can belong to only one collection. If a product is already in another collection, remove it first.
    </Warning>
  </Step>

  <Step title="Configure ordering and visibility">
    Control the display order and visibility of products within the collection.

    **Configuration options:**

    * **Product status**: Enable or disable individual products within the collection.
    * **Display order**: Drag and drop to set the sequence products appear in checkout.

    <Info>
      The first product in the collection is automatically pre-selected at checkout. Reorder products to change which one is selected by default.
    </Info>
  </Step>
</Steps>

## Collection Checkout

Collections enable a unified checkout experience where customers view and select from all available products in one place.

### Checkout Types

| Type | Description | Use Case |
| - | - | - |
| **Collection Checkout** | Displays all active products within a collection | Subscription plan selection, tiered pricing |
| **Single Product Checkout** | Displays only one specific product | Direct purchase, promotional links |

### Collection Checkout Experience

When using a collection checkout:

1. All active products in the collection are displayed.
2. The first product in the collection order is automatically pre-selected.
3. Each product shows its name, description, and pricing.
4. The customer selects one product to purchase.
5. Checkout proceeds with the chosen product's pricing and billing settings.

<Frame>
  <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/checkout-page.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=1890932384bc32c8126c7993f3581855" alt="Screenshot of the Product Collection checkout page showing multiple products displayed" style={{ maxHeight: '500px', width: 'auto' }} width="1440" height="960" data-path="images/product-collection/checkout-page.png" />
</Frame>

<Tip>
  Collection checkout is ideal for subscription businesses where customers compare plans side-by-side before purchasing.
</Tip>

### API Integration

Create a checkout session for a collection:

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_collection_id: 'pdc_abc123',
  product_cart: [], // Required: pass an empty array for collection checkout
  return_url: 'https://yoursite.com/return'
});

window.location.href = session.checkout_url;
```

<Warning>
  When using `product_collection_id`, discount codes cannot be pre-applied at session creation. Customers can still enter codes during checkout if enabled.
</Warning>

## Customer Portal Integration

Customers can upgrade or downgrade between products within the same collection directly from the Customer Portal.

<Tip>
  Already have subscription products? Add them to a Product Collection to enable upgrade/downgrade flows in the Customer Portal. No need to recreate your products.
</Tip>

### Plan Management Actions

| Action | Description | Merchant Control |
| - | - | - |
| **View Current Plan** | Display current product name, price, and renewal date. | Always available. |
| **Upgrade Plan** | Move to a higher-tier product in the same collection. | Configurable (default: disabled). |
| **Downgrade Plan** | Move to a lower-tier product in the same collection. | Configurable (default: disabled). |
| **Cancel** | Cancel the subscription entirely. | Always available. |

<Frame>
  <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/portal.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=9b9d302907688238f6b84c10b85504aa" alt="Screenshot of the Product Collection customer portal plan change interface showing the plan management actions" style={{ maxHeight: '500px', width: 'auto' }} width="2870" height="1654" data-path="images/product-collection/portal.png" />
</Frame>

### Upgrade/Downgrade Rules

* Upgrades and downgrades are only available between products within the same collection.
* Proration for Customer Portal plan changes follows the default upgrade and downgrade behavior in **Settings → Subscriptions**, and each collection can override those defaults. Plan changes made through the [Change Plan API](/api-reference/subscriptions/change-plan) use the `proration_billing_mode` sent with the request.
* Email notifications are sent to the business on every upgrade, downgrade, or cancellation.

<Frame>
  <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/portal-change-plan.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=e4fe60146a7d8436753a36a79f902a6d" alt="Screenshot of the Product Collection customer portal plan change interface showing the plan management actions" style={{ maxHeight: '500px', width: 'auto' }} width="832" height="928" data-path="images/product-collection/portal-change-plan.png" />
</Frame>

<Info>
  Customers cannot change to products outside their current collection. Create separate collections for distinct product lines.
</Info>

## Subscription Settings

Configure how subscriptions and plan changes work across your business from **Settings → Subscriptions** in your dashboard.

<Frame>
  <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/business-settings.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=9ed2f332336aab522b5238ce7218d8ae" alt="Screenshot of the subscription settings page showing Allow Multiple Subscriptions and Allow Subscription Updates toggles" style={{ maxHeight: '500px', width: 'auto' }} width="1440" height="960" data-path="images/product-collection/business-settings.png" />
</Frame>

### Available Settings

| Setting | Description | Default |
| - | - | - |
| **Allow Multiple Subscriptions** | Customers can hold more than one active subscription at the same time. | Enabled |
| **Allow Subscription Updates** | Customers can upgrade or downgrade their existing subscriptions anytime via Customer Portal. | Disabled |
| **Allow Immediate Cancellation** | Customers can end their subscription and lose access straight away. | Enabled |
| **Allow Cancellation at Next Billing Date** | Customers can cancel at the end of the period they have already paid for. | Enabled |
| **Allow Subscription Pause** | Customers can pause and resume their own subscriptions from the Customer Portal. | Disabled |
| **Bill Usage at Pause** | A paused usage-based subscription is invoiced for its owed usage at the moment it is paused, instead of carrying the usage to the next regular invoice. | Enabled |
| **Prevent Trial Misuse** | Customers who have already redeemed a trial are degraded to a paid, no-trial purchase instead of receiving a fresh trial. | Disabled |
| **Payment Method Reminder** | Days before billing starts that a [Card-Optional at Zero Price](/features/subscription#card-optional-at-zero-price) subscription's customer is emailed to add a payment method (1 to 30 days). | 3 days |

<Info>
  Plan changes via Customer Portal are disabled by default. Enable "Allow Subscription Updates" in **Settings → Subscriptions** to let customers upgrade or downgrade between products in the same collection.
</Info>

<Info>
  The two cancellation settings are independent, so you can let customers see out the period they have already paid for while keeping instant cancellation to yourself, or the reverse. Turning one off hides that option in the Customer Portal and rejects requests for it through the Customer Portal API. Your own merchant-side cancellations are unaffected. See [Cancelling a Subscription](/features/customer-portal#cancelling-a-subscription).
</Info>

<Info>
  "Allow Subscription Pause" governs the Customer Portal only — you can pause and resume from the dashboard or the API whichever way it is set. "Bill Usage at Pause" applies to usage-based subscriptions only, and is recorded per billing cycle, so changing it mid-cycle does not change how the cycle in progress settles. See [Pausing and Resuming Subscriptions](/features/subscription#pausing-and-resuming-subscriptions).
</Info>

<Info>
  For details on how trial redemptions are matched and recorded, see [Preventing Trial Misuse](/features/subscription#preventing-trial-misuse).
</Info>

<Info>
  "Payment Method Reminder" only matters for subscriptions with [Card-Optional at Zero Price](/features/subscription#card-optional-at-zero-price) enabled — it has no effect on subscriptions that already require a card. See [What Happens Without a Card](/features/subscription#what-happens-without-a-card) for the full sequence, including what happens if the reminder is ignored.
</Info>

<Card title="Subscription Plan Changes" icon="repeat" href="/features/subscription#subscription-plan-changes">
  Learn more about proration modes and plan change behavior.
</Card>

## Managing Collections

Manage collections through the dashboard or programmatically via API.

### Dashboard Operations

* **Create**: Set up new collections with products and groups.
* **Update**: Modify name, description, image, and product organization.
* **Reorder**: Drag and drop to change product display order.
* **Enable/Disable products**: Control which products appear in checkout.
* **Archive**: Hide a collection without permanently deleting it (can be unarchived later).

<Frame>
  <img src="https://mintcdn.com/dodopayments/2YrxTqbaYgAm54C_/images/product-collection/collection-dashboard.png?fit=max&auto=format&n=2YrxTqbaYgAm54C_&q=85&s=0fee5cdfe68c770b7cdb1d0f8e817b5b" alt="Screenshot of the Product Collection dashboard showing the collection management operations" style={{ maxHeight: '500px', width: 'auto' }} width="1440" height="960" data-path="images/product-collection/collection-dashboard.png" />
</Frame>

### API Management

Use the following endpoints to create, update, retrieve, archive, and organize product collections programmatically, including managing nested groups and products.

<AccordionGroup>
  <Accordion title="Listing Product Collections">
    Fetch all product collections associated with your account using a `GET` request to the `/product-collections` endpoint. Supports pagination, filtering by brand, and including archived collections.

    <Card title="List Product Collections API" icon="code" href="/api-reference/product-collections/list-product-collections">
      View detailed request and response structure in the List Product Collections API documentation.
    </Card>
  </Accordion>

  <Accordion title="Creating a Product Collection">
    Create a new product collection by sending a `POST` request to the `/product-collections` endpoint with the required `name` and `groups` of products, plus optional details such as description and brand.

    <Card title="Create Product Collection API" icon="code" href="/api-reference/product-collections/create-product-collection">
      View detailed request and response structure in the Create Product Collection API documentation.
    </Card>
  </Accordion>

  <Accordion title="Retrieving a Product Collection">
    Get detailed information about a specific product collection — including its groups and product items — using a `GET` request to the `/product-collections/{id}` endpoint.

    <Card title="Get Product Collection API" icon="code" href="/api-reference/product-collections/get-product-collection">
      View detailed request and response structure in the Get Product Collection API documentation.
    </Card>
  </Accordion>

  <Accordion title="Updating a Product Collection">
    Modify a product collection's details (name, description, brand, etc.) by sending a `PATCH` request to the `/product-collections/{id}` endpoint.

    <Card title="Update Product Collection API" icon="code" href="/api-reference/product-collections/update-product-collection">
      View detailed request and response structure in the Update Product Collection API documentation.
    </Card>
  </Accordion>

  <Accordion title="Uploading Collection Images">
    Associate an image with a collection by uploading it via a pre-signed URL. Request an upload URL from the `/product-collections/{id}/images` endpoint, then `PUT` the image to the returned URL within 60 seconds.

    <Warning>
      The pre-signed URL expires in 60 seconds, so the image must be uploaded within that timeframe.
    </Warning>

    <Card title="Update Collection Images API" icon="code" href="/api-reference/product-collections/update-product-collection-images">
      View detailed request and response structure in the Update Collection Images API documentation.
    </Card>
  </Accordion>

  <Accordion title="Archiving a Product Collection">
    Archive a collection by sending a `DELETE` request to the `/product-collections/{id}` endpoint. This hides the collection from new use but does not permanently remove it.

    <Card title="Archive Product Collection API" icon="code" href="/api-reference/product-collections/archive-product-collection">
      View detailed request and response structure in the Archive Product Collection API documentation.
    </Card>
  </Accordion>

  <Accordion title="Unarchiving a Product Collection">
    Restore an archived collection by sending a `POST` request to the `/product-collections/{id}/unarchive` endpoint.

    <Card title="Unarchive Product Collection API" icon="code" href="/api-reference/product-collections/unarchive-product-collection">
      View detailed request and response structure in the Unarchive Product Collection API documentation.
    </Card>
  </Accordion>

  <Accordion title="Managing Groups within a Collection">
    Groups let you organize products inside a collection (for example, "Monthly Plans" vs. "Annual Plans"). Use the groups endpoints to add, update, or remove groups within a collection.

    * **Create a group**: `POST /product-collections/{id}/groups`
    * **Update a group**: `PATCH /product-collections/{id}/groups/{group_id}`
    * **Delete a group**: `DELETE /product-collections/{id}/groups/{group_id}`

    <CardGroup cols={3}>
      <Card title="Create Group" icon="code" href="/api-reference/product-collections/create-group">
        Add a new group to a product collection.
      </Card>

      <Card title="Update Group" icon="code" href="/api-reference/product-collections/update-group">
        Modify a group's name or attributes.
      </Card>

      <Card title="Delete Group" icon="code" href="/api-reference/product-collections/delete-group">
        Remove a group from a collection.
      </Card>
    </CardGroup>
  </Accordion>

  <Accordion title="Managing Products within a Group">
    Manage the individual product items inside a group — add new products, update existing items (such as display order), or remove them entirely.

    * **Add products to a group**: `POST /product-collections/{id}/groups/{group_id}/items`
    * **Update a group item**: `PATCH /product-collections/{id}/groups/{group_id}/items/{item_id}`
    * **Delete a group item**: `DELETE /product-collections/{id}/groups/{group_id}/items/{item_id}`

    <CardGroup cols={3}>
      <Card title="Add Products to Group" icon="code" href="/api-reference/product-collections/add-group-items">
        Add one or more products to a group within a collection.
      </Card>

      <Card title="Update Group Item" icon="code" href="/api-reference/product-collections/update-group-item">
        Update a product item within a group.
      </Card>

      <Card title="Delete Group Item" icon="code" href="/api-reference/product-collections/delete-group-item">
        Remove a product item from a group.
      </Card>
    </CardGroup>
  </Accordion>
</AccordionGroup>

## Best Practices

* **Group logically**: Organize products by billing interval (monthly/annual) or feature tier (starter/pro/enterprise).
* **Order strategically**: Place your most popular or recommended plan first, as it will be pre-selected at checkout.
* **Use clear naming**: Product names should clearly communicate value differences.
* **Enable both directions**: Allow both upgrades and downgrades to give customers flexibility.
* **Consider proration**: Choose a proration mode that aligns with your business model.
* **Test thoroughly**: Verify checkout and plan change flows in test mode before going live.

<CardGroup cols={2}>
  <Card title="Products" icon="box" href="/features/products">
    Create one-time, subscription, or usage-based products to add to collections.
  </Card>

  <Card title="Checkout" icon="cart-shopping" href="/features/checkout">
    Display collection products in a unified checkout experience.
  </Card>

  <Card title="Customer Portal" icon="id-card" href="/features/customer-portal">
    Let customers upgrade or downgrade within the same collection.
  </Card>

  <Card title="Subscriptions" icon="repeat" href="/features/subscription">
    Manage recurring plans with proration and plan changes.
  </Card>
</CardGroup>


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