> ## 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.

# v1.113.28 (September 10, 2026)

> A new Reports tab with balance, fee and reconciliation exports, subscription grace periods, a customer blocklist, manual payment retry, an activity log on every payment, a rebuilt discount form, split cancellation controls, card-optional subscriptions when nothing is due today, a mandatory Tax ID flag for B2B checkout, and Georgian checkout.

## New Features

### 1. **Reports**

A new **Reports** tab under **Settings** brings balance, fee and reconciliation reporting together in one place.

**Track Money Movement**

Two always-current views, described as "Understand how activity, fees, and payouts affect your balance":

* **Balance and Payout Summary** — starting balance, activity breakdown, and payout-by-payout detail in one view
* **All Fees** — a full itemized breakdown of every fee charged in the period

**Download Reports**

Build a custom CSV or XLSX export for any date range, from four report types: the **Transactions Report**, **Adjustments Report**, **Payout Report**, and **Ledger Reconciliation Report**. The Ledger Reconciliation Report writes one row per balance movement, built to reconcile against your bank statement.

**Generated Reports**

Everything you have exported is listed under **Generated Reports**, with the date range, format, row count, who generated it, and a download action.

<Frame>
  <img src="https://mintcdn.com/dodopayments/wcp2oXUYABdJitHh/images/reports/reports-hub.png?fit=max&auto=format&n=wcp2oXUYABdJitHh&q=85&s=5ca9b31a0a29106dba531c8e1c5a7f9d" alt="Reports tab showing Track Money Movement, Download Reports, and Generated Reports sections" style={{ maxHeight: '500px', width: 'auto' }} width="1400" height="700" data-path="images/reports/reports-hub.png" />
</Frame>

Learn more: [Reports](/features/reports)

### 2. **Subscription Grace Period**

A subscription whose renewal fails can now keep working for a configurable window instead of going on hold immediately.

Enable **Subscription Grace Period** under **Settings → Subscriptions** and set the **Number of days of grace period** — anything from 1 to 30 days. Grace periods are off by default.

During the window the subscription takes the new `past_due` status: access is preserved and usage keeps accruing, so a customer whose card simply expired is not cut off while they fix it. A new `subscription.past_due` webhook fires when the window opens.

Choose what happens if the window closes unpaid with **Status of subscription after grace period** — either **On Hold**, which matches today's behavior, or **Cancel Subscription**.

<Frame>
  <img src="https://mintcdn.com/dodopayments/S2k6LKmgHYlRKci9/images/subscriptions/subscription-grace-period-settings.png?fit=max&auto=format&n=S2k6LKmgHYlRKci9&q=85&s=4c506116408f7c800bdd13d7561db86c" alt="Subscription Grace Period setting with the number of days and the status to apply after the grace period" style={{ maxHeight: '500px', width: 'auto' }} width="1373" height="184" data-path="images/subscriptions/subscription-grace-period-settings.png" />
</Frame>

