Changelog

What we shipped.

OpenPartner ships continuously. This page tracks the user-visible changes in reverse chronological order. For commit-level history, see GitHub.

Connect Stripe (beta): nothing to forward

  • Connect Stripe: on the hosted plan, Admin → Integrations → Connect Stripe installs the OpenPartner Stripe App on your own Stripe account. Checkout and Payment Link purchases, invoices, renewals, full and partial refunds, disputes and partner promo-code redemptions are then recorded from Stripe, with nothing forwarded from your server. How it works.
  • The app is read-only except coupons and promotion codes, and never moves money. Partners’ customer-discount codes are created in your Stripe for you.
  • One script tag, https://app.openpartner.dev/op.js, adds the partner click to Payment Links, Pricing Tables and Buy Buttons on your site, and keeps it in a first-party op_ref cookie for Checkout Sessions your server creates (client_reference_id: req.cookies.op_ref). A partner link straight to a Payment Link needs nothing at all.
  • With Stripe connected, a conversion forwarded under a Stripe invoice or Checkout Session id returns 409 recorded_from_stripe: Stripe’s record of the payment wins, so nothing is counted twice.
  • The app is in Stripe’s review for the Stripe App Marketplace. Until it’s listed, Stripe’s install screen labels it “Test version”.

Creator storefronts and tracked bookings

  • Creator storefronts: creators list priced packages (a sponsored post, a video, a newsletter spot, or “price on request”) on their public profile and turn booking requests on or off.
  • Anyone can request a package from a creator’s page. The request reaches the creator only after the sender confirms their email, and the creator accepts or declines from a bookings inbox.
  • Tracked bookings for brands: book a creator’s package from Discover creators for an agreed amount. When the creator accepts they become your partner on the offering, with a tracked link.
  • Pay on approval: the creator delivers the post links, you approve, and the amount is paid as a bonus through your program, billed like a bounty (10% of the booking on Revshare, 5% on Flex). Creators pay nothing.
  • Delivery checks: each delivered post is checked against the creator’s verified YouTube channel or site, for their tracked link, for its publish date and for reuse on another booking, with clicks on their link since delivery, shown as badges on Network → Bookings.

Password and Google sign-in; richer postbacks

  • Sign in with an email and password, or with Google, as well as with a magic link.
  • A publisher’s sub_id now passes through partner links to the conversion, and postback URLs can use {sub_id}, {status} and {sale_amount} alongside {click_id}.

Bonuses and performance bounties

  • Bonuses: pay a partner a reward that isn’t tied to a sale, from the partner’s commission page or with POST /bonuses. An externalRef makes retries safe, and bonus.* webhooks fire.
  • Performance bounties: set a target on partners’ attributed results, and partners who reach it are paid a bonus automatically. Results are re-checked before the bonus is approved.
  • Bonuses are billed like flat bounties: 10% of the bonus on Revshare, 5% on Flex.
  • Refunds that arrive straight from Stripe come off a bounty’s conversions and revenue too.

One script tag for Stripe Payment Links; verified creator accounts

  • Partner clicks reach Stripe Payment Links and embeds on your site with a single script tag, with a guided Stripe setup under Admin → Integrations.
  • Creators can verify their YouTube channel (a code in the channel description) and their website (a DNS record). Verified accounts carry a badge brands can see.
  • Edit a program’s destination URL and the domains partners may deep-link to.
  • Fixed commission amounts show in their own currency.

Country availability and sanctions screening

  • OpenPartner declines brands, partners and Network creators based in countries it doesn’t serve.
  • Partners are screened against sanctions lists, and a payout to a flagged partner is held for review.
  • Analytics load only after you opt in to cookies.

Stripe App, refunds API, renewals and multi-currency

  • Stripe App: hosted brands connect their own Stripe account through the OpenPartner Stripe App, so purchases, refunds and disputes flow in without pasting API keys.
  • Refunds and chargebacks over the API (POST /attribution/refunds). A partial refund reduces the commission in proportion.
  • A refund after the partner was paid is clawed back from their next payout, with no manual adjustment.
  • Renewals can stay with the partner who won the customer, even after the attribution window ends.
  • Brands that sell in other currencies work end to end, including currencies without cents such as JPY.
  • Refunded and reversed revenue is credited against your platform fee.
  • Headless programs can turn off portal access for partners, and a partners:create API scope lets your own app enroll them.
  • Partners who sign up on your join page fire partner.created and partner.activated webhooks.

