Selling with OfferLab affiliate links in your app

OfferLab hosts its own checkout and handles the commission split, so your app only routes buyers to the right link — here's the pattern, plus what OfferLab's webhooks can and can't do.

If you're building something where other people sell through your app — a virtual summit, a bundle, a launch, a collab — OfferLab is a natural fit, and it works well alongside an OverSkill app today.

The most important thing to understand up front is that your app never handles the money.

💬 Ask your AI to set this up Paste this into your app's chat:

Add an offers table with a name, a default OfferLab link, and a sort order, plus a page that lists each offer with a Buy button pointing at its link. Then add a per-promoter override: a promoters table with a URL slug, and an overrides table that maps a promoter to their own OfferLab link for a given offer. When someone visits /p/{slug}, swap in that promoter's link for any offer they've overridden, and fall back to the default link otherwise. It must work for visitors who aren't logged in. If any part of this isn't available on my account yet, say so honestly instead of guessing.

The AI builds the app. Creating the offers and getting the affiliate links is done by you (and your promoters) inside OfferLab — the AI can't create OfferLab offers or set commission rates for you.

Why this is simpler than it sounds

OfferLab is a full selling platform, not a tracking script you bolt onto your own checkout. When a buyer clicks an OfferLab link:

  • The purchase happens on OfferLab's checkout, not in your app
  • OfferLab splits the revenue and pays the seller and the affiliate
  • Commission rates are set by the offer owner in OfferLab (anywhere from 1% to 100%)
  • Sellers are paid out via Stripe; affiliate commissions clear after a 30-day hold

So your app's only job is showing the right link to the right visitor. No payment code, no commission math, no payout logic, and none of the compliance surface that comes with handling other people's money. That's the whole integration for most builds.

Nearly every multi-seller app on OverSkill comes down to the same shape:

  1. An offers list — each offer stores a name and its default OfferLab link
  2. A promoter/affiliate list — each one gets a URL slug, e.g. /p/jane
  3. An overrides table — maps (promoter, offer) to that promoter's own OfferLab link

When someone lands on /p/jane, you show Jane's link for any offer she's overridden, and the default link for everything else. That's it — and because it's just link selection, it works for anonymous visitors with no login required.

This scales to as many tiers as you need. A super affiliate who has signed up as an affiliate for every offer is just a promoter with an override row for each one.

The manual step to plan for

OfferLab's public API cannot create affiliates or set commission rates for you. The REST API covers products, order invoices, and customers — and OfferLab's own developer docs label the API reference as Zapier only. There's no endpoint to provision an affiliate or configure a commission percentage programmatically.

In practice that means:

  • Each promoter signs up on OfferLab themselves and requests to promote the offers they want
  • They paste their own affiliate link into your app (a simple form field is fine)
  • The offer owner approves the collaboration and sets the commission rate inside OfferLab

Budget for that onboarding step. It's a handful of minutes per person, but it isn't something your app can automate away, and it's the single most common surprise on this build.

Unlocking content after a purchase (webhooks)

If buying should unlock something in your app — replays, a members area, a course — OfferLab can tell your app when a purchase happens. It supports outbound webhooks with a solid event list, including:

  • orders/invoice.paid — the key event for granting access. Fires on the initial payment and on every subscription renewal.
  • order.completed — fires once per order (for subscriptions, only the first time — not on each renewal)
  • subscription.deleted — fires when a subscription is cancelled or expires, so you can revoke access
  • team.affiliate_signed_up — fires when someone signs up through your referral link

To wire this up, ask your AI for a public API endpoint at a path like /api/webhooks/offerlab, then add that URL as a new subscription under Settings → Webhooks in your OfferLab team account and subscribe to the events you want.

Three things that will save you real debugging time:

Grant access with the built-in role helper. Have the endpoint call the platform's assignRole helper to give the buyer a role like member. The role has to exist on your app first — ask the AI to create it — and the new role appears on the user's next sign-in or token refresh, not instantly. Tell buyers to refresh if they don't see it right away. If you grant by email for someone who has never logged in, the role attaches on their first login.

Never trust the request body for who gets what. The endpoint is public, so an OfferLab webhook handler must decide the role itself and match the buyer against the payload's verified email. An endpoint that grants whatever role the request asks for is an open door — anyone can call it and promote themselves.

A successful URL check does not mean it works. OfferLab validates your webhook URL with a HEAD request before saving the subscription. OverSkill apps answer HEAD on any path with a 200 from the page itself, so validation passes even if your endpoint doesn't exist or isn't deployed yet. Confirm the endpoint is genuinely live by asking the AI to verify it, then send a real test purchase and check that access actually got granted.

Also worth knowing: OfferLab is listed on Zapier, so if you'd rather not handle raw webhooks you can route OfferLab events through Zapier into your app instead.

Hosting the videos

For summit replays and similar content, embedding is usually the better call:

  • Unlisted YouTube or Vimeo embeds — recommended. Free, fast worldwide, adaptive quality on slow connections, and mobile playback just works.
  • Uploading video files directly into your app — supported, and there are no bandwidth or egress fees to worry about. But OverSkill doesn't re-encode video, so viewers download the original file exactly as you uploaded it. A 90-minute raw recording is a rough experience on a phone. If you upload directly, compress first.

Gating replays behind the paid upgrade

The natural setup for a summit is free (or cheap) live access, with replays as a paid upgrade. Enforce that on the server, not in the browser — the check for has this person paid? must live in your app's backend, tied to the signed-in user's identity.

It's worth saying this explicitly in your prompt: enforce replay access on the server side, not just by hiding the UI. Hiding a locked video behind a client-side check looks correct while leaving the actual video reachable by anyone who knows where to look.

Was this helpful?

Thanks for the signal — it helps us improve the docs.

More in Integrations

Connecting Slack to your app

Post messages to channels, send DMs, react to events — Slack as your app's notification system.

Connecting Stripe for payments

Process payments through your own Stripe account instead of OverSkill's built-in checkout.

Connecting to the ClickFunnels API

Two ways to connect your OverSkill app to ClickFunnels — an API key for your own workspace, or OAuth 2.0 for letting other ClickFunnels users connect their own accounts.

Still need help?

If this didn't answer your question, our team is one click away.