Skip to content

How I Built OpenPromoter: Open Source Affiliate Software for SaaS

How I Built OpenPromoter: Open Source Affiliate Software for SaaS

OpenPromoter is open source affiliate software that I built for SaaS companies that bill through Stripe and similar tools. It tracks partner referrals, books commissions from paid invoices and pays partners without taking a share of the payout.

The idea grew out of DevDiggers, where we have sold an affiliate plugin for WooCommerce stores since February 2023. Before writing this post, I checked eight other open source affiliate projects on GitHub on 12 November 2026 and read every README.

Below you will find why I started, what hosted tools cost and how the first week of building went. After that come the open source options side by side and the four design decisions behind OpenPromoter. The last part shows how to run it on your own server.

What OpenPromoter Does for a SaaS Affiliate Program

OpenPromoter runs an affiliate program for a SaaS business, from the first partner click to the payout. Partners get links and promo codes, billing webhooks turn paid invoices into commissions, and refunds reduce or reverse them. Payouts go out through your own Stripe, PayPal or Wise account once a person approves the batch.

It works with five billing systems out of the box: Stripe, Paddle, Lemon Squeezy, Polar and Chargebee. Any other billing tool can report payments and refunds through the REST API, which is how a custom checkout plugs in.

OpenPromoter open source affiliate software dashboard

The whole product lives in one GitHub repository under the AGPL-3.0 license. Self-hosting includes every feature, with no limit on partners, programs or tracked revenue.

For teams who prefer not to run a server, OpenPromoter Cloud is free up to $1,000 a month in partner revenue. Paid Cloud plans cost $29, $79 or $199 a month, and none of them takes a cut of what you pay partners.

You can click through a working account in the live demo with no sign-up and no card. It holds sample partners, commissions and payouts, and it rebuilds itself every day.

Why I Built Open Source Affiliate Software for SaaS

I built open source affiliate software for SaaS because subscription businesses kept hitting the same problems I had seen in store affiliate programs. The hosted tools that solved those problems were closed source, and several charged a percentage of every payout. That fee grows each time a partner sells well.

DevDiggers has sold a WooCommerce affiliate plugin since its first release on 6 February 2023. Online stores use it to run their own affiliate programs, and its changelog reached version 2.4.0 on 28 October 2026.

DevDiggers is also listed in Stripe’s Partner Directory. Our Stripe App, Affiliate Payouts by DevDiggers, pays store affiliates through Stripe Connect. I knew how Stripe moves partner money before OpenPromoter had a single line of code.

Building and supporting that plugin showed me where partner programs break. The same three failures kept coming back:

  • Refunds paid out: A customer gets a refund after the commission has already gone to the partner, and nobody claws it back.
  • Self-referrals: A partner buys through their own link, and the store only notices after the money has left.
  • Spreadsheet payouts: One person tracks who is owed what, and the whole program stalls when that person is away.

SaaS makes each of these harder. A store order is paid once, while a subscription can pay a commission every month for as long as the customer stays.

So a missed refund or a chargeback has to reach every commission row it touched. A self-referral that slips through keeps earning until someone catches it.

When I went looking for the SaaS version of our plugin, every serious option was a hosted service with closed code. I wanted something I could read line by line, run on my own server and change when a program needed it. Nothing on GitHub did all of that, which the comparison further down shows in detail.

What Hosted SaaS Affiliate Software Costs as You Grow

Hosted SaaS affiliate software charges you in two ways: a monthly plan and, on some tools, a fee on every payout. The plan price stays flat until you outgrow a revenue cap. The payout fee grows with every dollar you send partners, and at scale it can cost more than the plan itself.

Here is what the payout side looked like on each vendor’s own pages in November 2026:

ToolFee on payoutsWhat the vendor states
Rewardful0%, or 3% with optional Managed PayoutsStarter plan from $49 a month up to $7,500 in affiliate revenue
Tolt2% of what is paid outPayouts by PayPal, Wise, bank transfer or wire
Dub Partners5% by ACH, 8% by card on Business and AdvancedEnterprise drops to 3% and 6%
OpenPromoter0% on every planFree to self-host or free on Cloud up to $1,000 a month

