Skip to main content
The Cashfree subscription element SDK lets you build a fully custom subscription payment experience within your iOS application. Unlike the hosted checkout, you collect payment details directly in your own UI and pass them to the SDK, giving you complete control over the appearance and behaviour of your payment flow. The SDK supports three payment methods for subscriptions: card, UPI, and eNach (electronic National Automated Clearing House, also known as net banking).

Prerequisites

Complete the following tasks before you start the integration: The integration consists of three steps:

Step 1

Create a subscription

Step 2

Open the payment page

Step 3

Confirm the payment

Step 1: Create a subscription Server-side

Create a subscription from your backend server before you process any payment.
This API requires your secret key. Create subscriptions through your server only. Do not call this API directly from your mobile application.
After the subscription is created, your backend receives a subscription_id and a subscription_session_id. Pass both values to your iOS client to proceed with the payment.
The following example shows how to create a subscription using the Create Subscription API:
A successful response returns the subscription_id and subscription_session_id. Use these values to build the CFSubscriptionSession object in Step 2. The API returns the following response on success:
For the full list of request parameters and response fields, see the Create Subscription API.

Step 2: Open the payment page Client-side

After you create the subscription, open the payment page so the customer can provide payment details.

1. Set up the SDK

The Cashfree iOS SDK is available on CocoaPods. The latest integration version is 2.4.0. The SDK requires iOS 13.0 or higher. You can also integrate via Swift Package Manager (SPM) or a manual framework. See the iOS SDK on GitHub for those options. Add the following to your Podfile:
Run pod install to install the dependency.

2. Select a payment method

The Subscription Element SDK supports the following payment methods:
In this flow, the customer enters their card details directly in your application UI. The SDK securely processes the card payment and initiates the subscription mandate. Use .setChannel("link") on the card builder for the standard link-based card flow.

3. Complete the payment

To complete the payment, follow these steps:
  1. Create a CFSubscriptionSession object.
  2. Create the payment object for the selected payment method.
  3. Set up the payment callback.
  4. Initiate the payment using doSubsPayment().

Create a session

The CFSubscriptionSession object holds the session context for the payment. It accepts the subscription_session_id and subscription_id obtained from Step 1, and the Cashfree environment (.SANDBOX or .PRODUCTION). Set the environment to .SANDBOX for testing or .PRODUCTION for live payments. The following example shows how to create the session object:

Create a payment object

The SDK provides a dedicated payment builder for each supported payment method. Build only the object that corresponds to the payment method your customer has selected.
Use the following builders to create a card payment object. Collect card details securely from user input. Do not hardcode values in production.
For non-PCI merchants who must not handle raw card numbers, use CFSubsCardComponent instead of .setCardNumber(). See iOS Custom Card Component.

Set up the payment callback

The SDK exposes the CFResponseDelegate protocol to receive callbacks when the subscription payment journey ends. This protocol consists of two methods:
Register the callback on CFPaymentGatewayService before you call doSubsPayment. Set paymentService.setCallback(self) in your view controller before initiating payment.
The following example shows how to implement the callback:
Backend verification is mandatory. The SDK signals that the payment UI flow ended, not that payment succeeded. Always verify payment status from your backend before presenting success.

Initiate the payment

Call doSubsPayment() when the customer taps the pay button. The following example uses subsNBPayment. Replace it with subsCardPayment or subsUpiPayment for your selected payment method. The following code registers the callback and initiates the subscription payment:

Sample code

The following example shows a complete card payment flow, including session creation, payment object setup, callback registration, and payment initiation.
The following method demonstrates a complete card payment integration:
Refer to the sample integration on GitHub for a working end-to-end implementation.

Step 3: Confirm the payment Server-side

After the SDK delivers a callback via verifyPayment, confirm the payment status from your backend before taking any action. The SDK callback signals only that the payment flow has ended. It does not guarantee a successful payment. Use the Fetch Details of All Payments of a Subscription API to retrieve the current payment status.
The following request fetches all payments for a subscription:
A successful response returns an array of payment objects. Check the payment_status field to determine the outcome. The API returns the following response on success:
Always verify the subscription status from your backend before delivering goods or services to the customer. Proceed only when payment_status is SUCCESS.

Error codes

If a required field or object is missing when you initiate payment, the SDK returns an error through the catch block or onError callback. The following table lists common SDK-level validation errors and when they occur.
The SDK validation errors are grouped by category as follows:

Session errors

These errors occur when the CFSubscriptionSession object or its required fields are not provided.

Payment method object errors

These errors occur when a payment method object is absent or one of its required fields is not set.

Callback errors

These errors occur when the payment callback is not registered before initiating payment.

Other options

The following optional configurations let you customise the payment screen behaviour.
To present the payment flow in full screen, call setFullScreen(true) on the payment object before you call doSubsPayment():