Checkout recovery

Manual and direct checkout both validate the email and open only Stripe’s secure payment host. A network timeout returns an actionable error. Retrying unchanged checkout details on the same open page reuses a Stripe request identity; this is not a guarantee against separate purchases in different tabs or sessions. Do not start another purchase if a payment already completed.

The confirmation page lets customers check payment status again without starting another checkout. It is marked private, non-cacheable and non-indexable, and does not send referrer information. Treat its URL and the access code as private credentials; these controls do not stop someone with the link from opening it. If clipboard access is blocked, customers can select and copy the visible code manually.

Promotion codes

Create coupons and promotion codes in the Stripe account collecting the payment, in the matching Live or Sandbox environment. Restrict coupons to the intended product and review duration, expiry and redemption limits. Customers enter codes using Add promotion code on the secure Stripe payment screen, not the website’s Premium access-code form. Stripe validates eligibility and displays the discounted total before confirmation.

An active or trialing subscription from a completed, fully discounted checkout receives the usual access code. ScrollXXX customers activate Premium with that code and their verified purchase email. Dashboard plan prices remain before discounts; earnings use actual paid invoices, so a zero-total invoice adds no earnings. Manage redemption history in Stripe. Promotion codes do not automatically attribute ScrollXXX affiliate referrals.

Website matching defaults to Dark mode. Choose Light mode in Checkout designer before matching to import the website’s light colors instead, then review and save. Matching reads identifiable public CSS selectors; sites without matching mode styles may need manual adjustments. Existing saved themes are not automatically changed. ScrollXXX checkouts without a saved design start with its dark charcoal-and-pink preset; Restore default explicitly switches back to UnlockLane styling.

In Dashboard → Checkout designer → Checkout flow, enable Skip review when an email is supplied to open Stripe payment directly. ScrollXXX live enables this by default; other websites start with review enabled. Upgrade links can pass an email with an encoded #email= fragment on the checkout URL (for example, using URLSearchParams). Checkout removes the fragment from the address bar; no sign-in token should be transferred. Without a valid email, after cancellation, or if payment cannot open, the regular review form appears. Customers still see the price, promotion-code option and final confirmation on Stripe. The email hint is not account verification: ScrollXXX activation still requires the purchase code and a verified account with the matching checkout email.

Launch a landing page first

Open Dashboard → Landing pages to create a shareable membership preview without a payment account or plan. Customize the website name, headline, description, highlights, colors, font and corners. Save as a draft or publish at /join/your-link-name. Link names are permanent; unpublish to hide a page. These pages do not accept payments, create customer accounts or collect contact details. Payment activation will require a separate compatible provider integration; publishing a page does not approve the business for payments.

Create your merchant account

  1. Open the dashboard and sign in with ChatGPT. Your merchant account is created automatically; only you can manage its websites and subscribers.
  2. Choose Live payments to name your product and create a monthly checkout billed through UnlockLane after activation. The optional sandbox still supports connected-account testing.
  3. Create a website and monthly USD plan. Use a unique slug and your public HTTPS website address. Save the server API key from API keys & integration.
  4. Customize checkout and the subscription-management email link. Add checkout to your site and verify codes on your server.
  5. Complete a sandbox purchase using your merchant sign-in email and Stripe test payment details. Test confirmation, email, cancellation, failed renewal, recovery, and access expiry.

Sandbox and Live have separate payment connections, website entries, API keys, plans, and subscriber records. A website’s environment cannot be switched. To go live, create a new live website entry with a different slug. New live products use UnlockLane’s collection account and stay unavailable for charging until activated.

Merchants must meet Stripe’s eligibility rules or hold account-specific written approval for their exact business and content categories. UnlockLane does not grant or replace provider approval. Sandbox email is limited to the merchant’s sign-in address to prevent unsolicited test emails.

Developer guide

From checkout to verified access.

UnlockLane creates subscription access codes. Your backend decides which account and features to unlock. Start with authentication, then prove the payment flow in test mode.

Match your checkout to your website

In your dashboard, open Checkout designer and choose Match my website. UnlockLane reads the public page and up to four same-site stylesheets, then suggests a color palette, a similar system font style, and corner radius. Adjust the colors and preview the checkout, payment-page styling, and access-code page at wide or phone width. The payment-page preview is a style reference, not an exact rendering of the hosted page.

Save checkout design applies it to every UnlockLane checkout for that website. A scan only updates your private preview. Discard edits returns to your saved design; Restore default removes the custom styling. Text contrast is checked before saving.