Conversions API, API reference and commission slabs

  • One-call conversions by click id (POST /attribution/conversions) and a postback URL (GET /postback), for Stripe Payment Links, lenders and affiliate networks. Destination URLs accept a {click_id} macro.
  • A full API reference at /docs, generated from an OpenAPI 3.1 spec (/openapi.json), plus a headless guide and sample for in-app referral programs.
  • Commission slabs: pay a higher rate on larger sales (value bands) or as a partner’s results grow (performance tiers).
  • Custom commission terms for a partner can apply to one program instead of all of them.
  • Partners choose whether to join the OpenPartner Network, with an opt-in on your join page and in their settings. It’s never automatic.

Partner applications, large programs and dark mode

  • Join applications: ask applicants for their details on your join page, hold them for review, and get notified when someone applies.
  • Programs with tens of thousands of partners: a paged, searchable partner list and reporting built for that size, plus a headless API.
  • Light and dark mode, following your system setting by default.
  • Conversion ingest is idempotent: send an externalEventId and a retry never counts twice.
  • Commission and payout webhooks fire on every lifecycle change, and only once the change is saved.
  • Revoking a partner’s access to a program also retires their coupon for it.

Marketplace cover images and video

  • Programs on the marketplace can show a cover image and a YouTube, Vimeo or Loom video.
  • Featured programs list first on the marketplace and in creator Discover.

Setup reminders and branded emails

  • Setup reminders: brands and creators get a nudge when something is left to finish, such as a creator profile that isn’t complete yet.
  • Every transactional email uses your brand colors.
  • Coupon partners see the discount their audience gets, and retired codes stop attributing.
  • Brands can hide the Network pages from their own partners.

Complete data export; payments and security hardening

  • Data export covers every table, with a SQL dump and real primary keys, so an export restores cleanly.
  • A round of payment reliability work: usage billing is recorded exactly once, and a payout can no longer be sent twice.
  • Outbound webhooks and partner postbacks refuse internal network addresses.

Brand review and marketplace quality

  • New brands are reviewed before their programs go live on the marketplace, which keeps spam off it.
  • Taking down a brand or program removes it from the marketplace straight away.
  • Creators appear to brands only once their profile is complete.

Brand colors, favicons and checkout promo codes

  • Upload a favicon and set a brand color for your partner portal.
  • Enter a promotion code when you choose a plan.
  • Send a test email from Settings → Email delivery.
  • Partner links show their full, copyable URL.

White-label add-on

  • Run your partner portal on your own domain, like partners.yourbrand.com, with the certificate handled for you. Partners see your brand only: no OpenPartner name or logo anywhere they look.
  • Sign-in links, invites and your public /join page all use your domain, and email can go out from your own address.
  • White-label programs are kept off the shared marketplace.
  • Turn it on from White label in your dashboard: $49/month on top of Revshare or Flex, prorated, with a step-by-step domain setup.

Mobile-friendly portal

  • The brand and creator portals work on phones: a slide-in menu, stacked layouts and scrollable tables.

Brand kit, payout preferences and workspace switcher

  • Brand kit: share logos, product shots and guidelines with partners from an asset library. Partners find them under Resources.
  • Payout preferences per brand: choose the payout rail, a minimum payout and how often payouts run.
  • Sign in to several brands at once and switch between them from the sidebar.

Renamed Campaign → Program; categories on programs

  • Renamed the Campaign object to Program across the stack — matches Dub, Tolt, PartnerStack, ShareASale and the everyday brand vocabulary. The original "Campaign" naming was Rewardful-inspired and implied a time-bounded promo, but the object actually represents an ongoing partner program.
  • DB rename of Campaign → Program + PartnerCampaign → PartnerProgram, plus all FK columns (campaignId → programId on Click, Link, Attribution, Coupon, PartnerProgram) and constraint names. RLS policies and route paths (/campaigns → /programs) updated.
  • Network wire contract: Offering.vendorCampaignId → vendorProgramId, federation client’s CreateLinkInput field renamed.
  • New: industry categories on programs. Multi-select from a curated 16-entry list (SaaS, AI, DevTools, Marketing, Sales, E-commerce, Finance, Education, Productivity, Design, Media, Analytics, HR, Communication, Security, Other). Capped at 5 per program.
  • Discover page filter for Category. Card chip strip surfaces up to 2 categories alongside the lead commission chip.

