> 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.

# Hosted checkout

A hosted checkout is a payment page that Solvimon builds and hosts for one subscription you are selling. You link to it from your site, and when a customer pays, Solvimon creates their account and starts the subscription.

---

## What it does

You are selling a plan. Rather than building a signup and payment flow, you create a checkout link in Solvimon and put it behind a button on your pricing page or in an email. The page handles the whole path from that button to an active subscription:

| The page does this                                                                                               | So you do not have to                              |
| ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| Collects name, email, country, and billing address                                                               | Build and maintain a signup form                   |
| Prices the subscription live as the customer types, with the correct tax for their country                       | Call a preview endpoint or keep tax rates yourself |
| Offers the payment methods available for that country and amount                                                 | Decide per country what to show                    |
| Applies the plan's billing periods, add-ons, seat counts, and promotion codes, updating the price on each choice | Model plan options in your own UI                  |
| Takes the payment                                                                                                | Integrate a PSP for this flow                      |

When the payment succeeds, Solvimon creates the customer record, activates the subscription, and marks the first invoice as paid. You do not have to create the customer beforehand or finish anything afterwards, and the page asks only for fields you need in order to invoice.

## When to use it

Use hosted checkout for self-serve signup, where anyone who visits your site should be able to subscribe without you touching the account. Because the page is public and not tied to one person, you can publish the link anywhere: a pricing page, an email, a chat reply.

If you want the same flow to happen inside your own product rather than on a Solvimon page, use the SDK's [Checkout screen](/sdk/frontend-components/screens/checkout) instead. That is a separate integration, with a different division of work:

|                    | Hosted checkout                   | SDK Checkout screen               |
| ------------------ | --------------------------------- | --------------------------------- |
| Who renders the UI | Solvimon                          | Your application                  |
| Who the visitor is | Identifies themselves on the page | Known to your app already         |
| You maintain       | A URL                             | A frontend integration            |
| Best for           | Public, self-serve signup         | Signup inside a signed-in product |

## Create a checkout link

A checkout link is a portal URL of type `INIT_PRICING_PLAN_SUBSCRIPTION`. It points at the pricing plan subscription that describes what you are selling.

**`Create a checkout link`**

```bash Create a checkout link
curl -X POST https://test.api.solvimon.com/v1/portal-urls \
  -H "X-API-KEY: <apiKey>" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "INIT_PRICING_PLAN_SUBSCRIPTION",
    "init_pricing_plan_subscription": {
      "pricing_plan_subscription_id": "ppsu_example",
      "success_url": "https://yourapp.com/welcome"
    }
  }'
```

**`Response`**

```json Response
{
  "object_type": "PORTAL_URL",
  "id": "purl_example",
  "type": "INIT_PRICING_PLAN_SUBSCRIPTION",
  "status": "PUBLISHED",
  "url": "https://portal.solvimon.com/...",
  "init_pricing_plan_subscription": {
    "pricing_plan_subscription_id": "ppsu_example",
    "success_url": "https://yourapp.com/welcome"
  }
}
```

| Field                          | Required | Description                                                                                    |
| ------------------------------ | -------- | ---------------------------------------------------------------------------------------------- |
| `pricing_plan_subscription_id` | Yes      | The subscription being sold. Its plan determines what the page shows and charges.              |
| `success_url`                  | No       | Where the customer goes after paying. Omit it to leave them on the Solvimon confirmation page. |

You do not pass a `customer_id`. The customer identifies themselves on the page, which is why one link works for everyone.

Take the `url` from the response and link to it. The link stays valid until you revoke it, so you can create it once and reuse it.

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

## Via Desk

You do not need the API. In Desk, go to **Checkout pages** (below Customers in the sidebar) to manage every page you have published.

![The Checkout pages list in Desk](/_fern-files/_img/37ce917c3d5d0b0aa42d1cdc2bb23dbcc544ef72f5fa86b06d6f491b3711bb44.webp)

