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

The controlled payment flow for UPI mandate subscriptions gives 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/previous/v2025-01-01/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/previous/v2025-01-01/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/previous/v2025-01-01/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/previous/v2025-01-01/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/previous/v2025-01-01/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/previous/v2025-01-01/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_CONTROLLED_NOTIFICATION_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_controlled_notification_status): A notification attempt reached a terminal state.
* [`SUBSCRIPTION_CONTROLLED_EXECUTION_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_controlled_execution_status): A charge attempt reached a terminal state.
