Skip to content

Subscriptions in Cashfree

This document provides a detailed description for creating subscriptions used for integrating with Cashfree Payments - Subscription APIs (v2025-01-01), including data flow, constraints, validation, and backend responsibilities.


When creating a subscription using Cashfree APIs, the system must:

  1. Collect subscription details from frontend (customer, plan, authorization).
  2. Validate and store the data internally.
  3. Generate a unique subscription_id.
  4. Prepare the Cashfree-compliant payload.
  5. Send the API request and store the returned status and metadata.
  6. Handle authorization flow (mandate creation).
  7. Track subscription lifecycle and payment schedules.

Key Characteristics:

  • Mandate-based: Requires authorization (eNACH, pNACH, UPI, Card) before recurring charges.
  • Plan Types: Supports PERIODIC (fixed intervals) and ON_DEMAND (variable amounts) plans.
  • Multiple Payment Methods: eNACH, pNACH, UPI, and Card for authorization.
  • Async Authorization: Authorization process is async, requires status tracking.
  • Payment Scheduling: Automatic payment processing based on plan configuration.

Step 1 — Frontend Input (Raw User Inputs)

Section titled “Step 1 — Frontend Input (Raw User Inputs)”
{
"customer_name": "John Doe",
"customer_email": "[email protected]",
"customer_phone": "9908730221",
"customer_bank_account_number": "59108290701802",
"customer_bank_ifsc": "HDFC0002614",
"customer_bank_code": "HDFC",
"customer_bank_account_type": "SAVINGS",
"plan_name": "Monthly Premium",
"plan_type": "PERIODIC",
"plan_amount": 1000.0,
"plan_max_amount": 5000.0,
"plan_max_cycles": 12,
"plan_intervals": 1,
"plan_interval_type": "MONTH",
"authorization_amount": 1.0,
"payment_methods": ["enach", "upi", "card"]
}

Step 2 — Backend Validates & Stores Preliminary Data

Section titled “Step 2 — Backend Validates & Stores Preliminary Data”
  • Validate customer details (email, phone, bank details if provided).
  • Validate plan configuration (amounts, intervals, cycles).
  • Validate authorization details.
  • Create DB entry with status = INITIALIZED.

Mapped fields:

  • Customer details → customer_details
  • Plan configuration → plan_details
  • Authorization → authorization_details
  • Metadata → subscription_meta
  • System-generated → subscription_id

POST /pg/subscriptions

Save:

  • cf_subscription_id (Cashfree’s unique subscription ID)
  • subscription_status
  • subscription_session_id (for authorization flow)
  • authorisation_details (authorization status and payment method details)
  • next_schedule_date (for PERIODIC plans)
  • Redirect customer to authorization URL (if link-based).
  • Handle webhook callbacks for authorization status.
  • Update subscription status based on authorization result.

ColumnTypeDescriptionNotes
idBIGINT PKInternal unique customer IDAuto-increment
customer_nameVARCHARCustomer’s display nameFrom frontend
customer_emailVARCHARCustomer emailUnique, required
customer_phoneVARCHARCustomer phoneRequired
customer_bank_account_numberVARCHARBank account numberOptional
customer_bank_ifscVARCHARIFSC codeOptional
customer_bank_codeVARCHARBank codeOptional
customer_bank_account_typeVARCHARAccount type (SAVINGS/CURRENT)Optional
customer_bank_account_holder_nameVARCHARAccount holder nameOptional, max 40 chars
created_atTIMESTAMPRow creation timeAuto
updated_atTIMESTAMPRow update timeAuto

The customers table stores customer information. Can be reused across multiple subscriptions.


ColumnTypeDescriptionNotes
idBIGINT PKInternal primary keyAuto-increment
plan_idVARCHAR UNIQUEUnique plan identifierMerchant-provided or generated
plan_nameVARCHARPlan nameRequired
plan_typeVARCHARPERIODIC or ON_DEMANDRequired
plan_currencyVARCHARCurrency codeDefault: INR
plan_amountDECIMAL(18,2)Recurring amount (PERIODIC)Required for PERIODIC
plan_max_amountDECIMAL(18,2)Maximum amount per chargeRequired
plan_max_cyclesINTEGERMaximum payment cycles0 for unlimited (ON_DEMAND)
plan_intervalsINTEGERNumber of intervalsRequired for PERIODIC
plan_interval_typeVARCHARDAY/WEEK/MONTH/YEARRequired for PERIODIC
plan_noteTEXTPlan description/notesOptional
plan_statusVARCHARACTIVE/INACTIVEDefault: ACTIVE
created_atTIMESTAMPAuto
updated_atTIMESTAMPAuto
  • Plans can be reused across multiple subscriptions.
  • plan_id should be unique and stable.
  • For ON_DEMAND plans: plan_amount = 0, plan_max_cycles = 0.

