NewMaxio Metering is now available — usage-based billing for Advanced Billing.Learn more
/

Build your own Billing Portal with the Advanced Billing API

··

Last updated on Aug 27, 2026

Building your own subscription management experience against the Advanced Billing API gives you full control over what your customers see and do. Use the API resource tables below to find the endpoint for each action, then follow the walkthrough to assemble them into a working dashboard.

Before you start

RequirementDetail
FeatureAdvanced Billing API
You needDevelopers, an existing frontend UI for subscription management, and a backend that recognizes a signed-in user
CodeYes
DifficultyMedium

Core subscription management API resources

These are the API resources behind each subscription management action, grouped by the kind of change they make.

Basic subscription and Customer actions

ResourceDescription
Read Customer’s SubscriptionsGET /customers/:id/subscriptions.json
Read Customer Payment ProfilesGET /payment_profiles.json?customer_id=:id
Update CustomerPUT /customers/:id.json
Read SubscriptionGET /subscriptions/:id.json
Read Subscription InvoicesGET /invoices.json?subscription_id=:id
List Subscription’s Components (All)GET /components.json
List Subscription’s Components (Only ones subscribed to)GET /components.json > if allocated_quantity > 0, show. if kind is metered_component and price_point_id is not null, show.
Next billing amount and next renewal dateGET /subscriptions/:id.json > parse current_billing_amount_in_cents and next_assessment_at

Upgrade and downgrade actions

ResourceDescription
Read Products from CatalogGET product_families/:product_family_id/products.json
Preview Prorated Product U/DPOST /migrations/preview.json
Execute Prorated Product U/DPOST /migrations.json
Schedule Upgrade/Downgrade for Next RenewalPUT /subscriptions/:id.json
Read Subscription’s ComponentsGET /components.json
Preview Component U/DPOST /allocations/preview.json
Execute Component U/DPOST /allocations.json
Read Offers from CatalogGET /offers.json
Preview Offer U/DPOST /migrations/preview.json
Execute Offer U/DPOST /migrations.json
Enforce upgrades onlyIn your UI, only allow changes if the total cost of the change is greater than the current cost. Additionally, if you do not want to display lower cost options at all, filter out what you display to the user, based on price.

Cancel and pause actions

ResourceDescription
View InvoicesGET /invoices.json?subscription_id=:id
Cancel Subscription (immediate)DELETE /subscriptions/:id.json
Reactivate SubscriptionPUT /reactivate.json
Create Pending Cancellation (delayed)POST /delayed_cancel.json
Remove Pending CancellationDELETE /delayed_cancel.json
Pause SubscriptionPOST /hold.json
Resume Paused SubscriptionPUT /resume.json

Payment method actions

ResourceDescription
Collect Payment InformationDocs: Maxio.js Guide: Collect Payment Methods in your App with Maxio.js
Read Customer’s Payment ProfilesGET /payment_profiles.json?customer_id=:id
Create Payment Profile for CustomerPOST /payment_profiles.json
Set Default Payment Method on SubscriptionPOST /change_payment_profile.json

Group and hierarchy actions

ResourceDescription
Cancel a Group (immediate)POST /subscription_groups/:uid/cancel.json
Cancel a Group (delayed)POST /subscription_groups/:uid/delayed_cancel.json
Read Consolidated Invoices for GroupGET /invoices.json?subscription_group_uid=:uid
Read Child InvoicesGET /invoices.json?subscription_id=:child_subscription_id
Remove Canceled Subscription from GroupDELETE /subscriptions/:id/group.json

Create a subscription management dashboard

The dashboard lets your customers view their Subscription and Invoices, add or update payment methods, and act on the Subscription. The examples below are visual only, and no sample code accompanies them.

Display a subscription dashboard

Read the Subscription so you can display it in your UI.

  1. Read the subscription
    You’ll need the subscription id, and then perform GET /subscriptions/:id.json.

  2. Parse the data you want to display
    For example, the subscription id sits at response.subscription.id, and the customer organization at response.subscription.customer.organization.

  3. Pass the data to your frontend, and display it
    A finished screen might look like this.

    a self-built portal's plan panel showing the current plan, its included add-ons, payment details and invoice history

Display an invoices page

Let’s read the subscription’s invoices, so you can display them.

  1. Read the subscription’s invoices
    You’ll need the subscription id, and then perform GET /invoices.json?subscription_id=:id

  2. Parse the data you want to display
    For example, the invoice uid sits at response.invoice.uid, the invoice number at response.invoice.number, and the invoice URL at response.invoice.public_url.

  3. Pass the data to your frontend, and display it
    Here is a sample image that shows what an end result might look like in a basic table/list layout:

    a portal invoice list, each row with its number, amount, issue and due dates and a view link

