Skip to content

Subscriptions API ​

The Subscriptions API allows you to create and manage recurring billing for your customers.

Build subscription-based revenue models with flexible billing cycles, trial periods, and automatic payment link generation. Perfect for SaaS products, membership sites, and recurring service businesses.

Use Cases

  • SaaS Products: Monthly or yearly software subscriptions
  • Membership Sites: Recurring access to premium content
  • Service Businesses: Retainer agreements and ongoing services
  • Box Subscriptions: Monthly product deliveries

Available Endpoints ​

MethodEndpointDescription
POST/business/subscription/createCreate a subscription
GET/business/subscription/details/:idGet subscription details
POST/business/subscription/cancel/:idCancel a subscription
POST/business/subscription/pause/:idPause a subscription
POST/business/subscription/resume/:idResume a paused subscription
GET/business/subscription/generate-invoice/:idGenerate an invoice manually

Subscription Features ​

  • Flexible Billing Cycles: Weekly, monthly, quarterly, or yearly
  • Trial Periods: Offer free or discounted trial periods
  • Multiple Items: Bundle multiple products in a subscription
  • Automatic Billing: Recurring payments on schedule
  • Payment Links: Auto-generated payment links for collection

Billing Cycles ​

CycleDescription
weeklyBilled every 7 days
monthlyBilled every 30 days
quarterlyBilled every 90 days
yearlyBilled every 365 days

Subscription Statuses ​

StatusDescription
trialIn trial period
activeActively billing
pendingAwaiting payment
cancelledCancelled by user
expiredPast end date
pausedTemporarily paused

Create Subscription ​

Create a new subscription for a customer.

Endpoint ​

http
POST /business/subscription/create

Request Body ​

FieldTypeRequiredDescription
customeridstringYesCustomer ID (must exist)
itemsarrayYesSubscription items (min: 1)
billingcyclestringNoBilling frequency: weekly, monthly, quarterly, yearly
autorenewbooleanNoAuto-renew at end of cycle (default: false)
trialobjectNoTrial period configuration
enddatestringNoSubscription end date (ISO 8601)
paymentmethodstringNoPreferred payment method
remarkstringNoInternal notes

Item Object ​

FieldTypeRequiredDescription
itemidstringYesProduct ID
quantityintegerYesQuantity
ratenumberYesPrice per unit

Trial Object ​

FieldTypeRequiredDescription
startdatestringNoTrial start date (ISO 8601). Defaults to now
enddatestringYesTrial end date (ISO 8601)

Example Request ​

bash
curl -X POST "https://api.cashfin.africa/business/subscription/create" \
  -H "Authorization: cs_your_client_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "customerid": "507f1f77bcf86cd799439011",
    "items": [
      {
        "itemid": "507f191e810c19729de860ea",
        "quantity": 1,
        "rate": 2999.00,
        "title": "Pro Plan"
      }
    ],
    "billingcycle": "monthly",
    "autorenew": true,
    "trial": {
      "startdate": "2024-01-15T00:00:00.000Z",
      "enddate": "2024-01-29T23:59:59.000Z"
    }
  }'
javascript
const subscriptionData = {
  customerid: "507f1f77bcf86cd799439011",
  items: [
    {
      itemid: "507f191e810c19729de860ea",
      quantity: 1,
      rate: 2999.0,
      title: "Pro Plan",
    },
  ],
  billingcycle: "monthly",
  autorenew: true,
  trial: {
    startdate: new Date().toISOString(),
    enddate: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toISOString(),
  },
};

const response = await fetch(
  "https://api.cashfin.africa/business/subscription/create",
  {
    method: "POST",
    headers: {
      Authorization: "cs_your_client_secret",
      "Content-Type": "application/json",
    },
    body: JSON.stringify(subscriptionData),
  }
);

const data = await response.json();
console.log(data);
php
<?php
$subscriptionData = [
  'customerid' => '507f1f77bcf86cd799439011',
  'items' => [
    [
      'itemid' => '507f191e810c19729de860ea',
      'quantity' => 1,
      'rate' => 2999.00,
      'title' => 'Pro Plan'
    ]
  ],
  'billingcycle' => 'monthly',
  'autorenew' => true,
  'trial' => [
    'startdate' => date('c'),
    'enddate' => date('c', strtotime('+14 days'))
  ]
];

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.cashfin.africa/business/subscription/create",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($subscriptionData),
  CURLOPT_HTTPHEADER => [
    "Authorization: cs_your_client_secret",
    "Content-Type: application/json"
  ],
]);

$response = curl_exec($curl);
$result = json_decode($response, true);

print_r($result);
python
import requests
from datetime import datetime, timedelta