The Rewardful fee comes from its Managed Payouts FAQ, which states “a 3% processing fee on all payouts”. Dub lists its rates on the partner payouts help page. Tolt’s 2% fee appeared on its pricing page in November 2026.

Now a worked example. Say your partners earn $10,000 a month in commissions and you pay all of it through the tool:

  1. Tolt at 2%: $200 a month, or $2,400 a year.
  2. Rewardful Managed Payouts at 3%: $300 a month, or $3,600 a year.
  3. Dub by ACH at 5%: $500 a month, or $6,000 a year.
  4. OpenPromoter at 0%: $0 in platform fees, at any volume.
Yearly affiliate payout fees on $10,000 a month compared

Those numbers come straight off your margin. Lifetime commissions only make sense once you know your customer lifetime value, and a payout fee is a second cut taken from the same customer.

Worth knowing: A 0% platform fee does not make payouts free. Stripe, PayPal and Wise still charge their own transfer fees, and those apply on every tool in this table.

A fee is not wrong in itself. Managed payouts save real work on tax forms and partner onboarding. My point is narrower: the cost should not scale with your partners’ success unless you choose that service on purpose.

The Open Source Affiliate Tracking Tools I Checked First

Open source affiliate tracking tools do exist, but on 12 November 2026 most of them were early, quiet or missing the payout step. I checked eight projects on GitHub and read each README. Only two of them stated both billing webhooks and a built-in payout step.

The table is sorted by GitHub stars, which puts OpenPromoter last. Each cell reflects the project’s own README on that date, plus its code where a note below says so. “Not stated” means the README did not mention it.

ProjectLicenseBuilt withBilling dataPayoutsLast commitStars
WeferralMITJavaScriptREST APINot statedJune 2024290
RaiderMPL-2.0RustYour backend reports each paymentPartners request payouts by emailOctober 2026254
RefRefAGPL-3.0TypeScriptNot stated in the READMENot statedMarch 2026244
RefferqMITTypeScriptNot stated in the READMERecorded with a method labelOctober 2026138
eLitiusNone listed on GitHubPHPNot statedNot statedArchived in September 202262
NumokMITPHPStripe webhooksOpen question in issue 11January 202660
RefearnAppAGPL-3.0TypeScriptStripe and PaddlePayPal mass payoutsOctober 202649
AffiliateTrackingAGPL-3.0GoStripe and Paddle plus four morePayPal and Wise bulk-pay filesNovember 202625
OpenPromoterAGPL-3.0TypeScriptStripe and Paddle plus three moreStripe Connect and PayPal and WiseNovember 20268

A few notes the table cannot hold:

  • Weferral: Its README says it is “not production ready yet”, and the last commit is from mid-2024.
  • Raider: It is a mature affiliate dashboard used by Crisp, but your own code must report payments to it.
  • RefRef: The README warns that it “is still in alpha” and to expect breaking changes.
  • Refferq: Its package list has no Stripe, PayPal or Wise library, so a payout is a record you settle by hand.
  • Numok: It tracks Stripe sales well, and issue 11, titled “How do payouts work?”, has been open since November 2025.
  • AffiliateTracking: It is the closest match to what I built, and it appeared on GitHub six days before OpenPromoter went public.
Open source affiliate tracking projects compared on billing and payouts

One bigger name is missing from the table on purpose. Dub’s partner program code sat under a commercial license inside its public repository. Pull request 4783, merged on 26 October 2026, removed it, and the main branch no longer holds the partner program files.

Before you trust an open source affiliate program with real money, check three things in its repository:

  1. Last commit date: A project with no commits in six months will not keep up with billing API changes.
  2. Open issues about payouts or security: Read the titles. They tell you what users hit in production.
  3. Sent or recorded payouts: Search the code for a payout provider’s library. A free-text “method” field means you still pay people by hand.