Let customers add and update payment information

On your subscription dashboard, you may provide a link to let users add/update their payment information. That link takes them to an edit-payment-information page. Use the guide called Collect Payment Methods in your App with Maxio.js.

Add component changes

Component changes let customers update their add-ons directly in your web application.

  1. Display the components to change
    Read the subscription’s components by performing GET /components.json.

  2. Parse the data you want to display
    For example, the component name sits at response[0].component.name.

  3. Pass the data to your frontend, and display it
    A finished component-change screen might look like this.

    an add-on configuration screen with a live preview of the charges and today's total before confirming

  4. Add a preview changes section
    Make a POST to /allocations/preview.json, parse the result, and display it. This shows the customer what the change costs.

  5. Submit the form with a “Change Add Ons” button
    Make the API call with POST /allocations.json

  6. Test your subscription dashboard
    Your subscription dashboard should now reflect the changes of the subscription.

Allow cancellations

Cancellations let customers end a Subscription from your web application.

  1. Add a cancel action
    It might look like this:

    a portal Manage panel offering to change the plan, configure add-ons, change the offer, pause or cancel

  2. Add a page in your UI, with a preview, confirmation, and submit button
    It might look like this. This is a good place to state the terms of cancellation and tell the customer what happens next.

    a Cancel Subscription screen previewing the effect above a confirm button

  3. Upon submit, cancel the subscription
    Choose which method you prefer:

    MethodDescriptionEndpoint
    Cancel Subscription (Immediate)The user can cancel their subscription, and the cancellation takes effect immediately.DELETE /subscriptions/:id.json
    Cancel Subscription (Delayed)The user can schedule their subscription to cancel at the end of the current billing period.POST /delayed_cancel.json
  4. Test your subscription dashboard
    On your subscription dashboard, if you show the subscription state, it should now reflect the changes of the subscription. If there are certain actions that need to be shown/removed for a canceled subscription, or a subscription that is scheduled to cancel, do those in your UI.

Allow reactivations of a canceled subscription

Reactivations let customers restart a canceled Subscription from your web application.

  1. Add a reactivation action, and only show it when a subscription is canceled
    It might look like this:

    a Manage panel for a canceled subscription, offering only Reactivate

  2. Add a page in your UI, with a preview, confirmation, and submit button
    It might look like this. This is a good place to state the terms of reactivation, including how much the customer is charged, if anything.

    a Reactivate Subscription screen showing the total reactivation cost before confirming

  3. Upon submit, reactivate the subscription
    Do this by performing a /subscriptions/:id/reactivate.json

  4. Test your subscription dashboard
    On your subscription dashboard, if you show the subscription state, it should now reflect the changes of the subscription. If there are certain actions that need to be shown/removed for an active subscription, do those in your UI.

Optional - Allow Pausing

Let’s add pausing a subscription to your web application.

  1. Add a pause action
    It might look like this:

    a portal Manage panel offering to change the plan, configure add-ons, change the offer, pause or cancel

  2. Add a page in your UI, with a preview, confirmation, and submit button
    It might look like this. This is a good place to state the terms of pausing and tell the customer what happens next.

    a Pause Subscription screen explaining that billing stops while paused, above a confirm button

  3. Upon submit, cancel the subscription
    Do this with POST /subscriptions/:id/hold.json

  4. Test your subscription dashboard
    On your subscription dashboard, if you show the subscription state, it should now reflect the changes of the subscription. If there are certain actions that need to be shown/removed for a paused subscription, do those in your UI.

Optional - Allow Resuming a Paused Subscription

Let’s add resuming to your web application.

  1. Add a resume action, and only show it when a subscription is paused
    It might look like this:

    a Manage panel for a paused subscription, offering only Resume

  2. Add a page in your UI, with a preview, confirmation, and submit button
    It might look like this. This is a good place to state the terms of resuming and tell the customer what happens next.

    a Resume Subscription screen confirming that resuming carries no charge

  3. Upon submit, resume the subscription
    Do this by performing /subscriptions/:id/resume.json

  4. Test your subscription dashboard
    On your subscription dashboard, if you show the subscription state, it should now reflect the changes of the subscription. If there are certain actions that need to be shown/removed for an active Subscription, do those in your UI.

To collect and tokenize payment details inside your own application, see Collect Payment Methods in your App with Maxio.js.

To compare building against the API with the lower-effort alternatives, see Compare Subscription Management Methods.

Still need help?
Reach out and our support team will take it from here.

Contact support