subscription_data = {
    'customerid': '507f1f77bcf86cd799439011',
    'items': [
        {
            'itemid': '507f191e810c19729de860ea',
            'quantity': 1,
            'rate': 2999.00,
            'title': 'Pro Plan'
        }
    ],
    'billingcycle': 'monthly',
    'autorenew': True,
    'trial': {
        'startdate': datetime.now().isoformat(),
        'enddate': (datetime.now() + timedelta(days=14)).isoformat()
    }
}

response = requests.post(
    'https://api.cashfin.africa/business/subscription/create',
    headers={
        'Authorization': 'cs_your_client_secret',
        'Content-Type': 'application/json'
    },
    json=subscription_data
)

result = response.json()
print(result)

Success Response ​

json
{
  "success": true,
  "message": "Subscription created successfully",
  "data": {
    "_id": "507f1f77bcf86cd799439020",
    "subscriptionno": "SUB-2024-001",
    "title": "Pro Plan Subscription",
    "status": "trial",
    "amount": 2999.0,
    "billingcycle": "monthly",
    "autorenew": true,
    "trial": {
      "startdate": "2024-01-15T00:00:00.000Z",
      "enddate": "2024-01-29T23:59:59.000Z",
      "activesubscription": true
    },
    "nextbillingdate": "2024-02-15T00:00:00.000Z",
    "paymentlink": {
      "shorturl": "https://pay.cashfin.africa/xyz789"
    },
    "createdat": "2024-01-15T12:00:00.000Z"
  }
}

Get Subscription Details ​

Retrieve detailed information about a specific subscription.

Endpoint ​

http
GET /business/subscription/details/:id

Path Parameters ​

ParameterTypeRequiredDescription
idstringYesSubscription ID (MongoDB ObjectID)

Example Request ​

bash
curl -X GET "https://api.cashfin.africa/business/subscription/details/507f1f77bcf86cd799439020" \
  -H "Authorization: cs_your_client_secret"
javascript
const subscriptionId = "507f1f77bcf86cd799439020";

const response = await fetch(
  `https://api.cashfin.africa/business/subscription/details/${subscriptionId}`,
  {
    headers: {
      Authorization: "cs_your_client_secret",
    },
  }
);

const data = await response.json();
console.log(data);
php
<?php
$subscriptionId = '507f1f77bcf86cd799439020';

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.cashfin.africa/business/subscription/details/{$subscriptionId}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: cs_your_client_secret"
  ],
]);

$response = curl_exec($curl);
$result = json_decode($response, true);

print_r($result);
python
import requests

subscription_id = '507f1f77bcf86cd799439020'

response = requests.get(
    f'https://api.cashfin.africa/business/subscription/details/{subscription_id}',
    headers={
        'Authorization': 'cs_your_client_secret'
    }
)

result = response.json()
print(result)

Success Response ​

json
{
  "success": true,
  "data": {
    "_id": "507f1f77bcf86cd799439020",
    "subscriptionno": "SUB-2024-001",
    "title": "Pro Plan Subscription",
    "status": "active",
    "amount": 2999.0,
    "fees": 0,
    "billingcycle": "monthly",
    "autorenew": true,
    "channel": "api",
    "trial": {
      "startdate": "2024-01-15T00:00:00.000Z",
      "enddate": "2024-01-29T23:59:59.000Z",
      "activesubscription": true
    },
    "customer": {
      "_id": "507f1f77bcf86cd799439011",
      "name": "John Doe",
      "email": "[email protected]",
      "phone": "+254712345678"
    },
    "items": [
      {
        "itemid": "507f191e810c19729de860ea",
        "title": "Pro Plan",
        "quantity": 1,
        "rate": 2999.0,
        "amount": 2999.0
      }
    ],
    "nextbillingdate": "2024-02-15T00:00:00.000Z",
    "paymentlink": {
      "shorturl": "https://pay.cashfin.africa/xyz789",
      "qrcode": "data:image/png;base64,..."
    },
    "createdat": "2024-01-15T12:00:00.000Z",
    "updatedat": "2024-01-15T12:00:00.000Z"
  }
}


Cancel Subscription ​

Cancel an active subscription. Once cancelled, it cannot be reactivated.

Endpoint ​

http
POST /business/subscription/cancel/:id

Path Parameters ​

ParameterTypeRequiredDescription
idstringYesSubscription ID (MongoDB ObjectID)

Request Body ​

FieldTypeRequiredDescription
reasonstringNoReason for cancellation

Example Request ​

bash
curl -X POST "https://api.cashfin.africa/business/subscription/cancel/507f1f77bcf86cd799439020" \
  -H "Authorization: cs_your_client_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Customer requested cancellation"
  }'
javascript
const subscriptionId = "507f1f77bcf86cd799439020";

const response = await fetch(
  `https://api.cashfin.africa/business/subscription/cancel/${subscriptionId}`,
  {
    method: "POST",
    headers: {
      Authorization: "cs_your_client_secret",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      reason: "Customer requested cancellation",
    }),
  }
);