ColumnTypeDescriptionNotes
idBIGINT PKInternal primary keyAuto-increment
customer_idBIGINT FKFK → customers.idRequired
plan_idBIGINT FKFK → plans.idRequired
subscription_idVARCHAR UNIQUEUnique ID sent to CashfreeMust never change once created
cf_subscription_idVARCHARCashfree’s subscription IDFrom Cashfree response
subscription_statusVARCHARSubscription statusINITIALIZED/ACTIVE/PAUSED/CANCELLED/etc
subscription_session_idVARCHARSession ID for authorizationFrom Cashfree response
authorization_statusVARCHARAuthorization statusINITIALIZED/SUCCESS/FAILED
authorization_amountDECIMAL(18,2)Authorization amountUsually 1.0
authorization_amount_refundBOOLEANWhether to refund auth amountDefault: false
payment_groupVARCHARPayment method groupenach/pnach/upi/card
payment_method_detailsJSONPayment method specific detailsFrom Cashfree response
subscription_expiry_timeTIMESTAMPSubscription expiryFrom Cashfree
subscription_first_charge_timeTIMESTAMPFirst charge time (PERIODIC)From Cashfree
next_schedule_dateTIMESTAMPNext payment scheduleFrom Cashfree, null for ON_DEMAND
return_urlVARCHARReturn URL after authorizationOptional
notification_channelJSONNotification preferencesEMAIL/SMS
session_id_expiryTIMESTAMPAuthorization session expiryFrom Cashfree
subscription_tagsJSONCustom tagsOptional
subscription_noteTEXTSubscription notesOptional
raw_requestJSONFull request payloadHelpful for audits
raw_responseJSONFull Cashfree responseHelpful for audits
created_atTIMESTAMPAuto
updated_atTIMESTAMPAuto
  • subscription_id must be unique, stable, deterministic (max length varies).
  • Link to customers and plans tables via foreign keys.
  • Store complete authorization details for mandate tracking.
  • next_schedule_date is null for ON_DEMAND plans.

3.4 Subscription Payments Table (Optional)

Section titled “3.4 Subscription Payments Table (Optional)”
ColumnTypeDescriptionNotes
idBIGINT PKInternal primary keyAuto-increment
subscription_idBIGINT FKFK → subscriptions.idRequired
payment_idVARCHARCashfree payment IDFrom Cashfree
payment_amountDECIMAL(18,2)Payment amount
payment_statusVARCHARPayment statusSUCCESS/FAILED/PENDING
payment_utrVARCHARUnique Transaction ReferenceFrom bank/Cashfree
scheduled_dateTIMESTAMPScheduled payment date
processed_atTIMESTAMPActual processing time
cycle_numberINTEGERPayment cycle number1, 2, 3, etc.
raw_responseJSONFull payment responseHelpful for audits
created_atTIMESTAMPAuto
updated_atTIMESTAMPAuto

Track individual payment attempts within a subscription for reconciliation and reporting.


Characteristics:

  • Fixed recurring amount at regular intervals.
  • Automatic payment processing.
  • Requires plan_amount, plan_intervals, plan_interval_type.

Example Configuration:

{
"plan_type": "PERIODIC",
"plan_amount": 1000.0,
"plan_max_amount": 1000.0,
"plan_max_cycles": 12,
"plan_intervals": 1,
"plan_interval_type": "MONTH"
}

Interval Types:

  • DAY: Daily subscriptions
  • WEEK: Weekly subscriptions
  • MONTH: Monthly subscriptions
  • YEAR: Yearly subscriptions

Use Cases:

  • Monthly membership fees
  • Weekly service charges
  • Annual subscription plans

Characteristics:

  • Variable payment amounts (up to plan_max_amount).
  • Manual or API-triggered charges.
  • No automatic scheduling.

Example Configuration:

{
"plan_type": "ON_DEMAND",
"plan_amount": 0.0,
"plan_max_amount": 50000.0,
"plan_max_cycles": 0,
"plan_intervals": 0,
"plan_interval_type": ""
}

