Skip to main content
A Plan defines how customers buy a product. It controls pricing, billing cadence, availability, tax behavior, checkout fields, and purchase visibility. Use the Plans API to create plans for products, list existing plans, retrieve or update plan configuration, calculate tax for checkout, and delete plans that should no longer be offered.

Endpoints

EndpointRequest
List PlansGET /plans
Create PlanPOST /plans
Retrieve PlanGET /plans/{id}
Update PlanPATCH /plans/{id}
Delete PlanDELETE /plans/{id}
Calculate TaxPOST /plans/{id}/calculate_tax

Attributes

account
object | null
required
Account that sells this plan; null for standalone invoice plans.
adaptive_pricing_enabled
boolean
required
Whether this plan accepts local currency payments via adaptive pricing.
billing_period
number | null
required
Recurring billing interval in days, such as 30 for monthly or 365 for annual. null for one-time plans.
collect_tax
boolean
required
Whether tax is collected on purchases of this plan.
created_at
string
required
When the plan was created, as an ISO 8601 timestamp.
currency
string
required
Three-letter ISO currency code for this plan’s prices.Available options: usd, sgd, inr, aud, brl, cad, dkk, eur, nok, gbp, sek, chf, hkd, huf, jpy, mxn, myr, pln, czk, nzd, aed, eth, ape, cop, ron, thb, bgn, idr, dop, php, try, krw, twd, vnd, pkr, clp, uyu, ars, zar, dzd, tnd, mad, kes, kwd, jod, all, xcd, amd, bsd, bhd, bob, bam, khr, crc, xof, egp, etb, gmd, ghs, gtq, gyd, ils, jmd, mop, mga, mur, mdl, mnt, nad, ngn, mkd, omr, pyg, pen, qar, rwf, sar, rsd, lkr, tzs, ttd, uzs, rub, btc, cny, usdt, kzt, awg, whop_usd, xau
custom_fields
object[]
required
Custom input fields collected on the checkout form.

Properties

field_type
string
required
Custom field input type.Available options: text
id
string
required
Custom field ID.
name
string
required
Field label shown to customer at checkout.
order
number
required
Field position on checkout form.
placeholder
string | null
required
Placeholder text shown in empty field.
required
boolean
required
Whether the customer must complete this field to check out.
description
string | null
required
Customer-visible plan description.
expiration_days
number | null
required
Access duration in days for expiration-based plans.
id
string
required
Plan ID, prefixed plan_.
initial_price
number
required
Initial purchase price in plan currency.
internal_notes
string | null
required
Private notes visible only to authorized team members.
invoice
object | null
required
Invoice this plan was generated for; null unless created for an invoice.
member_count
number | null
required
Active memberships through this plan, when visible to the requester.
metadata
object | null
required
Custom key-value pairs stored on the plan.
payment_method_configuration
object | null
required
Payment method configuration (enabled, disabled, include_platform_defaults); null when plan uses default settings.
plan_type
string
required
Billing model for this plan: renewal (recurring) or one_time (single payment).Available options: renewal, one_time
product
object | null
required
Product this plan belongs to; null for standalone plans.
purchase_url
string
required
URL where customers can purchase this plan directly.
release_method
string
required
Sales method for this plan, such as buy_now or waitlist.Available options: buy_now, waitlist
renewal_price
number
required
Recurring price charged every billing period.
split_pay_required_payments
number | null
required
Installment payments required before the subscription pauses.
stock
number | null
required
Units available for purchase, when visible to the requester.
tax_type
string
required
How tax is handled for this plan.Available options: inclusive, exclusive, unspecified
three_ds_level
string,null | null
required
3D Secure behavior for this plan; null inherits account default.Available options: mandate_challenge, frictionless
title
string | null
required
Plan display name shown to customers.
trial_period_days
number | null
required
Free trial days before the first renewal charge. null if no trial is configured or the user has already used a trial for this plan.
unlimited_stock
boolean
required
Whether the plan has unlimited stock.
updated_at
string
required
When the plan was last updated, as an ISO 8601 timestamp.
visibility
string
required
Whether the plan is visible to customers or hidden from public view.Available options: visible, hidden, archived, quick_link
Plan
{
	"account": {
		"id": "biz_xxxxxxxxxxxxxx",
		"title": "Pickaxe"
	},
	"adaptive_pricing_enabled": true,
	"billing_period": 30,
	"collect_tax": true,
	"created_at": "2023-12-01T05:00:00.401Z",
	"currency": "usd",
	"custom_fields": [
		{
			"id": "cusf_xxxxxxxxxxxx",
			"field_type": "text",
			"name": "Discord username",
			"order": 0,
			"placeholder": "e.g. pickaxe_user",
			"required": true
		}
	],
	"description": "Monthly access to Pickaxe Analytics.",
	"expiration_days": null,
	"id": "plan_xxxxxxxxxxxxx",
	"initial_price": 29,
	"internal_notes": "Standard monthly plan",
	"invoice": null,
	"member_count": 42,
	"metadata": {
		"external_plan_id": "monthly"
	},
	"payment_method_configuration": {
		"enabled": ["card"],
		"disabled": [],
		"include_platform_defaults": true
	},
	"plan_type": "renewal",
	"product": {
		"id": "prod_xxxxxxxxxxxxx",
		"title": "Pickaxe Analytics"
	},
	"purchase_url": "https://whop.com/pickaxe-analytics/checkout/plan_xxxxxxxxxxxxx",
	"release_method": "buy_now",
	"renewal_price": 29,
	"split_pay_required_payments": null,
	"stock": null,
	"tax_type": "exclusive",
	"three_ds_level": "frictionless",
	"title": "Monthly",
	"trial_period_days": 7,
	"unlimited_stock": true,
	"updated_at": "2023-12-01T05:00:00.401Z",
	"visibility": "visible"
}