const data = await response.json();
python
import requests

subscription_id = '507f1f77bcf86cd799439020'

response = requests.post(
    f'https://api.cashfin.africa/business/subscription/cancel/{subscription_id}',
    headers={'Authorization': 'cs_your_client_secret'},
    json={'reason': 'Customer requested cancellation'}
)

result = response.json()

Success Response ​

json
{
  "success": true,
  "message": "Subscription cancelled successfully"
}

Pause Subscription ​

Temporarily pause an active subscription. Billing stops until the subscription is resumed.

Endpoint ​

http
POST /business/subscription/pause/:id

Path Parameters ​

ParameterTypeRequiredDescription
idstringYesSubscription ID (MongoDB ObjectID)

Example Request ​

bash
curl -X POST "https://api.cashfin.africa/business/subscription/pause/507f1f77bcf86cd799439020" \
  -H "Authorization: cs_your_client_secret"
javascript
const response = await fetch(
  `https://api.cashfin.africa/business/subscription/pause/${subscriptionId}`,
  {
    method: "POST",
    headers: { Authorization: "cs_your_client_secret" },
  }
);
python
response = requests.post(
    f'https://api.cashfin.africa/business/subscription/pause/{subscription_id}',
    headers={'Authorization': 'cs_your_client_secret'}
)

Success Response ​

json
{
  "success": true,
  "message": "Subscription paused successfully"
}

Resume Subscription ​

Resume a paused subscription. Billing resumes from the next billing cycle.

Endpoint ​

http
POST /business/subscription/resume/:id

Path Parameters ​

ParameterTypeRequiredDescription
idstringYesSubscription ID (MongoDB ObjectID)

Example Request ​

bash
curl -X POST "https://api.cashfin.africa/business/subscription/resume/507f1f77bcf86cd799439020" \
  -H "Authorization: cs_your_client_secret"
javascript
const response = await fetch(
  `https://api.cashfin.africa/business/subscription/resume/${subscriptionId}`,
  {
    method: "POST",
    headers: { Authorization: "cs_your_client_secret" },
  }
);
python
response = requests.post(
    f'https://api.cashfin.africa/business/subscription/resume/{subscription_id}',
    headers={'Authorization': 'cs_your_client_secret'}
)

Success Response ​

json
{
  "success": true,
  "message": "Subscription resumed successfully"
}

Generate Subscription Invoice ​

Manually generate a new invoice for an active subscription, outside of the normal billing cycle.

Endpoint ​

http
GET /business/subscription/generate-invoice/:id

Path Parameters ​

ParameterTypeRequiredDescription
idstringYesSubscription ID (MongoDB ObjectID)

Requirements

The subscription must have active status. Paused, cancelled, or trial subscriptions cannot have invoices manually generated.

Example Request ​

bash
curl -X GET "https://api.cashfin.africa/business/subscription/generate-invoice/507f1f77bcf86cd799439020" \
  -H "Authorization: cs_your_client_secret"
javascript
const response = await fetch(
  `https://api.cashfin.africa/business/subscription/generate-invoice/${subscriptionId}`,
  {
    headers: { Authorization: "cs_your_client_secret" },
  }
);

const data = await response.json();
python
response = requests.get(
    f'https://api.cashfin.africa/business/subscription/generate-invoice/{subscription_id}',
    headers={'Authorization': 'cs_your_client_secret'}
)

Success Response ​

json
{
  "success": true,
  "message": "Invoice generated successfully",
  "data": {
    "invoice": {
      "_id": "507f1f77bcf86cd799439030",
      "invoiceno": "INV-2024-005",
      "status": "unpaid",
      "balance": 2999.0,
      "duedate": "2024-02-15T00:00:00Z"
    },
    "paymentlink": "https://yourbusiness.cashfin.africa/pay/xyz789"
  }
}

Subscription Lifecycle ​

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Created   │────►│   Trial     │────►│   Active    │
└─────────────┘     └─────────────┘     └──────┬──────┘
                           │                    │
                           │               ┌────▼────┐
                           │               │ Paused  │
                           │               └────┬────┘
                           │                    │
                           │            ┌───────▼─────┐
                           └───────────►│  Cancelled  │
                                        └─────────────┘
                                               │
                                               ▼
                                        ┌─────────────┐
                                        │   Expired   │
                                        └─────────────┘

Error Responses ​

Customer Not Found ​

json
{
  "success": false,
  "message": "Customer not found"
}

Invalid Subscription ID ​

json
{
  "success": false,
  "message": "Invalid subscription ID"
}

Subscription Not Found ​

json
{
  "success": false,
  "message": "Subscription not found"
}

Cashfin Business API Documentation