Use Cases:

  • Variable utility bill payments
  • Top-up services
  • Pay-as-you-go models

Payment MethodDescriptionChannel TypeAuthorization Flow
enachElectronic NACH (eMandate)linkRedirect to NetBanking for mandate
pnachPhysical NACH (Paper mandate)postUpload physical mandate form
upiUPI AutoPaycollectUPI authorization via app
cardCard TokenizationlinkCard authorization via payment page
  • Purpose: Verify mandate and validate bank account/card.
  • Typical Value: 1.0 (INR 1)
  • Refund Option: authorization_amount_refund: true to refund after successful authorization.
  1. Customer redirected to NetBanking authorization page.
  2. Customer authenticates and approves mandate.
  3. Webhook callback with authorization status.
  4. Subscription status updated to ACTIVE on success.
  1. Physical mandate form uploaded via API.
  2. Cashfree processes the form.
  3. Webhook callback when mandate is registered.
  4. Subscription status updated accordingly.
  1. UPI authorization request sent to customer’s UPI app.
  2. Customer approves in UPI app.
  3. Webhook callback with authorization status.
  1. Customer redirected to card authorization page.
  2. Customer enters card details and approves.
  3. Card tokenized and stored.
  4. Webhook callback with authorization status.

5.4 UI Flow for Subscription Authorization

Section titled “5.4 UI Flow for Subscription Authorization”

Important: The authorization UI flow is identical for both PERIODIC and ON_DEMAND plans. The plan type only affects how payments are triggered after authorization, not the authorization process itself.

  • User fills subscription form (customer details, plan selection).
  • Frontend sends request to your backend.
  • Backend calls Cashfree API: POST /pg/subscriptions
  • Response received with subscription_status: "INITIALIZED" and authorisation_details

3. Authorization UI (Based on Payment Method)

Section titled “3. Authorization UI (Based on Payment Method)”

For eNACH (Link-based):

User's Browser → Your Backend → Cashfree API
Response with authorization URL
User's Browser ← Redirect to Cashfree NetBanking Page
User authenticates and approves mandate
User's Browser ← Redirect back to YOUR APP's return_url
Your App's return_url endpoint → Verify status via API
Webhook → Your Backend (authorization status - more reliable)

What User Sees:

  • Redirected to Cashfree-hosted NetBanking page
  • User logs into their bank account
  • User approves the mandate/eMandate
  • Redirected back to your return_url

For Card (Link-based):

User's Browser → Your Backend → Cashfree API
Response with authorization URL
User's Browser ← Redirect to Cashfree Card Authorization Page
User enters card details and approves
User's Browser ← Redirect back to YOUR APP's return_url
Your App's return_url endpoint → Verify status via API
Webhook → Your Backend (authorization status - more reliable)

What User Sees:

  • Redirected to Cashfree-hosted card payment page
  • User enters card number, CVV, expiry
  • User approves authorization
  • Redirected back to your return_url

For UPI (Collect-based):

User's Browser → Your Backend → Cashfree API
Response with UPI authorization details
User's Browser ← Shows "Approve in UPI App" message
User's UPI App ← Receives collect request
User approves in UPI app
Webhook → Your Backend (authorization status)

What User Sees:

  • No redirect to Cashfree UI
  • UPI collect request appears in user’s UPI app (PhonePe, Google Pay, etc.)
  • User approves in UPI app
  • Your frontend can poll or wait for webhook to update status

For pNACH (Physical):

User's Browser → Your Backend → Cashfree API
Response with subscription_id
User uploads physical mandate form (separate API call)
Cashfree processes form (async, can take days)
Webhook → Your Backend (authorization status)

What User Sees:

  • No immediate UI interaction
  • Physical form upload happens separately
  • Status updates via webhook when processed

After Successful Authorization:

For PERIODIC Plans:

  • Show success message: “Subscription activated! First payment scheduled for [date]”
  • Display subscription details and next payment date
  • Payments happen automatically - no further UI needed

For ON_DEMAND Plans:

  • Show success message: “Authorization successful! You can now make payments.”
  • Display subscription details
  • Important: No automatic payments - user or your system must trigger charges via API
  • Show “Make Payment” button or trigger charges programmatically

For Link-based Methods (eNACH, Card):

The authorization URL is typically constructed using:

  • subscription_session_id from the response
  • Cashfree’s authorization endpoint

Example Flow:

