API docs
Memberships
Permission: memberships (read / write).
A shop sells membership plans: monthly or yearly dues, an optional initiation fee, family members, guest passes and an optional minimum term. Members get the plan's perks, such as range member rates and member pricing in the store. The shop runs billing. Dues are charged to a saved card, emailed as a pay link, or paid at the register, and every payment is recorded as an order with a membership line. Through the API you read plans and members, sign people up, cancel and use guest passes.
Plans
GET /v1/membership-plans (read). Filter: status (active or archived).
{
"object": "membership_plan",
"id": 7,
"name": "Range Family",
"description": null,
"perks": "Up to 4 in the household, unlimited lane time",
"status": "active",
"price_cents": 5900,
"billing_interval": "month",
"interval_count": 1,
"initiation_fee_cents": 2500,
"commitment_months": 6,
"max_members": 4,
"guest_passes_per_period": 2,
"customer_group_id": null,
"product_id": null,
"taxable": false,
"created_at": "2026-09-26T19:40:02Z",
"updated_at": "2026-09-26T19:40:02Z"
}
| Field | Notes |
|---|---|
price_cents |
Dues for each period, before tax. Members keep the price they joined at, even if the plan changes later. |
billing_interval, interval_count |
The period length, e.g. month × 3 is quarterly |
commitment_months |
Minimum term. Cancelling inside it runs to the end of the term. |
customer_group_id |
Members get that customer group's prices |
product_id |
The product that sells the plan on the shop's BigCommerce store. A paid online order for it signs the buyer up. |
Memberships
GET /v1/memberships (read). Oldest first, cursor-paginated.
| Filter | Notes |
|---|---|
customer_id |
Matches the primary member or a family member |
plan_id |
One plan |
status |
One status (see below) |
updated_since |
ISO-8601 date-time |
GET /v1/memberships/{id} (read) also returns the last 50 charges.
{
"object": "membership",
"id": 12,
"number": "M00012",
"plan_id": 7,
"customer_id": 1388,
"location_id": 3,
"status": "active",
"billing_method": "card",
"has_saved_card": true,
"price_cents": 5900,
"started_on": "2026-08-05",
"current_period_start": "2026-09-05",
"current_period_end": "2026-10-04",
"next_bill_on": "2026-10-05",
"commitment_ends_on": "2027-02-04",
"cancel_at_period_end": false,
"cancel_reason": null,
"cancelled_at": null,
"frozen_until": null,
"guest_passes_left": 1,
"source": "register",
"card_link_url": "https://app.ironregister.com/api/public/card/9b1e…",
"members": [
{ "customer_id": 1388, "role": "primary", "added_at": "2026-08-05T14:00:00Z" },
{ "customer_id": 1391, "role": "member", "added_at": "2026-08-05T14:03:12Z" }
],
"charges": [
{ "object": "membership_charge", "id": 51, "kind": "dues", "period_start": "2026-09-05", "period_end": "2026-10-04", "amount_cents": 5900, "status": "paid", "due_on": "2026-09-05", "attempts": 1, "last_error": null, "order_id": 9120, "pay_url": null, "paid_at": "2026-09-05T10:00:03Z" }
],
"created_at": "2026-08-05T14:00:00Z",
"updated_at": "2026-09-05T10:00:03Z"
}
| Field | Values / notes |
|---|---|
status |
See the status table below |
billing_method |
card (the saved card is charged on the due date and retried if declined), link (a pay link is emailed), counter (paid at the register) |
card_link_url |
The member's own page for saving a card. Send it to them to move dues onto automatic billing. Saving a card there also pays anything owed. |
charges[].kind |
signup (the first period plus the initiation fee) or dues |
charges[].status |
due, failed (card declined), paid, waived, void |
charges[].pay_url |
A pay link while the charge is unpaid |
charges[].order_id |
The order that paid it |
The status values:
status |
Meaning | Perks |
|---|---|---|
pending |
Joined, first payment not made | no |
active |
Paid through current_period_end |
yes |
past_due |
Dues unpaid after the due date (the grace period) | yes |
frozen |
Billing paused until frozen_until |
no |
expired |
Lapsed: unpaid past the shop's last retry day | no |
cancelled |
Ended | no |
Sign someone up
POST /v1/memberships (write). An Idempotency-Key is accepted.
| Field | Required | Notes |
|---|---|---|
customer_id |
yes | The primary member (see Customers to create one) |
plan_id |
yes | An active plan |
billing_method |
yes | link (later dues are emailed as pay links, which needs the shop to have card processing on) or counter |
paid |
no | true = the first period was paid on your channel, so the membership starts active. You report the money, so no order is created. Otherwise it waits pending until the first payment is made by its pay link or at the register. |
location_id |
no | The member's home store. A key limited to certain locations must name one of them; left out, the member is homed at the key's location. |
external_reference |
no | Your id. Sending it again returns the same membership. |
It returns 201 with the membership and its charges. Errors:
409 ALREADY_MEMBER: they're already on this plan.422 PLAN_ARCHIVED422 MEMBERSHIPS_OFF: the shop has memberships switched off.422 CARD_PROCESSING_OFF:linkbilling without card processing.
Cancel
POST /v1/memberships/{id}/cancel (write) with { "reason": "Moving away", "at_period_end": true }. A key limited to certain locations can only cancel memberships whose home store is one of them; others answer 404. Reads and guest passes work across every store.
- By default the membership ends at the close of the paid period, or at the end of the minimum term if that's later. Dues continue until then. The membership shows
cancel_at_period_end: trueuntil it ends. at_period_end: falseends it now and voids anything owed.
Use a guest pass
POST /v1/memberships/{id}/guest-pass (write), with an optional note. The allowance resets every period. The call returns 422 NO_GUEST_PASSES when there are none left.
Webhooks
| Event | When |
|---|---|
membership.created |
Someone joins |
membership.updated |
Renewed, past due, frozen, cancelled, lapsed, members or billing changed. The payload adds change (e.g. renewed, past_due, expired, cancelled) and detail. |
membership.payment_failed |
Dues on a saved card were declined. The shop retries on its schedule. |
Dues payments also fire sale.completed for their order.