Learn more: [Grace Period](/features/subscription#grace-period)

### 3. **Customer Blocklist**

Block a customer who should not be able to buy from you again, by customer ID or by email address.

Blocking cancels the customer's active subscriptions, stops future checkout sessions and direct payments, and leaves their Customer Portal read-only. Because entries match on the email address, a customer who signs up again with the same email is still caught.

Blocklist entries carry notes, so you can record why someone was blocked.

<Frame>
  <img src="https://mintcdn.com/dodopayments/c1t35qHSH45TR4GO/images/blocklist/blocklist-settings.png?fit=max&auto=format&n=c1t35qHSH45TR4GO&q=85&s=771eb4a5654fbd22e6a5110cfb1a2e9d" alt="Blocklist settings listing blocked customers" style={{ maxHeight: '500px', width: 'auto' }} width="2358" height="1554" data-path="images/blocklist/blocklist-settings.png" />
</Frame>

Learn more: [Customer Blocklist](/features/customer-blocklist)

### 4. **Manual Payment Retry**

Retry a failed subscription renewal yourself instead of waiting for the automatic retry schedule, using **Retry Payment Manually** on the payment's detail page. The charge goes to the payment method already saved on the subscription, so the customer does nothing, and it does not consume an attempt from the automatic schedule.

Each renewal invoice allows up to three manual retries, with a cooldown between them — one hour before the second, three hours before the third — so repeated declines do not hurt your authorization rate.

<Frame>
  <img src="https://mintcdn.com/dodopayments/0duTS18kYi2NwQ3m/images/recovery/manual-retry-transaction-details.png?fit=max&auto=format&n=0duTS18kYi2NwQ3m&q=85&s=5537fa5eff17cbe91a53599f887a26e7" alt="Payment detail page with the Retry Payment Manually action" style={{ maxHeight: '500px', width: 'auto' }} width="1285" height="698" data-path="images/recovery/manual-retry-transaction-details.png" />
</Frame>

Learn more: [Manual Payment Retry](/features/recovery/manual-retry)

### 5. **Activity Log on Payments**

Every payment detail page now carries an **Activity Log** — "A history of actions on this transaction in the last 90 days".

The log traces the whole lifecycle in order, from **Payment initiated** through authentication and capture to **Payment succeeded**, and it continues into refunds and disputes, so a contested payment reads as one story rather than several disconnected records.

<Frame>
  <img src="https://mintcdn.com/dodopayments/YYTuTm3Tnxw8EJWt/images/transactions/payments/activity-log.png?fit=max&auto=format&n=YYTuTm3Tnxw8EJWt&q=85&s=3f60d02d04cf0cef958f0ec18406e9a8" alt="Activity Log on a payment detail page showing a Payment succeeded entry with its timestamp" style={{ maxHeight: '500px', width: 'auto' }} width="1920" height="962" data-path="images/transactions/payments/activity-log.png" />
</Frame>

### 6. **A Rebuilt Discount Form**

Creating a discount code now shows you what you are building as you build it. A side panel switches between **Summary**, a plain-language readout of the discount, and **Preview**, which renders the discount as a customer would see it at checkout.

**Currency options** lets you set the discount amount for each currency you sell in. **Eligibility & restrictions** gathers the product and customer rules together.

Redemption limits, the billing-cycle limit, and **Require a minimum order value** — a minimum cart amount enforced per currency — now live under **Advanced**.

<Frame>
  <img src="https://mintcdn.com/dodopayments/28D42lhMYyiRjtpN/images/discount-codes/discount-form-summary.png?fit=max&auto=format&n=28D42lhMYyiRjtpN&q=85&s=1f2c1d04fbbbac53f67d789d81e0a382" alt="Discount code form with the Summary and Preview side panel alongside the discount details" style={{ maxHeight: '500px', width: 'auto' }} width="1920" height="963" data-path="images/discount-codes/discount-form-summary.png" />
</Frame>

Learn more: [Discount Codes](/features/discount-codes)

### 7. **Split Cancellation Controls**

Self-service cancellation used to be a single switch. It is now two independent settings under **Settings → Subscriptions**:

* **Allow Immediate Cancellation** — "Let customers end their subscription and lose access straight away."
* **Allow Cancellation at Next Billing Date** — "Let customers cancel at the end of the period they have already paid for."

So you can let customers see out the period they have paid for while keeping instant cancellation to yourself, or the reverse.

In the Customer Portal the two appear as separate actions, **Cancel now** and **Cancel at next billing date**. Once a cancellation is already scheduled, the portal instead offers to revoke it, alongside **Cancel immediately** — the same action as **Cancel now**, relabeled for that state.

<Frame>
  <img src="https://mintcdn.com/dodopayments/kCngKZVrb0rZMS1f/images/customer-portal/cance-sub.png?fit=max&auto=format&n=kCngKZVrb0rZMS1f&q=85&s=66eb6e380c991826c431fd0c563cbfa6" alt="Customer Portal cancellation dialog offering to cancel now or at the next billing date" style={{ maxHeight: '500px', width: 'auto' }} width="2880" height="1550" data-path="images/customer-portal/cance-sub.png" />
</Frame>

Learn more: [Cancelling a Subscription](/features/customer-portal#cancelling-a-subscription)

### 8. **Plan Changes Paid on a Checkout Page**

Turn on **Collect Plan Change Payments by Payment Link** under **Settings → Subscriptions** and a customer upgrading in the Customer Portal pays for the change on a hosted checkout page instead of against the stored mandate.

The confirm button shows the amount due, and once checkout opens the customer is told: "Complete your payment in the new tab. Your current plan stays active until the payment succeeds." The subscription stays on its old plan until payment succeeds, and a declined payment can be retried on the same link.

The Customer Portal also now knows whether you permit cancelling a scheduled plan change, so it shows or hides that control instead of offering an action that would be refused.

<Frame>
  <img src="https://mintcdn.com/dodopayments/LwHMYe4qXgVFVIvC/images/customer-portal/plan-change-checkout.png?fit=max&auto=format&n=LwHMYe4qXgVFVIvC&q=85&s=91bbe7cab1c13809fa9dc240d851015e" alt="Hosted checkout page for a plan change payment" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1167" data-path="images/customer-portal/plan-change-checkout.png" />
</Frame>

Learn more: [Plan Changes](/features/customer-portal#plan-changes-upgradedowngrade)

### 9. **KYC Retry Budget**

A failed identity verification now tells you why it failed and how many attempts you have left, rather than simply reporting a failure.

Each user gets three attempts, and the notice reads "Attempts remaining: 2/3" with the real reason from the verification provider. The button changes to **Try again** while attempts remain. If all three are used, the notice explains that support can reopen verification.

Learn more: [Account Verification](/miscellaneous/verification-process)

### 10. **Georgian Checkout**

Checkout is now available in Georgian, bringing the total to 22 languages. Georgian is detected from the customer's browser like every other supported language, or you can force it with the `force_language` parameter.

Learn more: [Supported Languages](/features/checkout#supported-languages)

### 11. **Card-Optional at \$0 Price**

A subscription can now start without a payment method whenever nothing is due today. Turn on the **Card-Optional at \$0 Price** checkbox in the product's pricing section, next to **Trial Period (Days)** and **Default Discount (%)**.

Nothing due today arises two ways, and the one checkbox covers both:

* **A free trial** — a trial period with no trial amount, so the first charge is `0` while the trial runs.
* **A \$0 recurring price** — either the price is `0` outright, or a discount brings it there, whether that is the product's own **Default Discount (%)** or discount codes stacked to 100% off at checkout.

A paid trial still requires a card, since a trial amount means something is due.

Without a card on file, the subscription activates anyway and returns `payment_method_required: false`. A reminder email then goes out before real billing starts — how far ahead is set by **Payment Method Reminder** under **Settings → Subscriptions**, anywhere from 1 to 30 days, defaulting to 3. If the card never arrives, the subscription moves to `on_hold` when the first real charge is due, and adding a payment method reactivates it. Two customer emails cover this, both on by default: **Add Payment Method Reminder** and **Subscription On Hold, No Payment Method**.

Over the API the single checkbox maps to two independent price fields, `trial_payment_method_optional` and `zero_amount_payment_method_optional`, so you can enable either case on its own if you manage products directly.

<Frame>
  <img src="https://mintcdn.com/dodopayments/qD0RSXoLZULfSVwD/images/subscriptions/card-optional-at-zero-price-pricing.png?fit=max&auto=format&n=qD0RSXoLZULfSVwD&q=85&s=d76357fda744c461e140675834f25e7b" alt="Subscription pricing form with the Card-Optional at $0 Price checkbox next to Trial Period and Default Discount" style={{ maxHeight: '500px', width: 'auto' }} width="1814" height="1240" data-path="images/subscriptions/card-optional-at-zero-price-pricing.png" />
</Frame>

Learn more: [Card-Optional at \$0 Price](/features/subscription#card-optional-at-0-price)

### 12. **Mandatory Tax ID at Checkout**

Checkout sessions accept a new `require_tax_id` feature flag, for businesses that sell only to registered businesses. It defaults to `false`, so nothing changes unless you ask for it.

With the flag on, **Purchasing as a business** is pre-selected and locked on the checkout page, **Business Name** and **Tax ID Number** both become mandatory, and **Continue to Payment** stays greyed out while either is empty or the Tax ID is rejected. Tax ID validation remains fail-open, so a lookup outage never blocks the customer outright.

`allow_tax_id` must also be `true` or the request is rejected with a `400`, and a session created with `confirm: true` has to carry a `tax_id` because it skips the checkout page entirely.

The requirement is enforced on the checkout page rather than server-side — a confirmation sent straight to the API can still omit `tax_id`, so treat the flag as a checkout experience control rather than a guarantee.

Learn more: [Making the Tax ID Mandatory](/features/b2b-payments#making-the-tax-id-mandatory)

### 13. **Subscription Paused and Resumed Notifications**

Pausing and resuming a subscription now raises its own notifications, for your team and for the customer.

Team notifications add **Subscription Paused** and **Subscription Resumed** under **Subscriptions**, both off by default — the first subscription events here that do not ship enabled, so turn them on if you want them. The matching customer emails are on by default, like every other customer email.

Learn more: [Communication Preferences](/features/communication-preferences#subscriptions)