Collapsed Campaign + Offering split — one brand-facing object

  • Brands no longer manage a separate "Network → Offerings" page. Every campaign carries a `shareOnNetwork` toggle (defaults ON when connected to the Network) and an optional `marketplaceDescription`. Saving the campaign auto-upserts the marketplace listing.
  • Campaign edit form now exposes the marketplace toggle + description inline. The "Network → Offerings" sidebar item is gone; the route is removed from the admin app.
  • Offering rows still exist on the Network as the marketplace’s storage backing — they’re just no longer something a brand admin opens. Federation push from OpenPartner keeps them in sync.
  • Dropped the dead `Offering.heroImageUrl` column on the Network side — it existed in schema since v1 but was never exposed in any form or rendered anywhere.
  • Title field on offerings: gone. Marketplace card titles use the brand’s name; the campaign’s internal name is admin-only. Multi-positioning variants on a single campaign deferred until anyone actually asks.

Compound commission rules, dual-sided customer rewards, derived offering summary

  • Compound commission rules: a campaign now carries an array of triggered sub-rules. Three triggers — every / first / subsequent — combine to express offers like "$200 first-sale bonus + 20% recurring for 12 months" or "50% on first invoice, 20% on every subsequent" without engine workarounds.
  • Recurring months cap: optional N-month limit on any recurring sub-rule, measured from the partner’s first attributed event of that type. Pairs with the campaign end date — whichever fires first wins.
  • Dual-sided customer rewards: brands can offer a customer-side discount alongside the partner commission. Auto-provisioned as Stripe Coupons + Promotion Codes on every minted partner code so the discount applies automatically at the brand’s Stripe checkout. Three shapes (% off, $ off, free months) × three durations (once / forever / first N months).
  • Derived offering summary: the marketplace commission line is now rendered server-side from the rule + customer reward. The freeform "Commission summary" input is gone — anti-fraud guarantee that brands can’t promise something the engine wouldn’t pay out on.
  • Dub-style marketplace card: logo + brand name lead, line-clamped description, derived commission as the lead chip, "Dual reward" accent chip when configured. Fixed-height cards line up regardless of copy length.
  • PartnerCommission snapshot extended to carry the full compound rule array — partners stay grandfathered on the exact rule they were approved under, even after a brand edits the live campaign.

Creator profile depth, performance directory, custom share domains

  • Creator profiles get categories, audience demographics, per-platform handles + follower counts, sample work, past collaborations.
  • Public profile pages at /creators/ — brands can browse before approving.
  • Brand-side **Discover creators** directory with filters on category, location, platform, follower range, and 90-day revenue.
  • Per-creator 90-day performance aggregates (clicks, conversions, revenue, commission) computed nightly via federation pull. Unique vs Modash/Aspire — they have follower counts but not conversion data.
  • Creator-owned custom share domains: point share.you.com → router.openpartner.dev → branded share links across every brand you partner with.
  • Caddy-fronted router droplet with on-demand TLS so adding a new domain auto-provisions Let’s Encrypt.

Per-partner campaign scoping, Network application flow, end-of-campaign reminders

  • Brands can scope a partner to specific campaigns (e.g. VIP partner with private 30% revshare). Default behavior preserved (grant all current campaigns) when scoping not specified.
  • Network application + approval flow end-to-end: creator signs up, browses offerings, applies, brand approves, federation provisions a Partner row + Link on the brand instance.
  • Brand admin invite-time UX: Programs dialog scopes existing partners; new invitations can pick campaigns at creation.
  • 7-day end-of-campaign notification emails to brand admin + active partners so nobody gets surprised.
  • Brand-aware From + Reply-To chain on transactional emails (Acme via OpenPartner with Acme’s support email replying).

Multi-tenant + Network foundation

  • Multi-tenant deployment at app.openpartner.dev with /t/ URL routing + RLS isolation.
  • OpenPartner Network: federated creator marketplace at network.openpartner.dev. Creators sign up once, apply across many brands.
  • Creator portal: signup, profile, discover, apply, partnerships, share links.
  • Brand-side Network connection: list your brand, publish offerings, review applications, auto-enroll new partners.
  • Click recording on creator domains with federation push back to brand instance for attribution.

OpenPartner v1 (initial public release)

  • Click router with first-party-cookie attribution that survives Safari ITP via cref query param + identity stitching.
  • Configurable attribution models: last-click, first-click, linear, position (40/20/40).
  • Campaign + commission engine: percent or fixed, recurring or one-time, with attribution windows.
  • Partner portal: magic-link signin, share links, commissions dashboard, payout history, Stripe Connect onboarding.
  • Brand admin: campaigns, partners, review queue, commissions approval, payouts via Stripe Connect Standard.
  • Three deployment shapes: self-host (free), hosted Flex ($49/mo + 1.5% GMV), hosted Revshare (3% GMV).
  • SDK published: @openpartner/sdk for browser identify + event tracking.