// Backend receives response
const response = {
subscription_session_id: "subs_token_tc9JCN4MzUIJ",
authorisation_details: {
payment_group: "enach",
// ... other details
},
};
// Construct authorization URL
const authUrl = `https://payments.cashfree.com/subscription/auth/${response.subscription_session_id}`;
// Redirect user
window.location.href = authUrl;
AspectPERIODICON_DEMAND
Authorization UISame (eNACH/Card/UPI/pNACH)Same (eNACH/Card/UPI/pNACH)
After AuthorizationAutomatic payments startManual/API-triggered payments
User Action After AuthNone (automatic)Trigger charges when needed
UI After AuthShow schedule, wait for paymentsShow “Pay Now” or trigger via API
  1. ON_DEMAND subscriptions still require authorization - the mandate must be created before any charges can be made.

  2. Authorization is one-time - once authorized, you can make multiple charges (up to plan_max_amount) without additional UI interaction.

  3. No Cashfree UI for charges - After authorization, ON_DEMAND charges are triggered via API calls. There’s no payment page for individual charges.

  4. Return URL handling - The return_url is your application’s URL where Cashfree redirects the user after authorization (for link-based methods like eNACH and Card).

    Implementation:

    // In your subscription creation request
    {
    "subscription_meta": {
    "return_url": "https://yourapp.com/subscription/authorization/return"
    }
    }

    Handle the return in your app:

    // Example: /subscription/authorization/return endpoint
    // Cashfree will redirect here with query parameters
    // GET /subscription/authorization/return?subscription_id=SUB_42_1702259812&status=SUCCESS
    // Your backend should:
    // 1. Extract subscription_id from query params
    // 2. Verify authorization status via Cashfree API or webhook
    // 3. Update your database
    // 4. Show appropriate UI (success/failure page)
    // Example backend handler:
    app.get("/subscription/authorization/return", async (req, res) => {
    const { subscription_id, status } = req.query;
    // Verify status with Cashfree API
    const subscription = await cashfree.getSubscription(subscription_id);
    // Update your database
    await db.updateSubscription(subscription_id, {
    subscription_status: subscription.subscription_status,
    authorization_status:
    subscription.authorisation_details.authorization_status,
    });
    // Redirect to frontend success/failure page
    if (
    subscription.authorisation_details.authorization_status === "SUCCESS"
    ) {
    res.redirect(`/subscription/success?subscription_id=${subscription_id}`);
    } else {
    res.redirect(`/subscription/failed?subscription_id=${subscription_id}`);
    }
    });

    Important:

    • The return_url must be publicly accessible (not localhost in production)
    • Cashfree will append query parameters to your URL
    • Always verify the authorization status via API call, don’t trust query params alone
    • Webhooks are more reliable than return_url for status updates (use both)

  1. Validate customer, plan, and authorization details.
  2. Generate unique subscription_id.
  3. Save subscription → status = INITIALIZED.
  4. Call Cashfree API.
  5. Update:
    • cf_subscription_id
    • subscription_status
    • subscription_session_id
    • authorisation_details
    • next_schedule_date (if PERIODIC)

If authorization is link-based (eNACH, Card):

  • Store subscription_session_id.
  • Redirect customer to authorization URL.
  • Handle return via return_url.
  • Process webhook for final authorization status.

If authorization is collect-based (UPI):

  • Store authorization details.
  • Wait for webhook callback.
  • Update subscription status on webhook.

If authorization is post-based (pNACH):

  • Upload physical mandate form separately.
  • Wait for webhook callback after processing.

Common subscription statuses:

  • INITIALIZED: Subscription created, authorization pending
  • ACTIVE: Authorization successful, subscription active
  • PAUSED: Subscription paused (can be resumed)
  • CANCELLED: Subscription cancelled
  • COMPLETED: All cycles completed or expired
  • EXPIRED: Subscription expired

If frontend retries:

  • Use the same subscription_id to prevent duplicate subscriptions.
  • Check if subscription_id already exists in database.
  • If exists, return existing subscription record.

For PERIODIC plans:

  • Cashfree automatically processes payments based on schedule.
  • Webhook callbacks for each payment attempt.
  • Update next_schedule_date after each payment.

For ON_DEMAND plans:

  • Trigger charges via API when needed.
  • Use subscription ID to initiate charges.
  • Track each charge separately.

