Paystack subscriptions
24 AI agent skills for Paystack API integration — automate payment workflows with TypeScript, Node.js, and Next.js
npx -y skills add rexedge/paystack --skill paystack-subscriptionsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Paystack Subscriptions API — create, list, fetch, enable, disable subscriptions and manage card update links. Use this skill whenever implementing recurring billing, subscribing customers to plans, enabling or disabling auto-renewal, generating card update links for expiring cards, or handling subscription lifecycle events. Also use when you see references to subscription_code, SUB_ prefixed codes, email_token, or the /subscription endpoint.
SKILL.md
6.0 KB, as published. Nobody here has run it
Paystack Subscriptions
The Subscriptions API lets you create and manage recurring payments. A subscription links a customer to a plan and charges them automatically at the plan's interval.
Depends on: paystack-setup for the
paystackRequesthelper.
Related: paystack-plans for creating plans, paystack-customers for customer management.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| POST | /subscription | Create a subscription |
| GET | /subscription | List subscriptions |
| GET | /subscription/:id_or_code | Fetch a subscription |
| POST | /subscription/enable | Enable a subscription |
| POST | /subscription/disable | Disable a subscription |
| GET | /subscription/:code/manage/link | Generate card update link |
| POST | /subscription/:code/manage/email | Email card update link |
Create Subscription
POST /subscription
| Param | Type | Required | Description |
|---|---|---|---|
customer | string | Yes | Customer email or customer code |
plan | string | Yes | Plan code (e.g. PLN_gx2wn530m0i3w3m) |
authorization | string | No | Specific authorization code (uses most recent if omitted) |
start_date | string | No | First debit date in ISO 8601 (e.g. 2024-05-16T00:30:13+01:00) |
const subscription = await paystackRequest<{
subscription_code: string;
email_token: string;
status: string;
amount: number;
}>("/subscription", {
method: "POST",
body: JSON.stringify({
customer: "CUS_xnxdt6s1zg1f4nx",
plan: "PLN_gx2wn530m0i3w3m",
start_date: "2024-06-01T00:00:00+01:00", // Optional: delay first charge
}),
});
// subscription.data.subscription_code → "SUB_vsyqdmlzble3uii"
// subscription.data.email_token → "d7gofp6yppn3qz7" (needed for enable/disable)
List Subscriptions
GET /subscription
| Param | Type | Required | Description |
|---|---|---|---|
perPage | integer | No | Records per page (default: 50) |
page | integer | No | Page number (default: 1) |
customer | integer | No | Filter by Customer ID |
plan | integer | No | Filter by Plan ID |
const subscriptions = await paystackRequest("/subscription?perPage=20&page=1");
Fetch Subscription
GET /subscription/:id_or_code
Returns full subscription details including invoices, customer, plan, and authorization objects.
const sub = await paystackRequest(
`/subscription/${encodeURIComponent("SUB_vsyqdmlzble3uii")}`
);
Enable Subscription
POST /subscription/enable
Re-enable a previously disabled subscription.
| Param | Type | Required | Description |
|---|---|---|---|
code | string | Yes | Subscription code |
token | string | Yes | Email token (from create response or fetch) |
await paystackRequest("/subscription/enable", {
method: "POST",
body: JSON.stringify({
code: "SUB_vsyqdmlzble3uii",
token: "d7gofp6yppn3qz7",
}),
});
Disable Subscription
POST /subscription/disable
Disable auto-renewal for a subscription. Same params as enable.
await paystackRequest("/subscription/disable", {
method: "POST",
body: JSON.stringify({
code: "SUB_vsyqdmlzble3uii",
token: "d7gofp6yppn3qz7",
}),
});
Generate Update Subscription Link
GET /subscription/:code/manage/link
Generate a link for the customer to update their card on a subscription. Useful when cards are about to expire — listen for subscription.expiring_cards webhook.
const result = await paystackRequest(
`/subscription/${encodeURIComponent("SUB_vsyqdmlzble3uii")}/manage/link`
);
// result.data.link → "https://paystack.com/manage/subscriptions/..."
Send Update Subscription Link via Email
POST /subscription/:code/manage/email
Automatically emails the customer a link to update their card.
await paystackRequest(
`/subscription/${encodeURIComponent("SUB_vsyqdmlzble3uii")}/manage/email`,
{ method: "POST" }
);
Full Subscription Flow
// 1. Customer pays (creates authorization via checkout/charge)
// 2. Create subscription using customer's authorization
const sub = await paystackRequest("/subscription", {
method: "POST",
body: JSON.stringify({
customer: "[email protected]",
plan: "PLN_gx2wn530m0i3w3m",
}),
});
// 3. Store email_token for later management
const { subscription_code, email_token } = sub.data;
// 4. Handle webhook events for subscription lifecycle
// - invoice.create: 3 days before charge
// - invoice.update: after successful charge
// - invoice.payment_failed: charge failed
// - subscription.disable: subscription disabled
// - subscription.not_renew: set to non-renewing
// - subscription.expiring_cards: monthly card expiry notice
// 5. Customer wants to cancel
await paystackRequest("/subscription/disable", {
method: "POST",
body: JSON.stringify({ code: subscription_code, token: email_token }),
});
// 6. Customer wants to resume
await paystackRequest("/subscription/enable", {
method: "POST",
body: JSON.stringify({ code: subscription_code, token: email_token }),
});
Important Notes
- A customer must have at least one valid authorization (from a previous charge) before subscribing
- The
email_tokenis essential for enable/disable operations — store it when creating subscriptions - Use
start_dateto delay the first charge (e.g. for free trial periods) - Plan updates with
update_existing_subscriptions: truepropagate to active subscriptions - Listen for
subscription.expiring_cardswebhook to proactively send card update links
Gives 0 of the 12 instructions most pricing monetisation skills give
Counted across 366 of the 366 authors here whose files we hold, read 2026-08-06
- verify webhook signaturesin 23 of 366, across 19 files
- differentiate tiers using features, limits, or supportin 15 of 366, across 4 files
- read product marketing context before asking questionsin 14 of 366, across 6 files
- base price on perceived value, not costin 14 of 366, across 3 files
- use Van Westendorp to find acceptable price rangein 14 of 366, across 3 files
- use MaxDiff to identify highly valued featuresin 14 of 366, across 3 files
- choose a value metric that scales with customer valuein 14 of 366, across 9 files
- handle webhook events idempotentlyin 12 of 366, across 6 files
- understand the upgrade context before recommendingin 11 of 366, across 4 files
- align the pricing metric with delivered valuein 10 of 366, across 4 files
- install stripe packagein 10 of 366, across 5 files
- calculate unit economics metricsin 10 of 366, across 5 files
Said here and by no other author read
- create subscription using valid authorization
- store email_token when creating subscriptions
- use start_date to delay first charge
- pass subscription code and email_token to enable
- generate card update link for expiring cards
- email card update link to customer
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once.