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

# Controlled Subscription Payments

> Drive pre-debit notification and charge execution yourself with the controlled subscription payment APIs for UPI Autopay mandates.

v2026-01-01 introduces a controlled payment flow for UPI mandate subscriptions, giving you explicit control over when your customers are notified and when the debit is executed. This is a significant change if you need to comply with NPCI pre-debit notification rules.

<Note>The controlled flow supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.</Note>

## How it works

The controlled flow replaces the automatic charge trigger with a two-step process you drive:

1. **Send a pre-debit notification**: Notify your customer of the upcoming charge amount before the debit window opens.
2. **Execute the charge**: Trigger the mandate debit after the compliance window elapses. The debit amount must exactly match the notified amount; a mismatch causes the issuing bank to decline the transaction.

<Warning>
  Controlled charging is a two-step flow in which you send the pre-debit notification and trigger the debit. Cashfree does not automatically retry a failed attempt. You must trigger each attempt yourself.
</Warning>

## API endpoints

The following endpoints support the controlled notification and execution flow:

| API                                                                                                                                 | Method                                                                                | Description                                             |
| ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| [Create Controlled Notification](/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-notification)     | `POST /subscriptions/pay/controlled/notify-mandate`                                   | Send a pre-debit notification to the customer           |
| [Fetch Controlled Notification](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notification)       | `GET /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}` | Retrieve a single notification                          |
| [Fetch All Controlled Notifications](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notifications) | `GET /subscriptions/payments/{payment_id}/controlled/notifications`                   | List all notifications for a payment                    |
| [Create Controlled Execution](/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-execution)           | `POST /subscriptions/pay/controlled/execute-mandate`                                  | Trigger the mandate debit after the notification window |
| [Fetch Controlled Execution](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-execution)             | `GET /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}`       | Retrieve a single execution                             |
| [Fetch All Controlled Executions](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-executions)       | `GET /subscriptions/payments/{payment_id}/controlled/executions`                      | List all execution attempts for a payment               |

NPCI enforces blackout windows during which attempts are rejected. When this happens, the error response tells you the next permitted timestamp. Use it rather than retrying blindly.

## Webhooks

Subscribe to both events rather than polling:

* `SUBSCRIPTION_PAYMENT_CONTROLLED_NOTIFICATION_STATUS`: A notification attempt reached a terminal state.
* `SUBSCRIPTION_PAYMENT_CONTROLLED_EXECUTION_STATUS`: A charge attempt reached a terminal state.
