When to use this
You land on the home-drop path whenever the session has no directly provisionable port. That covers two cases: the building is not classified as first-line in kurnl (line typesecond, third, or unclassified/NULL), or it is first-line but the
subscriber reached it through address search or a QR landing, so the session carries a
suite instead of a location_hash. Either way kurnl creates the subscription in
PENDING_INSTALL with an operator install job instead of provisioning a switch.
For session-based callbacks (
session_id present), this routing is decided by the
building’s line type — operator-side configuration that partners never set —
not by delivery_mode. delivery_mode: "home_drop" only selects this path in the
legacy explicit-fields flow. See the routing table in
CKO-03 Direct.unit_id on the session — a session without one is
rejected with 422 rather than provisioned.
How it works
The key difference from direct delivery: there is nojob_id in the response — provisioning hasn’t started. The subscription stays in PENDING_INSTALL state until a kurnl operator or technician completes the physical installation.
Third-line buildings get a customer booking link. When the building needs a
technician on site (
line_type = "third"), kurnl e-mails the subscriber a link to a
public booking page in the provider portal within a minute of your callback. The
customer picks a four-hour window (weekdays, at least 24 hours ahead by default) and
can move or cancel it from the same link. Nothing to build on your side — the kurnl
operator sees the booking and the customer’s contact details on the dispatch board.
Second-line buildings ship a CPE instead and get no link.Step-by-step
1. Configure your checkout URL
Same as direct delivery — the kurnl Marketplace creates a checkout session and redirects to yourexternal_checkout_url with ?session_id=<uuid> appended. Read the session to get the details; for non-first-line buildings it carries a unit_id:
2. Collect subscriber details
The CKO-03 home-drop path does not collect a card in kurnl — kurnl creates the subscriber without a Stripe payment method. After the install is confirmed, kurnl attempts to charge a saved payment method if one exists; when none exists (the usual case on this path), it emails the subscriber a Stripe payment link for the first invoice instead. If you manage billing yourself, handle payment on your own timeline.3. Call kurnl after signup
Pass thesession_id — kurnl reads the plan, unit, and provider from the session:
job_id — provisioning has not started.
Despite the message text,
/provisioning/confirm-install is a kurnl-staff
endpoint (dashboard login), not part of the partner API — see step 5.4. Wait for installation
kurnl firessubscription.pending_install to your webhook URL. The install is now in the operator’s queue — kurnl creates an internal install job and support ticket automatically. Store the subscription_id for your records.
The subscription shows as PENDING_INSTALL until the install is completed.
5. Installation is completed by kurnl (not by you)
The install is finished through the kurnl dashboard / field-service flow: an operator maps the switch and port to the unit, marks the hardware shipped, and a technician confirms the install. The confirming call (POST /provisioning/confirm-install) requires kurnl dashboard staff credentials, takes only a subscription_id, and needs the operator-mapped install job to be in the SHIPPED state — there is nothing for your integration to call here.
After the install is confirmed, kurnl provisions the port and then:
- charges the subscriber’s saved payment method, if one exists → subscription
ACTIVE, or - emails the subscriber a Stripe payment link (the usual case for CKO-03 home-drop, since no card was collected) → subscription becomes
ACTIVEwhen they pay.
6. Track activation by polling
To know when the subscription is live, poll:GET /partner/external-checkout/sessions/{session_id}/status— public, no auth, safe from the browser;subscription_statusflips toACTIVE(reference), orGET /partner/external-checkout/sessions/{session_id}— the authenticated session read.
Webhook events
No further webhooks fire for a home-drop subscription today (see above — poll for activation).
Handling unit availability
A unit can only have one pending or active subscription at a time. If you call the endpoint for a unit that already has aPENDING_INSTALL or ACTIVE subscription, you get 409 Unit already has a pending or active subscription. Check the unit’s status before presenting it as available in your checkout.
You can query unit status via the kurnl dashboard or by checking the building’s unit list in your dashboard.