Changelog

What we shipped.

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

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.