Four Decisions That Shaped OpenPromoter

Four decisions shaped OpenPromoter more than any feature list did. The license had to keep the whole product open, attribution had to survive a lost cookie, and the ledger could never pay twice. The fourth was a hard rule that software can prepare a payout but never approve one.

1. AGPL-3.0 for the App and MIT for the Code You Install

The app and server use AGPL-3.0, which closes the hosting loophole that a plain GPL leaves open. Section 13 of the AGPL-3.0 text says a modified version “must prominently offer all users interacting with it remotely” its source.

In practice, anyone can self-host OpenPromoter for free. A company that runs a changed version as a service for others must publish those changes.

The pieces that go inside your own product use MIT instead: the SDK, the CLI, the MCP server and the tracking script. That keeps your own codebase free of any AGPL duty. There is also no enterprise folder, so every feature ships in the one repository.

OpenPromoter license section with AGPL-3.0 and MIT packages

Cookies get blocked, cleared and declined, and a commission that depends on one cookie gets lost often. So the tracking script stores a click ID in a first-party cookie and also passes it into Stripe Checkout.

It travels in the session’s client_reference_id field. Stripe’s Checkout Sessions API describes that field as a string that “can be used to reconcile the session with your internal systems”.

Promo codes attribute a sale with no click at all, which suits podcast and video partners. Consent mode writes no cookie until your banner allows it, and the click ID still reaches Checkout either way.

OpenPromoter partner portal with a referral link and QR code

3. A Ledger That Never Pays a Commission Twice

Webhooks are messier than they look. Stripe’s webhooks guide states that Stripe “doesn’t guarantee the delivery of events in the order” they happen. It also warns that an endpoint “might occasionally receive the same event more than once”.

So every commission row in OpenPromoter is unique on a source key, such as the Stripe invoice ID or the refund ID. A replayed event finds the row already there and stops, and a late refund still finds the sale it belongs to.

Each commission moves from pending to approved once your hold period ends. Approved commissions then join the next payout.

A refund after payout creates a negative row that comes off the next payout. Nobody has to chase the partner for the money.

OpenPromoter commission ledger with pending and held tabs

4. Only a Person Can Approve a Payout

OpenPromoter has AI features, an API, a CLI and an MCP server for coding agents. Any of them can prepare a payout batch, and none of them can approve one. Only a signed-in owner, admin or finance team member can, and a large batch asks for a fresh two-factor code.

Fraud checks run before that step. Every referral gets a risk score from 0 to 100 built from 11 published signals, such as self-referrals and shared networks. Commissions above your threshold wait in a review queue.

OpenPromoter payout approval queue waiting for a person

From First Release to v0.1.1 in One Week

OpenPromoter went from its first public release to version 0.1.1 in one week. Version 0.1.0 shipped on 3 November 2026 with tracking, payouts and fraud checks already working. The GitHub repository opened on 6 November, and version 0.1.1 followed on 10 November with 18 changes.

The dates below come from the public OpenPromoter changelog and my own build notes:

  • Before 3 November: I read the pricing, payout and tax pages of the main hosted tools and the code of every open source project I could find.
  • 3 November: Version 0.1.0 shipped with 29 changes, including the commission ledger, five billing webhooks and three payout rails.
  • 4 November: I rejected the first dashboard design and rebuilt it from a new set of references.
  • 5 November: The marketing site moved to a static build in a private repository, while the product itself stayed open.
  • 6 November: The GitHub repository went public under AGPL-3.0.
  • 9 November: The SDK, CLI and MCP server went live on npm, and the public demo opened.
  • 10 November: Version 0.1.1 added a prebuilt Docker image for amd64 and arm64, plus an eleventh fraud signal.
OpenPromoter build timeline from v0.1.0 to v0.1.1

A week sounds fast, and the scope was set long before the first release. Most of the work went into the parts nobody sees in a demo, like refunds, duplicate webhooks and payout approval.

