When to use this

Use CKO-03 direct delivery when:
  • The subscriber’s building is already wired — a switch port exists and is assigned to their unit
  • You run your own checkout page and want full control over the payment and signup experience
  • Your plan is listed on the kurnl marketplace and you want subscribers to start there
If the subscriber’s unit does not yet have a port installed, use CKO-03 home-drop delivery instead.

How it works

Step-by-step

1. Configure your checkout URL

In Dashboard → Settings → Integration, set your external_checkout_url. When a subscriber selects your plan, the kurnl Marketplace creates a checkout session and redirects them to your page with a single query parameter appended: Example redirect:

2. Read the session

On page load, fetch the session to get the plan and location the subscriber selected:
The embedded plan_versions object gives you the plan name and price to display. Sessions expire after 30 minutes — a 410 Gone means the subscriber must restart from the Marketplace. See Checkout Sessions for the full session API, including the PATCH upsell endpoint for swapping plans mid-checkout.
Legacy handoff: integrations built before the session flow received location_hash, plan_version_id, and service_provider_document_id as individual query parameters. That handoff is obsolete — new integrations should always read the session. The callback still accepts explicit fields for non-Marketplace flows (see the field reference below).

3. Collect payment and subscriber details

Run your normal checkout flow. Collect the subscriber’s:
  • Name, email, phone (optional)
  • Billing address
  • Payment method
kurnl does not receive payment details. You handle payment processing entirely on your side.

4. Call kurnl after successful payment

After payment succeeds, POST to /partner/external-checkout/complete with the session_id and the subscriber’s details. kurnl reads the plan, location, and provider from the session — you never re-send them:
Successful response — 200 OK:
Store the subscription_id and subscriber_id in your system — you’ll need them for any future subscriber management calls. The callback is idempotent: a second call with the same session_id returns the existing subscription without re-provisioning.

5. Handle webhook events

kurnl fires events to your configured webhook_url at each stage: At provisioning.completed, the subscriber’s internet is live. This is the right moment to send them a confirmation email. See Webhooks for signature verification and retry behaviour.

Field reference

Explicit fields (non-Marketplace flows only)

Subscriber fields (required in both flows)

Optional fields

Contact detail fields

Address fields


Error handling

On 5xx errors: Safe to retry the full request. kurnl rolls back any partial state automatically on failure. On network timeout: Retry the request — it is idempotent. The same session_id (or, in the explicit-fields flow, the same email + plan_version_id combination) returns the existing subscription rather than creating a duplicate.

Anonymous variant

If you own the end-user relationship and don’t want kurnl to store subscriber PII, use the anonymous variant instead. You provide an external_subscription_id (your own identifier) instead of a subscriber object. kurnl provisions the port but creates no subscriber record.
With the anonymous variant, subscribers have no kurnl self-service portal access and kurnl cannot issue invoices on your behalf.