{
"subscription_id": "SUB_42_1702259812",
"customer_details": {
"customer_name": "John Doe",
"customer_email": "[email protected]",
"customer_phone": "9908730221",
"customer_bank_account_number": "59108290701802",
"customer_bank_ifsc": "HDFC0002614",
"customer_bank_code": "HDFC",
"customer_bank_account_type": "SAVINGS"
},
"plan_details": {
"plan_name": "Monthly Premium Plan",
"plan_type": "PERIODIC",
"plan_amount": 1000.0,
"plan_max_amount": 1000.0,
"plan_max_cycles": 12,
"plan_intervals": 1,
"plan_currency": "INR",
"plan_interval_type": "MONTH",
"plan_note": "Monthly subscription for premium features"
},
"authorization_details": {
"authorization_amount": 1.0,
"authorization_amount_refund": true,
"payment_methods": ["enach", "upi", "card"]
},
"subscription_meta": {
"return_url": "https://yourapp.com/subscription/return",
"notification_channel": ["EMAIL", "SMS"],
"session_id_expiry": "2025-06-01T23:00:08+05:30"
},
"subscription_expiry_time": "2026-12-31T23:59:59+05:30",
"subscription_first_charge_time": "2025-02-01T10:00:00+05:30",
"subscription_tags": {
"psp_note": "Monthly subscription payment",
"plan_tier": "premium"
}
}
{
"subscription_id": "SUB_42_1702259813",
"customer_details": {
"customer_name": "Jane Smith",
"customer_email": "[email protected]",
"customer_phone": "9876543210"
},
"plan_details": {
"plan_name": "On Demand Utility Plan",
"plan_type": "ON_DEMAND",
"plan_amount": 0.0,
"plan_max_amount": 50000.0,
"plan_max_cycles": 0,
"plan_intervals": 0,
"plan_currency": "INR",
"plan_interval_type": "",
"plan_note": "Variable amount utility payments"
},
"authorization_details": {
"authorization_amount": 1.0,
"authorization_amount_refund": true,
"payment_methods": ["enach", "upi"]
},
"subscription_meta": {
"return_url": "https://yourapp.com/subscription/return",
"notification_channel": ["EMAIL"]
},
"subscription_expiry_time": "2100-01-01T23:59:59+05:30"
}
{
"subscription_id": "SUB_42_1702259812",
"cf_subscription_id": "4",
"subscription_status": "INITIALIZED",
"subscription_session_id": "subs_token_tc9JCN4MzUIJ",
"authorisation_details": {
"authorization_amount": 1.0,
"authorization_amount_refund": false,
"authorization_reference": "",
"authorization_time": "2025-06-01T23:47:52+05:30",
"authorization_status": "INITIALIZED",
"payment_id": "97877",
"payment_group": "enach",
"payment_method": {
"enach": {
"channel": "link",
"auth_mode": "NetBanking",
"account_type": "SAVINGS",
"account_number": "123456789012",
"account_ifsc": "SBIN0000123",
"account_holder_name": "John Doe",
"account_bank_code": "SBIN"
}
}
},
"customer_details": {
"customer_name": "John Doe",
"customer_email": "[email protected]",
"customer_phone": "9900755700"
},
"plan_details": {
"plan_name": "Monthly Premium Plan",
"plan_type": "PERIODIC",
"plan_amount": 1000.0,
"plan_max_amount": 1000.0,
"plan_max_cycles": 12,
"plan_intervals": 1,
"plan_interval_type": "MONTH",
"plan_currency": "INR"
},
"next_schedule_date": "2025-02-01T10:00:00+05:30",
"subscription_expiry_time": "2026-12-31T23:59:59+05:30",
"subscription_first_charge_time": "2025-02-01T10:00:00+05:30",
"subscription_meta": {
"return_url": "https://yourapp.com/subscription/return"
}
}
{
"subscription_id": "SUB_42_1702259814",
"cf_subscription_id": "5",
"subscription_status": "INITIALIZED",
"subscription_session_id": "subs_token_xyz123",
"authorisation_details": {
"authorization_amount": 1.0,
"authorization_amount_refund": false,
"authorization_status": "INITIALIZED",
"payment_id": "97878",
"payment_group": "upi",
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "test@upi",
"upi_instrument": "upiInstrument",
"upi_instrument_number": "1234567890",
"upi_payer_account_number": "039861903074",
"upi_payer_ifsc": "SBIN0001234"
}
}
},
"customer_details": {
"customer_name": "Jane Smith",
"customer_email": "[email protected]",
"customer_phone": "9876543210"
},
"plan_details": {
"plan_name": "Weekly Service Plan",
"plan_type": "PERIODIC",
"plan_amount": 500.0,
"plan_max_amount": 500.0,
"plan_max_cycles": 52,
"plan_intervals": 1,
"plan_interval_type": "WEEK",
"plan_currency": "INR"
},
"next_schedule_date": "2025-02-08T10:00:00+05:30",
"subscription_expiry_time": "2026-12-31T23:59:59+05:30"
}

  • Link-based (eNACH, Card): Customer must complete authorization via redirect.
  • Collect-based (UPI): Authorization happens via UPI app, no redirect needed.
  • Post-based (pNACH): Requires separate file upload API call.
  • session_id_expiry sets when authorization session expires.
  • Customer must complete authorization before expiry.
  • Extend session if needed or create new subscription.
  • subscription_expiry_time sets when subscription expires.
  • Set far in future (e.g., 2100-01-01) for long-term subscriptions.
  • Expired subscriptions cannot process new payments.
  • subscription_first_charge_time applies only to PERIODIC plans.
  • Must be in the future.
  • Subsequent charges calculated based on plan_interval_type.
  • If multiple payment_methods provided, Cashfree selects based on availability.
  • Customer may choose preferred method during authorization.
  • Store selected method for future reference.
  • For TPV transactions, customer_bank_account_holder_name is mandatory.
  • At least one of customer_bank_code or customer_bank_ifsc required.
  • Helps verify account ownership.
  • EMAIL: Email notifications for subscription events.
  • SMS: SMS notifications for subscription events.
  • Can specify both for comprehensive notifications.
  • Optional subscription_payment_splits for vendor splits.
  • Specify vendor_id and percentage.
  • Applies to all payments in the subscription.
  • return_url is YOUR application’s URL - not Cashfree’s URL.
  • Cashfree redirects users back to this URL after authorization (for link-based methods).
  • Must be publicly accessible (HTTPS in production).
  • Example: https://yourapp.com/subscription/authorization/return
  • Cashfree appends query parameters: ?subscription_id=SUB_XXX&status=SUCCESS
  • Always verify status via API - don’t trust query parameters alone for security.
  • Webhooks are more reliable for status updates (use both return_url and webhooks).

