> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.solvimon.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.solvimon.com/_mcp/server.

# Customer portal

The customer portal is a billing page that Solvimon builds and hosts for one of your customers. It shows what they are subscribed to, what they have used, and what they have been invoiced, and it lets them pay and keep their billing details up to date without a login on your side.

---

## What it does

The portal gives one customer a view of their own billing, so the routine requests that would otherwise reach your support queue become things the customer resolves on the page: fetching an invoice, checking what they pay for, correcting a VAT number, or paying something overdue.

Depending on how you configure the link, it can show:

| Section         | What the customer sees                                  |
| --------------- | ------------------------------------------------------- |
| Subscriptions   | Active subscriptions with plan, price, and renewal date |
| Invoices        | Invoice history with status                             |
| Usage           | Current-period usage against metered items              |
| Payment methods | The payment methods saved for them                      |

And it can let them:

| Action               | What the customer can do                            |
| -------------------- | --------------------------------------------------- |
| Edit billing details | Change billing name, email, address, and VAT number |
| Download invoices    | Download invoice PDFs                               |
| Pay an invoice       | Settle an outstanding invoice                       |

Each link is created for one specific customer and carries a token that identifies them, so they see their own data without logging in.

## When to use it

Two common ways to put the portal in front of a customer:

* **A "Manage billing" button in your product.** Create a link when the customer clicks it and send them straight there. They are already signed in on your side, so the link never travels anywhere else.
* **A link in an email.** Useful for chasing payment: allow paying an open invoice, and the customer can settle it directly from the email.

If you would rather show this inside your own product, the SDK's [Customer overview screen](/sdk/frontend-components/screens/customer-overview) renders the same data as components you mount yourself. That screen has its own fixed layout and does not read the settings below.

## Create a portal link

A portal link is a portal URL of type `CUSTOMER`. `display` chooses the sections, and `options` chooses the actions.

**`Create a customer portal link`**

```bash Create a customer portal link
curl -X POST https://test.api.solvimon.com/v1/portal-urls \
  -H "X-API-KEY: <apiKey>" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "CUSTOMER",
    "customer_id": "cust_example",
    "customer": {
      "display": {
        "pricing_plan_subscriptions": true,
        "invoices": true,
        "usage": true,
        "payment_acceptors": true
      },
      "options": {
        "edit_customer_details": true,
        "download_invoice": true,
        "pay_open_invoice": true
      }
    }
  }'
```

**`Response`**

```json Response
{
  "object_type": "PORTAL_URL",
  "id": "purl_example",
  "type": "CUSTOMER",
  "customer_id": "cust_example",
  "status": "PUBLISHED",
  "url": "https://portal.solvimon.com/...",
  "customer": {
    "display": {
      "pricing_plan_subscriptions": true,
      "invoices": true,
      "usage": true,
      "payment_acceptors": true
    },
    "options": {
      "edit_customer_details": true,
      "download_invoice": true,
      "pay_open_invoice": true
    }
  }
}
```

Send the customer the `url` from the response.

Both objects are set per link, so the same customer can get a full-access link in your product and a read-only link by email. For a read-only view, leave the sections on and turn the actions off:

**`Read-only configuration`**

```json Read-only configuration
{
  "display": { "pricing_plan_subscriptions": true, "invoices": true, "usage": true, "payment_acceptors": false },
  "options": { "edit_customer_details": false, "download_invoice": true, "pay_open_invoice": false }
}
```

See [Create a portal URL](https://docs.solvimon.com/api-docs/transaction-api/portal-urls/post-portal-urls) for the full schema.

## Self-serve upgrades

If the customer's subscription is self-serve, the portal also lets them change what they are subscribed to. From **My subscription**, **Upgrade subscription** shows the add-ons available on their plan.

![Upgrading a subscription from the customer portal](/_fern-img/b11fbf2396ff7a5a5fc45912d93cc289a8f7f1caf11ef755e13ddbc93f0e477e.webp)

The customer adds an add-on to the cart, and the order summary prices it with the correct tax and shows what is due today. They can pay with a payment method already saved on their account or choose another one the connected PSP offers. **Purchase** applies the change to the subscription and takes the payment in the same step, so there is nothing left for you to approve.

[Self-serve plan changes](/platform-guides/customers-and-billing/self-serve-plan-changes) covers the API behind this: the schedule that gets created, the two start dates available, and what must be true of the subscription and payment method before the option appears.

## Branding

The portal is styled with your branding, set in Desk under **Settings > Branding**:

| Setting              | Where it shows                                    |
| -------------------- | ------------------------------------------------- |
| Primary colour       | Buttons and accents                               |
| Secondary colour     | Supporting accents                                |
| Logo                 | The panel beside the portal content               |
| Square logo / avatar | Compact contexts where the full logo does not fit |
| Portal display name  | The name the customer sees for you on the page    |

The same settings apply to hosted checkout and to your invoices, so you configure them once. See [Customising invoices](/platform-guides/platform-configuration/customising-invoices).

## Revoking a link

Because the link opens one customer's billing data without a login, treat it like a credential: send it to the customer rather than publishing it. If it reaches the wrong person, revoke it:

**`Revoke a portal link`**

```bash Revoke a portal link
curl -X POST https://test.api.solvimon.com/v1/portal-urls/purl_example/revoke \
  -H "X-API-KEY: <apiKey>"
```

The link then reports `status: "REVOKED"` and no longer opens. A link stays valid until it expires or you revoke it. To set its lifetime, pass `expiry_period` when you create it, for example `"expiry_period": { "type": "DAY", "value": 7 }`, where `type` is `DAY`, `WEEK`, `MONTH` or `YEAR`. If you leave it out, a `CUSTOMER` link uses your platform's default from `default_portal_url_settings.customer.expiry_period`, which you set with [PATCH /v1/platforms/\{id}](https://docs.solvimon.com/api-docs/configuration-api/platforms/patch-platforms-by-resource-id). If neither is set, the link does not expire. The response's `expires_at` shows when the link expires, and once it has, the link reports `status: "EXPIRED"` and no longer opens. For anything sensitive, generate a fresh link per visit rather than storing one per customer.

## Via Desk

Portal links can also be generated from a customer's detail page in Desk, which is the quickest route for a support agent handling a one-off request.

## Things to know

* **One customer per link.** Parent and child customers each need their own link.
* **Available payment methods depend on the PSP.** What a customer can add, change, or remove comes from the connected provider. See [Payment Options](/platform-guides/platform-configuration/payment-options).
* **Cancellation is a platform setting.** Whether customers can cancel a subscription is configured platform-wide, not per link. Check it before telling customers they can cancel here.
* **Edits apply going forward.** A billing address change affects future invoices, not ones already finalised.