Claude Code wrote nearly all of OpenPromoter’s code. My job was the part an agent cannot own.

I decided what to build, set the money rules, reviewed its work and tested every payout path. That split is how one person shipped it in a week.

What I Changed My Mind About While Building It

Three things changed my mind while building OpenPromoter. Stripe’s own docs pointed me to a different payment event than the obvious one. A load test showed the first dashboard was far too slow at scale, and the first website build was slower than it needed to be.

The obvious event for booking a commission is invoice.payment_succeeded. Stripe’s event reference says invoice.paid “occurs whenever an invoice payment attempt succeeds or an invoice is marked as paid out-of-band”.

That second half matters for B2B SaaS. A customer who pays by bank transfer and gets marked as paid by hand should still earn the partner a commission. That is why OpenPromoter books on invoice.paid.

The dashboard was the second surprise. With 10 million clicks and 1 million conversions loaded, its first queries took about 5 seconds. A daily click rollup table and new indexes brought the same queries down to 182 ms.

The website was the third. The first version scored 91 to 96 on Lighthouse, with a 2.9 second Largest Contentful Paint. Rebuilt as a static site, it now scores 100 and paints that element in 1.8 seconds.

OpenPromoter changelog showing the v0.1.1 release

None of these were clever fixes. Each one came from reading the vendor’s docs closely or from testing with far more data than a new program will ever have.

Running OpenPromoter as Self-Hosted Affiliate Software

Running OpenPromoter as self-hosted affiliate software takes Docker and a server you control. One command starts the app, a Postgres database and a seeded demo workspace on your own machine. A production server then needs five settings: the database URL, the public URL, two secrets and an email sender.

These three commands clone the repository and start everything:

git clone https://github.com/openpromoter/openpromoter
cd openpromoter
docker compose up
Self-hosted affiliate software quick start in the OpenPromoter docs

After that, the setup takes a few steps:

  1. Open the demo workspace: The README lists the local address and the demo login, with 100,000 sample clicks and 10,000 conversions loaded.
  2. Check the test emails: Every email the app sends lands in Mailpit, which runs inside the same Docker setup.
  3. Set the production values: Add DATABASE_URL, APP_URL, BETTER_AUTH_SECRET, ENCRYPTION_KEY and SMTP_URL, and set SEED_DEMO to false.
  4. Connect billing: Use a Stripe restricted key, which Stripe’s own API keys guide recommends “wherever possible”.

The container refuses to start on a public URL while the placeholder secrets are still in place. That one check stops the most common self-hosting mistake before it reaches the internet.

The self-hosting guide covers Railway, Render and upgrades. Render users can deploy with one button, since the repository ships a ready render.yaml file.

When Hosted Affiliate Software Is the Better Pick

Hosted affiliate software is the better pick when nobody on your team wants to run a server. A vendor also gives you support with a response time, years of track record and public reviews. OpenPromoter went public on 6 November 2026 and has none of that history yet.

It is the same trade you make between self-hosted WordPress and a hosted site builder. You get control and lower costs, and you take on updates, backups and uptime.

Pick a hosted tool when:

  • You have no developer: Someone has to update the container and watch the database.
  • You need help on call: Open source support happens in GitHub issues and has no support desk behind it.
  • Your volume is small: At $500 a month in commissions, a 2% fee is only $10.

Pick self-hosted when your payout volume is large, your data must stay on your own servers or you want to change the code.

OpenPromoter Cloud sits between the two. Say you are starting an affiliate program for SaaS and want neither a server nor a payout fee. Its free tier covers the first $1,000 a month in partner revenue.

Where It Meets Our WooCommerce Affiliate Plugin

OpenPromoter and our WooCommerce plugin solve the same job for two different kinds of business. A store selling physical or digital products through WooCommerce should use the plugin. A SaaS selling subscriptions through Stripe or Paddle should use OpenPromoter, since the plugin never sees those invoices.