Endpoint: POST /pg/subscriptions

Base URLs:

  • Sandbox: https://sandbox.cashfree.com/pg
  • Production: https://api.cashfree.com/pg

Required Headers:

  • x-api-version: 2025-01-01 (or latest)
  • x-client-id: <api-key>
  • x-client-secret: <api-key>
  • Content-Type: application/json

Optional Headers:

  • x-request-id: <unique-request-id> (for tech support)

Endpoint: GET /pg/subscriptions/{subscription_id}

Use this to check the current status of a subscription.

Endpoint: POST /pg/subscriptions/{subscription_id}

Use this to pause, resume, or cancel a subscription.


HTTP StatusStatusDescriptionNext Action
200INITIALIZEDSubscription created, authorization pendingRedirect customer to authorization or wait for webhook
200ACTIVESubscription active, payments processingMonitor payments via webhooks
400-Bad request (validation error)Check request payload and fix validation errors
401-Unauthorized (authentication error)Verify API credentials
404-Resource not foundVerify subscription_id or plan_id
422-Unprocessable entity (business logic error)Check plan configuration and constraints
429-Rate limit exceededRetry after rate limit window
500-Internal server errorRetry with exponential backoff

INITIALIZED → (Authorization Success) → ACTIVE
INITIALIZED → (Authorization Failed) → CANCELLED
ACTIVE → (Pause Request) → PAUSED
PAUSED → (Resume Request) → ACTIVE
ACTIVE → (Cancel Request) → CANCELLED
ACTIVE → (All Cycles Complete) → COMPLETED
ACTIVE → (Expiry Time Reached) → EXPIRED
  • INITIALIZED: Authorization initiated
  • SUCCESS: Authorization completed successfully
  • FAILED: Authorization failed
  • PENDING: Authorization in progress

  • subscription.authorized: Authorization successful
  • subscription.authorization_failed: Authorization failed
  • subscription.payment_success: Payment processed successfully
  • subscription.payment_failed: Payment failed
  • subscription.payment_pending: Payment pending
  • subscription.activated: Subscription activated
  • subscription.paused: Subscription paused
  • subscription.resumed: Subscription resumed
  • subscription.cancelled: Subscription cancelled
  • subscription.completed: Subscription completed
  • subscription.expired: Subscription expired

Important: Implement webhook signature verification for security.