*** title: Create a subscription subtitle: >- Start billing a customer on a recurring schedule by creating a subscription with one or more prices. ------------------------ # Before you begin * Create at least one [product and price](/guides/product-catalog) in your catalog * Create a [customer](/api-reference) with a payment method on file * Decide on a billing interval (daily, weekly, monthly, or yearly) # Create a subscription 1. Go to **Billing > Subscriptions** in the sidebar 2. Click **Create Subscription** 3. Select a customer 4. Add one or more prices with quantities 5. Set the billing interval and period start date 6. Configure payment terms and collection method 7. Click **Create** The subscription is created and the first invoice is generated immediately. ```bash curl -X POST https://api.paymentkit.com/api/{account_id}/subscriptions \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "customer_id": "cus_abc123", "currency": "USD", "period_start": "2026-02-01T00:00:00Z", "billing_interval": "month", "billing_interval_count": 1, "collection_method": "charge_automatically", "processor_id": "proc_live_abc123", "items": [ { "price_id": "price_monthly_pro", "quantity": 1 } ] }' ``` The response includes the full subscription object with its current state. If you omit `processor_id`, PaymentKit uses your account's default processor. Ensure a default is configured or the request will fail. ```python from paymentkit import PaymentKit client = PaymentKit(api_key="sk_live_...") subscription = client.subscriptions.create( account_id="acc_abc123", customer_id="cus_abc123", currency="USD", period_start="2026-02-01T00:00:00Z", billing_interval="month", billing_interval_count=1, collection_method="charge_automatically", processor_id="proc_live_abc123", # Optional: uses default if omitted items=[ {"price_id": "price_monthly_pro", "quantity": 1} ] ) ``` # Configuration options ## Billing interval Control how often the customer is billed: | Field | Description | | ------------------------ | ----------------------------------------------------------------------------------------- | | `billing_interval` | The interval unit: `day`, `week`, `month`, or `year` | | `billing_interval_count` | Number of intervals between billings. For example, `3` with `month` bills every 3 months. | ## Collection method | Method | Behavior | | ---------------------- | --------------------------------------------------------------------------- | | `charge_automatically` | PaymentKit charges the customer's default payment method at each renewal. | | `send_invoice` | PaymentKit generates an invoice and waits for the customer to pay manually. | ## Payment terms Set `net_d` to control when invoices are due for payment. A value of `0` means due immediately. A value of `30` gives the customer 30 days after invoice finalization. ## Payment processor Specify which payment processor to use for charging the subscription: | Field | Description | | -------------- | --------------------------------------------------------------------- | | `processor_id` | External ID of the payment processor to use (e.g., `proc_stg_abc123`) | **Fallback behavior:** * If `processor_id` is not provided, PaymentKit uses the account's default processor * If no default processor is configured for the account, the request **fails with an error** You must either pass an explicit `processor_id` or have a default processor configured for your account. If neither is set, subscription creation will fail. To set a default processor for your account: 1. Go to **Settings > Payment Processors** in the dashboard 2. Click the three-dot menu on a processor 3. Select **Set as Default** Or via API: ```bash curl -X POST https://api.paymentkit.com/api/{account_id}/processors/{processor_id}/set-default \ -H "Authorization: Bearer sk_live_..." ``` # Add a trial period Offer a free trial before the first charge by setting trial dates: ```bash curl -X POST https://api.paymentkit.com/api/{account_id}/subscriptions \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "customer_id": "cus_abc123", "currency": "USD", "period_start": "2026-02-01T00:00:00Z", "billing_interval": "month", "billing_interval_count": 1, "collection_method": "charge_automatically", "trial_start": "2026-02-01T00:00:00Z", "trial_end": "2026-02-15T00:00:00Z", "items": [ {"price_id": "price_monthly_pro", "quantity": 1} ] }' ``` During the trial: * The subscription is in **Trialing** state * A `$0` invoice is generated for the trial period * Three days before the trial ends, a `subscription.trial_will_end` event fires * At trial end, the subscription activates and the first paid invoice is created # Apply a discount Attach a coupon or promotion code at creation: ```bash curl -X POST https://api.paymentkit.com/api/{account_id}/subscriptions \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "customer_id": "cus_abc123", "currency": "USD", "period_start": "2026-02-01T00:00:00Z", "billing_interval": "month", "billing_interval_count": 1, "collection_method": "charge_automatically", "coupon_id": "cpn_welcome20", "items": [ {"price_id": "price_monthly_pro", "quantity": 1} ] }' ``` Use `coupon_id` for a direct coupon reference, or `promotion_code` for a customer-facing code. If both are provided, the coupon referenced by the promotion code must match the given `coupon_id`. # Fixed-term subscriptions Set `total_billing_cycles` to automatically cancel after a specific number of periods: ```bash curl -X POST https://api.paymentkit.com/api/{account_id}/subscriptions \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "customer_id": "cus_abc123", "currency": "USD", "period_start": "2026-02-01T00:00:00Z", "billing_interval": "month", "billing_interval_count": 1, "collection_method": "charge_automatically", "total_billing_cycles": 12, "items": [ {"price_id": "price_monthly_pro", "quantity": 1} ] }' ``` The subscription cancels automatically after 12 billing cycles complete. # Multiple items A subscription can contain multiple prices. Each item represents a line on the recurring invoice: ```bash curl -X POST https://api.paymentkit.com/api/{account_id}/subscriptions \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "customer_id": "cus_abc123", "currency": "USD", "period_start": "2026-02-01T00:00:00Z", "billing_interval": "month", "billing_interval_count": 1, "collection_method": "charge_automatically", "items": [ {"price_id": "price_base_plan", "quantity": 1}, {"price_id": "price_addon_seats", "quantity": 5} ] }' ``` # What happens after creation 1. The subscription is created in **Incomplete** state (or **Trialing** if a trial is set) 2. An invoice is generated for the first billing period 3. If `collection_method` is `charge_automatically`, payment is attempted immediately 4. On successful payment, the subscription transitions to **Active** 5. The lifecycle engine schedules the next billing cycle See [Subscription lifecycle](/guides/billing/subscription-lifecycle) for details on state transitions.