Skip to main content

New Features

1. Product Collections

Group related products together for unified checkout experiences, plan selection, and seamless upgrade/downgrade paths within the Customer Portal.
Product Collection checkout page showing multiple plan options
Key Benefits
  • Collection-based checkout: Display all products from a collection in one checkout view, letting customers compare and choose their preferred plan
  • Organized product management: Group related products (e.g., Starter, Pro, Enterprise) under a single collection
  • Customer Portal integration: Enable customers to upgrade or downgrade between products within the same collection
  • Merchant control: Enable, disable, and reorder products within each collection
How It Works Create a checkout session for a collection:
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'
});

// Redirect customer to the checkout
window.location.href = session.url;
Result: A unified checkout experience where customers can view and select from all available products in your collection.
Collection checkout is ideal for subscription businesses where you want customers to compare plans side-by-side before purchasing.
Learn more: Product Collections Guide

2. RevolutPay & Billie Payment Methods for GBP Currency

Expanded payment options with RevolutPay and Billie now available globally for GBP one-time payment transactions, giving your customers more flexibility in how they pay. New Payment Methods
Payment MethodSupported CountriesCurrencySubscription Support
RevolutPayGlobalGBPNo (one-time only)
BillieGlobalGBPNo (one-time only)
  • RevolutPay – Fast and seamless payments for Revolut users globally
  • Billie – B2B Buy Now Pay Later solution enabling businesses to offer flexible payment terms to their customers
These payment methods are automatically available for GBP transactions. No additional configuration is required.
Learn more: Payment Methods

3. Checkout Session Preview

Preview checkout sessions before creating them to calculate accurate pricing, taxes, discounts, and totals. Display real pricing to customers before they proceed to checkout. How It Works
const preview = await client.checkoutSessions.preview({
  product_cart: [
    { product_id: 'prod_123', quantity: 1 }
  ],
  billing_address: {
    country: 'US',
    state: 'CA',
    zipcode: '94102'
  },
  discount_code: 'SAVE20'
});

console.log('Subtotal:', preview.subtotal);
console.log('Tax:', preview.tax);
console.log('Discount:', preview.discount);
console.log('Total:', preview.total);
Use Cases
  • Custom pricing displays: Show accurate totals including tax before checkout
  • Discount validation: Verify discount codes and show savings to customers
  • Multi-currency support: Preview pricing in different currencies
  • Cart summaries: Build custom cart UIs with real-time pricing

Preview API Reference

View the complete preview endpoint documentation.

4. Metadata Support in Change Plan Requests

Pass custom metadata when changing subscription plans, enabling better tracking and integration with your internal systems during plan transitions.
// Adding metadata when changing a subscription plan
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_premium',
  proration_billing_mode: 'prorated_immediately',
  quantity: 1,
  metadata: {
    upgrade_reason: 'feature_request',
    previous_plan: 'basic',
    sales_rep: '[email protected]'
  }
});
Use Cases
  • Track upgrade/downgrade reasons: Store why customers changed plans
  • Link to CRM records: Associate plan changes with sales activities
  • Internal categorization: Tag plan changes for reporting and analytics
  • Audit trails: Maintain records of who initiated plan changes
Metadata is included in webhook events, making it easy to process plan changes with your custom data.
Learn more: Metadata Guide | Change Plan API The Payment Response and Payment Link Response now include an invoice_url field, providing direct access to the invoice associated with each payment.
{
  "payment_id": "pay_2IjeQm4hqU6RA4Z4kwDee",
  "status": "succeeded",
  "invoice_url": "https://dodopayments.com/invoices/inv_2IsUnWGtRKFLxk7xAQeyt",
  "amount": 9900,
  "currency": "USD",
  // ... other fields
}
Use Cases
  • Customer communication: Send invoice links directly to customers
  • Accounting integration: Link payments to invoices in your accounting software
  • Self-service portals: Allow customers to access their invoices easily
  • Record keeping: Maintain direct references to invoice documents

Get Payment API

View the Payment Response schema.

6. Validate Discount by Code Name Endpoint

New API endpoint to validate and retrieve discount codes by their code name (e.g., “SAVE20”) instead of using the internal discount ID. Verify discount eligibility before applying them at checkout.
// Validate a discount code before checkout
const discount = await client.discounts.getByCode('SAVE20');

console.log('Discount type:', discount.type);
console.log('Discount value:', discount.amount);
console.log('Valid until:', discount.expires_at);
Benefits
  • Pre-checkout validation: Verify discount codes before creating checkout sessions
  • Real-time feedback: Show customers if their code is valid
  • Error handling: Catch invalid or expired codes early
  • Custom discount UIs: Build discount code input fields with instant validation

Get Discount by Code API

View the complete endpoint documentation.

7. Enhanced Filtering Capabilities for Customers, Discounts, and License Keys

New API filters for listing Customers, Discounts, and License Keys, making it easier to find and manage your data programmatically. Customers API Filters
FilterDescription
emailFilter by customer email
nameFilter by customer name (partial match, case-insensitive)
created_at_gteFilter customers created on or after this timestamp
created_at_lteFilter customers created on or before this timestamp
// Find customers by name created in the last 30 days
const customers = await client.customers.list({
  name: 'John',
  created_at_gte: '2026-01-01T00:00:00Z'
});
Discounts API Filters
FilterDescription
codeFilter by discount code (partial match, case-insensitive)
discount_typeFilter by discount type (percentage)
activeFilter by active status (true = not expired, false = expired)
product_idFilter by product restriction (only discounts that apply to this product)
// Find active percentage discounts for a specific product
const discounts = await client.discounts.list({
  active: true,
  discount_type: 'percentage',
  product_id: 'prod_123'
});
License Keys API Filters
FilterDescription
customer_idFilter by customer ID
statusFilter by license key status (active, expired, disabled)
product_idFilter by product ID
created_at_gteFilter license keys created on or after this timestamp
created_at_lteFilter license keys created on or before this timestamp
// Find active license keys for a specific product
const licenseKeys = await client.licenseKeys.list({
  status: 'active',
  product_id: 'prod_123'
});

8. UI/UX Improvements in Dashboard

This release includes numerous UI/UX improvements across the dashboard for a more intuitive and polished experience. Highlights
  • Improved navigation and layout consistency
  • Enhanced data table interactions
  • Better loading states and feedback
  • Refined visual design elements
  • Improved mobile responsiveness