The plugin starts at $99 a year, with a free version on WordPress.org. Our guide to the best WooCommerce affiliate plugins compares it with the other options for stores.

If you want customers to refer friends rather than run a partner program, read how to add a referral program to WooCommerce first. Both products share one habit I learned from store owners: hold commissions until the refund window closes.

OpenPromoter by the Numbers

OpenPromoter reached version 0.1.1 in November 2026 with five billing integrations, three payout rails and eleven fraud signals. The figures below are as of 12 November 2026. They follow the same format I used when I wrote about how I built Tabisto, our Chrome extension.

  • Billing tools: Five have built-in webhooks, and the REST API covers the rest.
  • Payout rails: Stripe Connect Express, PayPal Payouts, Wise and a CSV export.
  • Fraud signals: Eleven, published on the site and applied on every plan.
  • Tests: 73 unit test files for commission math and refunds. End-to-end browser tests run the full flow from click to payout.
  • GitHub stars: Eight on the day I wrote this post, which is where every open source project starts.

The next features come from people who run programs. That is why the roadmap stays open. If something is missing for your setup, open an issue or post in GitHub Discussions.

Conclusion

OpenPromoter is the open source affiliate software I wanted when I went looking for the SaaS version of our WooCommerce plugin. It keeps the code readable and the data on your server, and it takes 0% of every payout.

Two takeaways matter whichever tool you pick. First, check how a vendor charges for payouts, because a percentage fee grows faster than any plan. Second, check whether an open source project sends money or only records it.

If you run a SaaS on Stripe, Paddle, Lemon Squeezy, Polar or Chargebee, try the live demo first. Then self-host it, or start on the free Cloud plan.

Frequently Asked Questions (FAQs)

Q1. Is open source affiliate software really free?

The license costs nothing. You can download, run and change the code without paying anyone. You still pay for your own server, the Postgres database, outgoing email and the transfer fees that Stripe, PayPal or Wise charge.

Q2. Is there open source affiliate marketing software that works with Stripe?

Yes. On 12 November 2026, Numok, RefearnApp, AffiliateTracking and OpenPromoter all stated Stripe support in their READMEs. Numok tracks the sale, but its README does not describe a payout step.

Q3. Does a GitHub repository mean the software is open source?

No. The license decides that, and it should be one approved by the Open Source Initiative. Some public repositories list no license at all, and some keep paid features under a separate commercial license.

Q4. How secure is self-hosted affiliate tracking?

It is as secure as the server you run it on and the updates you apply. Use a restricted billing key, keep secrets out of the repository and apply new releases. OpenPromoter encrypts stored provider keys and tax IDs.

Q5. Can I move from Rewardful or FirstPromoter to OpenPromoter?

Yes. Export your affiliates as CSV and drop the file into Settings > Import. Partners keep their referral codes, and old links with ?via= or ?fpr= keep working.

Q6. Who builds OpenPromoter?

I do. I am Yash Kapoor, the founder of DevDiggers, which builds WordPress and WooCommerce plugins. OpenPromoter is a separate open source project that brings what we learned from store affiliate programs to SaaS.

Q7. Was OpenPromoter built with AI?

Yes. Claude Code wrote nearly all of the code, and I set the architecture and the money rules and reviewed every change. AI can prepare a payout but never approve one, and 73 unit test files check the money paths.

Q8. How much technical skill does self-hosting take?

You need to be comfortable with Docker, environment variables and a Postgres backup. If you have deployed a web app with Docker before, the self-hosting guide walks you through every remaining step.

Yash Kapoor
Yash Kapoor

Yash Kapoor is the founder and WordPress expert at DevDiggers, where he builds WordPress and WooCommerce plugins for loyalty programs, point-of-sale systems, digital wallets and affiliate management. He writes about developer tools, site performance and the technical side of running a WordPress store. He draws on years of building and maintaining production plugin codebases.

Leave a Reply

Your email address will not be published. Required fields are marked *