@alexasomba/better-auth-paystack
Version:
Production-ready Paystack billing plugin for Better Auth. Supports subscriptions, one-time payments, organization billing, secure webhooks and more
121 lines (86 loc) • 4.12 kB
Markdown
name: paystack-client-api
description: >
Modify or use the @alexasomba/better-auth-paystack browser client API. Use for paystackClient(), authClient.paystack, authClient.transaction, authClient.subscription, initializeTransaction, verifyTransaction, listTransactions, listSubscriptions, listProducts, listPlans, subscription billingPortal/manageLink, cancel/restore methods, BetterFetch throw option return types, and legacy disable/enable aliases.
type: core
library: "@alexasomba/better-auth-paystack"
library_version: "3.1.1" # x-release-please-version
license: "MIT"
compatibility: "Node.js >=22.0.0; better-auth ^1.6.9; @alexasomba/paystack-node 1.10.x; @alexasomba/better-auth-paystack >=3.0.0 <4.0.0"
sources:
- "alexasomba/better-auth-paystack:src/client.ts"
- "alexasomba/better-auth-paystack:src/routes.ts"
- "alexasomba/better-auth-paystack:test/typesafety.test.ts"
- "alexasomba/better-auth-paystack:examples/tanstack/src/lib/paystack-client.ts"
## Client Contract
Install the browser plugin from the client entrypoint:
```ts
import { createAuthClient } from "better-auth/client";
import { paystackClient } from "@alexasomba/better-auth-paystack/client";
export const authClient = createAuthClient({
plugins: [paystackClient({ subscription: true })],
});
```
The plugin exposes three public surfaces:
- `authClient.paystack`: top-level Paystack actions
- `authClient.transaction`: transaction namespace
- `authClient.subscription`: subscription namespace
`authClient.paystack.paystack` points back to the same actions object for compatibility.
## Core Patterns
### Prefer stable names in examples
Use these methods in new examples and application code:
```ts
await authClient.paystack.config();
await authClient.paystack.listProducts();
await authClient.paystack.listPlans();
await authClient.paystack.initializeTransaction({ amount: 500_000 });
await authClient.paystack.verifyTransaction({ reference: "REF" });
await authClient.paystack.listTransactions();
await authClient.transaction.initialize({ amount: 500_000 });
await authClient.transaction.verify({ reference: "REF" });
await authClient.transaction.list();
await authClient.subscription.create({ plan: "starter" });
await authClient.subscription.upgrade({ plan: "team" });
await authClient.subscription.list();
await authClient.subscription.billingPortal({ subscriptionCode: "SUB_code" });
await authClient.subscription.cancel({
subscriptionCode: "SUB_code",
atPeriodEnd: true,
});
await authClient.subscription.restore({ subscriptionCode: "SUB_code" });
```
`subscription.manageLink` is an alias for `subscription.billingPortal`.
### Preserve legacy aliases
`subscription.disable` maps to `subscription.cancel`.
`subscription.enable` maps to `subscription.restore`.
Keep these aliases for migration compatibility, but do not introduce them in new examples.
### Respect BetterFetch return typing
Methods use `FetchResult<T, O>`:
- with `{ throw: true }`, the promise resolves to `T`
- without `{ throw: true }`, the promise resolves to `BetterFetchResponse<T>`
When changing method signatures, update both the interface and implementation, then run type tests.
## Common Mistakes
### Using old `getConfig`
The stable method is `authClient.paystack.config()`. Do not add new examples that call
`authClient.paystack.getConfig()`.
### Passing query data in the body for list endpoints
List endpoints use GET with query data:
```ts
await authClient.subscription.list({ query: { referenceId: "org_123" } });
await authClient.transaction.list({ query: { referenceId: "org_123" } });
```
### Importing the server package in browser code
Browser code should import only `@alexasomba/better-auth-paystack/client`. Server helpers such as
`syncPaystackPlans` and `chargeSubscriptionRenewal` belong in server functions, cron jobs, or trusted
routes.
## Verification
Run these after client API changes:
```bash
vp test test/typesafety.test.ts
vp test test/paystack.test.ts
```
Run TanStack example tests when examples or client usage are changed:
```bash
pnpm --filter ./examples/tanstack test
```