Style matching is an approximation based on public HTML and CSS, not a screenshot or a full copy. Script-rendered styles, external stylesheets, blocked pages, images, logos, and custom font files may not be imported. You can always choose the styling manually. Only the design settings are saved; downloaded page content is not retained. The scan makes public website and DNS requests without sending your account credentials. For newly created payment sessions, UnlockLane sends the saved background, button color, business display name, closest supported font, and corner style. The payment provider controls its layout and text contrast; existing merchant logos remain in place. Sessions already opened keep their original branding. The access-code page also uses the saved theme.

1. Connect your website

  1. Open your dashboard and select Live payments for a product billed through UnlockLane, or Sandbox for optional connected-account testing.
  2. Create a plan. Copy the checkout URL and exact site slug from API keys & integration.
  3. Store the site API key in your backend’s secret settings. Deploy or restart that backend after changing its secret. Never place the key in browser code, a public environment variable, or a URL.
  4. Use the dashboard connection tester, then run this request from your own deployed backend. These are separate checks.
const response = await fetch('https://unlocklane.com/api/v1/connection', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.UNLOCKLANE_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ site: 'YOUR_SITE_SLUG' }),
  redirect: 'manual',
  cache: 'no-store',
  signal: AbortSignal.timeout(10000),
});
if (!response.ok) throw new Error('Connection check failed');
const result = await response.json();
// connected: true confirms authentication. It NEVER grants access.
// Check result.mode: "test", "live", or "unconfigured".

This is UnlockLane’s canonical API host. The public website and checkout links use unlocklane.com. Both belong to the same service. Manual redirect handling works on Cloudflare Workers; treat every non-success response as a failed check.

2. Verify subscriber access

Send POST requests to https://unlocklane.com/api/v1/verify with the same Bearer header and a JSON body containing site and code. Find a ready-to-copy example for your site in the dashboard.

Response fieldHow to use it
validMust be the boolean true. False means the code cannot grant access.
entitlementMatch the exact feature or plan your protected route requires, such as premium.
renewsAtISO expiry, or null if no period is stored. For time-limited access, require a future date; do not treat null as unlimited access.
modetest, live, or unconfigured. Require live for real paid access. Test validity only belongs in an isolated test flow.
sandboxLegacy dedicated-sandbox marker. Use mode for general integrations.

Bind access to your authenticated user on your server and enforce it on protected API routes. Recheck periodically and when a session is renewed; deny access on errors. Codes are bearer credentials and are not automatically bound to one person or device. UnlockLane does not install account permissions in your application.

3. Prove the complete flow

  1. Confirm test mode in the dashboard and Stripe checkout. Use only Stripe’s test payment details.
  2. Run the connection check. An authenticated response proves the site/key pair, not payment completion.
  3. Complete a test checkout and save the code shown on the success page.
  4. Verify that code from your backend. Check the entitlement, future expiry, and test mode. Confirm invalid codes and network failures keep protected access locked.
  5. Test a subscription change in Stripe and confirm a signed Connect webhook reaches https://unlocklane.com/api/stripe/webhook. Then verify access again.

UnlockLane receives Stripe lifecycle events; it does not send webhooks to your application. The current handlers support paid checkout completion, asynchronous payment success, subscription updates/deletion, paid invoices, refunds and disputes. Platform collection requires an account webhook, while existing connected checkouts use Connect events. A configured signing secret is not evidence of successful webhook delivery.

Before a live launch, review merchant eligibility with Stripe and test cancellations, payment failures, and recovery. Test/live accounts and prices are separate in Stripe. UnlockLane stores each website’s environment permanently and keeps separate Stripe account connections. Existing records are retained in the sandbox. The operator configures STRIPE_LIVE_SECRET_KEY, STRIPE_LIVE_WEBHOOK_SECRET, and LIVE_PAYMENTS_ENABLED=true only after the appropriate live payment arrangement is confirmed. The live webhook endpoint is /api/stripe/webhook?mode=live; the existing endpoint remains test-only. Keep existing test credentials and ACCESS_CODE_SECRET unchanged. Switching credentials never converts a test website into a live website.

When a check fails

400 · Invalid request

Send valid JSON with the exact site slug. Verification also needs a nonempty access code.

401 · Key mismatch

Use this site’s key, not a Stripe key or subscriber code. Check spelling, replacement keys, and whether your backend was redeployed.

409 · Sandbox mismatch

