agentsclimarketplace

Paystack subscriptions

Skill rexedge/paystack/skills/paystack-subscriptions

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.From its SKILL.md

Install
npx -y skills add rexedge/paystack --skill paystack-subscriptions

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

SKILL.md

6.0 KB, ~1.4k tokens by cl100k_base, 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 paystackRequest helper.
Related: paystack-plans for creating plans, paystack-customers for customer management.

Endpoints

MethodEndpointDescription
POST/subscriptionCreate a subscription
GET/subscriptionList subscriptions
GET/subscription/:id_or_codeFetch a subscription
POST/subscription/enableEnable a subscription
POST/subscription/disableDisable a subscription
GET/subscription/:code/manage/linkGenerate card update link
POST/subscription/:code/manage/emailEmail card update link

Create Subscription

POST /subscription

ParamTypeRequiredDescription
customerstringYesCustomer email or customer code
planstringYesPlan code (e.g. PLN_gx2wn530m0i3w3m)
authorizationstringNoSpecific authorization code (uses most recent if omitted)
start_datestringNoFirst 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

ParamTypeRequiredDescription
perPageintegerNoRecords per page (default: 50)
pageintegerNoPage number (default: 1)
customerintegerNoFilter by Customer ID
planintegerNoFilter 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.

ParamTypeRequiredDescription
codestringYesSubscription code
tokenstringYesEmail 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_token is essential for enable/disable operations — store it when creating subscriptions
  • Use start_date to delay the first charge (e.g. for free trial periods)
  • Plan updates with update_existing_subscriptions: true propagate to active subscriptions
  • Listen for subscription.expiring_cards webhook to proactively send card update links

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.