The three entities
A seat-based product introduces a layer that single-buyer products don’t have. Get these three concepts straight and every API call, webhook, and portal screen will make sense.
Roles map directly to capability. Both
owner and billing_manager can assign seats, change or cancel the subscription, and manage payment methods. A plain member sees only their own benefits. (The owner role may gain extra management powers later.)
Here’s how it fits together for a six-seat team plan, of which four seats are in use:
Why the split is worth it
- Members outlive any single purchase. One member can hold seats from several subscriptions or one-time orders under the same customer.
- Entitlements attach to people, not invoices. Benefits are granted when a seat is claimed, never at checkout.
- The portal adapts to the role. Owners and billing managers get team management; members get a personal benefits view.
What you’ll need
- A Macropay organization with seat-based pricing enabled (private beta)
- The latest Macropay SDK —
npm install @macropayments/sdkorpip install macropay - Familiarity with Macropay products and subscriptions
This guide covers both subscription and one-time seat products. The assignment and claim flow is identical; only how you add seats later differs (modify the subscription vs. buy another order).
Step 1 — Create the product
1
Open Products
In the dashboard, go to Products and click Create Product.
2
Set pricing
Under Pricing:
- Product type — Subscription (recurring) or One-time (perpetual licenses)
- Pricing type — Seat-based
- Min seats —
1, or your minimum team size
3
Attach benefits
Add the benefits each seat holder receives — license keys, file downloads, Discord roles, GitHub repo access, and so on. These are granted on claim, not at purchase.
Step 2 — Checkout
Passseats and let Macropay compute the volume price from your tiers. Because Macropay is the merchant of record, the sales tax or VAT for the buyer’s jurisdiction is calculated and remitted for you — it never lands on your tax filings.
Step 3 — Assign seats
Once the order is paid, an owner or billing manager can run seat management straight from the Customer Portal — no UI to build. The portal lets them:- Assign a seat to a teammate by email
- Revoke a seat to cut access and free it for reuse
- Resend the invite for a still-pending seat
- Adjust the seat count on a subscription
The invite and claim flow is fully hosted by Macropay. Members click the link, claim the seat, and get immediate access — you don’t render or send anything.
Assigning seats from your own backend
If you already authenticate users and want to wire seats to signups, call the Customer Seats API directly:Step 4 — Provision on benefit grants
Listen for benefit-grant webhooks and mirror access in your own system. The recipient isgrant.member; grant.customer_id is the payer.
Step 5 — Change the seat count
Subscriptions — patch the seat total:Giving members the portal
To drop a member into the customer portal — to see their benefits or, for managers, to run the team — create a member session and redirect to the returned URL:- Owners and billing managers — full team management: assign seats, manage members, review utilization.
- Members — their own benefits and account details, nothing more.
Webhook reference
Patterns worth adopting
- Provision off
grant.member, nevergrant.customer_id. It’s the single most reliable way to attribute access to the right person. - Use seat metadata for your own bookkeeping — stash a department, cost center, or internal user ID on the seat (up to 10 keys / 1KB).
- Tell billing managers they aren’t auto-enrolled. A manager who also wants the product must assign a seat to themselves.
Troubleshooting
Subscriptions vs. one-time
Limits
- Seats are assigned one at a time (script the API for bulk).
- Claim links expire after 24 hours.
- Up to 1,000 seats per subscription.
- Seat metadata: 10 keys, 1KB max.