The dedicated sandbox requires Stripe test credentials. Do not resolve this by granting real access.

503 · Service unavailable

Keep access locked and retry shortly. A timeout or error is never a valid entitlement.

200 · valid is false

Authentication worked. The access code may be incorrect, expired, revoked, or from a different site.

Redirect or HTML instead of JSON

Use the canonical API URL above and handle redirects manually. A browser page is not an API verification response.

Automatic access-code emails

After payment is confirmed, UnlockLane queues one code email per subscription. When Resend is configured, it submits the email automatically using the publisher’s saved checkout colors, font category, and site name. Customers can also copy their code on the confirmation page. Sandbox emails are marked TEST and must not activate paid access.

The operator must configure a Resend API key and a sending address on a verified domain. Messages display the publisher’s name via UnlockLane and use UnlockLane’s sending address; individual merchant sending domains are not supported yet. In the dashboard, Access-code emails shows a preview and recent submission status. Set each website’s Subscription management URL to its HTTPS account page on the registered domain. New emails name the website in the footer and link that name to this page; without a configured link the name remains plain text. ScrollXXX uses its subscription-section link by default. Previously queued emails keep their original footer and link. Queued or failed submissions can be retried by the site owner. Accepted means the provider accepted the message, not inbox delivery. Bounce and delivery notifications are not tracked. No scheduled email job runs; Payment notifications retry temporary submission failures, and the owner can retry from the dashboard.

If email is unavailable, save the code on the confirmation page and contact the publisher for help. Once an unconfirmed submission is 23 hours old, automatic retries stop to avoid duplicate emails; the operator must inspect the provider’s logs. Welcome emails are not sent on every renewal.

New ScrollXXX access-code emails use its dark charcoal-and-pink palette, independently of a saved light checkout design. Other websites keep their saved theme. Email clients can adjust appearance. Previously queued or delivered emails keep their original design; retrying does not restyle them.

Customer cancellation

Your server can call POST /api/v1/subscription with its site API key and a JSON body containing site, mode (test or live), action (status or cancel), the customer’s access code, and email. Authenticate the customer and take email from their verified account, never from an editable request field. UnlockLane requires that email and code to match a subscription for your site and checks its customer, plan, price, connected account and payment mode against the payment provider.

Show the subscription and current period to the customer before sending action: cancel with confirm: true. This only sets end-of-period cancellation; it does not issue refunds, change prices, revoke access early, or erase outstanding balances. The result reports status, cancelScheduled, endsAt, canCancel, and an opaque subscription reference after a fresh Stripe read. Your server can use that reference with /api/v1/entitlement to refresh a bound account without storing the customer’s access code. If a request is unconfirmed, check status before retrying. Separately scheduled subscriptions require publisher assistance.

Subscriber records

The owner’s Subscribers page lists subscriptions across their websites, including inactive records. Search by email or payment reference, filter by website and status, and open subscriber details for access-code status, the saved access period, and email submission history. Records update through payment confirmations and provider notifications; Refresh records reloads saved data, not provider records. Each row is a subscription, so one customer can appear more than once.

Prices shown are current plan prices, not collected payments. Invoice totals, refunds, card details, and scheduled cancellation dates are not stored here. The separate Earnings & payouts page records paid-invoice gross amounts and manual settlement reviews. Each subscription stores its payment environment, which is shown beside the record and does not change with runtime credentials. Access validity does not confirm redemption on the publisher’s website, and provider email acceptance does not confirm inbox delivery.

Data & current product limits

UnlockLane stores merchant account details, site and plan settings, subscriber email addresses, Stripe identifiers, subscription status, access-code hashes, processed webhook identifiers, earnings, payout requests, external payment references and operator audit notes, and email submission records including recipient, branding snapshot, attempts, and provider message ID. When email sending is configured, Resend processes the subscriber’s email address, access code, and message content to send the transactional email. UnlockLane does not store the plaintext code in its email queue. Recoverable merchant API keys are encrypted using the server’s access-code secret. Stripe hosts the payment form. The connection tester processes entered keys and codes without saving them; your own backend must also keep these values out of logs.

This is an early product. Public merchant registration uses ChatGPT sign-in. Live payment activation is controlled by the operator and subject to Stripe eligibility. There is no automatic code-to-user binding, outbound webhook delivery, automatic external money transfer, or self-service environment migration. The dashboard’s monthly plan value is a nominal total, not collected revenue or an accounting report. Contact the publisher for purchase support or subscription changes.

Back to UnlockLane