agentsclimarketplace

Paystack subscriptions

Skill rexedge/paystack/skills/paystack-subscriptions

24 AI agent skills for Paystack API integration — automate payment workflows with TypeScript, Node.js, and Next.js

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.

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

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.

Keep looking

Skills are one crate of 328,083. 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.