Each row is one page, with the subscription it sells, its reference, and its status. The row menu lets you:

| Action             | What it does                                                         |
| ------------------ | -------------------------------------------------------------------- |
| Edit checkout page | Reopen the setup and change what the page sells                      |
| Open checkout page | Open the live page as a customer would see it                        |
| Copy page url      | Copy the link to paste into your pricing page or an email            |
| Void               | Stop the page from opening, the Desk equivalent of revoking the link |

**New checkout page** starts a new one.

### Set up the page

The setup page mirrors the subscription being sold: its schedules, the pricing plan on each schedule, and the products in that plan.

![Setting up a checkout page for a subscription in Desk](/_fern-files/_img/4b984822b65b62f6e05cfa36dca652e60c39495ea98d277eb6cec8ebe520bd6c.webp)

Two controls matter here:

* **Allow the user to pick one of these single select products on checkout.** Turn this on for a single-select product group, and the customer chooses one of its options on the page. In the example, Tier 1, Tier 2, and Tier 3 each carry their own price and entitlements, and the page prices whichever the customer picks.
* **Open preview.** Opens the page as a customer sees it, without publishing. Use it to check the plan renders the way you expect before the link goes out.

Subscription and billing settings (customer type, initial and renewal term, billing frequency, billing entity, currency, and accepted payment methods) are shown on the right for reference. They come from the subscription, not from the checkout page.

**Activate self-serve page** publishes the page and turns the URL on. Until then it stays in Draft and the link does not open.

### Express checkout on a product offer

A product offer sells a single product rather than a full subscription, and its checkout is a one-screen express flow: the customer picks a wallet payment method or types their details, and pays.

![A recurring product offer with its express checkout preview in Desk](/_fern-files/_img/cf62053e73d51da510e5e4b0fbc04d6011c9af79d22666089957dd1627279590.webp)

You configure the product, its pricing, duration, whether it is billed in advance, taxes, and the billing entity and payment methods. The preview on the right updates as you change them, so you can see the page the customer will land on. **Publish offer** makes it live.

Paying through this page creates the user and the customer in one step, the same as a checkout page: there is nothing to set up beforehand.

### Branding

The colours, logo, square logo, and portal display name on the page come from **Settings > Branding** in Desk, not from the checkout page itself. See [Branding](/platform-guides/customers-and-billing/customer-portal#branding).

## Pre-fill values with URL parameters

Append query parameters to the checkout link to pre-fill the form. Solvimon reads them on load, before the customer interacts with the page.

| Parameter     | Description                         |
| ------------- | ----------------------------------- |
| `email`       | Pre-fills the email field           |
| `coupon_code` | Pre-fills and applies a coupon code |

```
https://checkout.solvimon.com/purl_example?email=john@example.com&coupon_code=WELCOME10
```

The same parameters work when you embed the [Checkout screen](/sdk/frontend-components/screens/checkout) with the SDK instead of using the hosted page.

## After the payment

`success_url` is where Solvimon sends the customer once payment succeeds.

Treat that redirect as a convenience for the customer, not as your record of the sale. It happens in the customer's browser, so someone who closes the tab after paying never triggers it.

> **Warning**
>
> Do not grant paid access based on the `success_url` request. Confirm the subscription server-side through the API or a webhook first.

## Revoking a link

To stop a checkout link from working, revoke it:

**`Revoke a checkout link`**

```bash Revoke a checkout 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. Revoke and recreate when you change what you are selling, so nobody checks out on old terms. In Desk, this is **Void** in the row menu on the Checkout pages list.

## Things to know

* **One link, one subscription.** The link is tied to the pricing plan subscription you created it for. Selling a second plan means a second link.
* **Abandoned checkouts cost nothing.** A visitor who leaves without paying creates no customer and no invoice.
* **US and Canada need a full address.** Tax there depends on the address, so the page requires it before payment.
* **Test and live are separate.** A link created with a test API key only accepts test payments and creates test data.