A self-hosted leaderboard where placement is bought, not negotiated. Every listing is ranked by how much it has paid. To move up, pay more than the listing above you — and what you have already paid keeps counting.
Follow one board through four bids. The numbers are the whole product — this is the arithmetic your sponsors will be doing.
Your board has a minimum bid — say $50. The first listing pays it and holds number one alone.
Passing a listing costs its total plus your increment. With a $1 increment, taking the top costs $51. The board shows that figure on every row, so nobody has to ask.
Northlane has $50 sunk into the board already. To get back above $51 they pay $2, not $52. This is the part that keeps people bidding: the money already spent is not wasted, it is a running start.
Neither of them can get their money back by stopping, so stopping feels like losing. Each exchange is small; the total climbs well past what either would have agreed to at the start. That pressure is the mechanic, and it is why the board is worth more to you than a flat monthly rate.
A score that shrank over time would extract more money, and it would read to your sponsors as the site quietly eating their budget — which you, not the software, would have to defend. Totals here are permanent.
That mechanic produces one very large number and a top spot nobody new can afford. So every board also ranks on a rolling 24-hour window, and that is the view visitors land on.
Ranked by what each listing spent in the last 24 hours. Yesterday's leader does not hold today's top spot, so the price of #1 resets to something a newcomer will pay — and there is a reason to come back tomorrow.
Ranked by everything ever paid, never expiring. This is the trophy: the listing that has committed the most, and the number that keeps climbing.
Both are the same payments seen through different windows, not two running totals. There is one number to keep honest, and a nightly job that checks it.
One page, ranked by total paid, updating itself as bids land. Every row shows what it costs to pass it.
Ranks and amounts refresh every few seconds and rows change places, with a live activity list showing who just moved and by how much.
A shareable page per sponsor with a generated social image showing their rank — so the people who paid do your marketing, because the rank is worth showing off.
Run one ranking or twenty from a single install. Each has its own listings, its own minimum bid, its own increment and its own number one.
Before anyone has bid, the board names the prize instead of showing a blank table — the first listing takes the top spot alone.
Every outbound click is counted and shown on the row. This is what a sponsor actually bought, and the number that makes their second bid easy to justify.
Filter chips across the top, with counts. A visitor looking for one kind of thing finds it, and a sponsor competes with their own kind rather than everybody.
The URL field and category picker sit in the board's header, above the ranking. Nobody has to find a second page to get listed.
Boards, moderation, revenue and an audit trail. Everything below is in the download.
Minimum bid and minimum increment, per board. A small increment keeps the board lively; a large one makes each move count. You can change either at any time without disturbing existing listings.
For somebody who paid you by invoice, or to launch a board with something on it. The amount is recorded as a real payment, so it shows in revenue and survives the nightly reconciliation.
Hide or remove a listing and its payment history stays. Deactivate a whole board rather than deleting it — those listings were paid for.
Every administrative action, with the acting user and, for anything changed, the state on both sides of it. Useful when there are two of you, essential when a sponsor disputes something.
This is a product where a bug costs you real money and a sponsor's goodwill. These are the specific things it does about that, rather than a claim that it is secure.
Checkout sessions are created on your server with an amount your server computed. Editing the form does not buy the top spot for one cent.
Not from the page, and not from anything sent back to your site — from Stripe's own record of what was actually charged.
A refund or a dispute drops the listing by exactly that amount. Without this, somebody pays for number one, reverses it through their bank, and keeps the spot.
Stripe retries when it does not get a clean answer. A replayed event is recognised and ignored, so one payment cannot become two.
Two payments confirming in the same instant are serialised, so neither overwrites the other's total.
Every listing's total is re-checked against its actual payments and corrected if the two ever disagree. The payments win — they are the record of money that moved.
They cover exactly the cases above: duplicate webhooks, refunds, disputes, forged signatures, concurrent bids, cross-user access and hostile URLs. The suite runs on MySQL, which is what you will deploy on.
Upload, create a database, open the site. The installer checks your server before you type anything and tests the database connection before it writes any settings.
Unzip and upload. Dependencies and compiled assets are already inside — no Composer, no Node, nothing to build on your server.
public/Or use the public_html arrangement the documentation describes if
that is all your host gives you.
Fill in one form: database, site address, currency, your administrator account. Optional sample data so you are not staring at an empty board.
Paste your keys and create one webhook. The documentation names the exact three events to subscribe it to.
| PHP | 8.3 or newer, with pdo_mysql, mbstring, openssl, gd, fileinfo, curl |
|---|---|
| Database | MySQL 8, or MariaDB 10.6 and newer. One empty database. |
| Payments | A Stripe account of your own. Every payment lands there directly. |
| Build tools | None. |
Ordinary shared hosting with PHP 8.3 is enough. There is no queue worker, no Redis and no third-party service beyond your own Stripe account.
Including the ones where the honest answer is “no”.
Straight into your own Stripe account. BidPeak takes no fee, holds no funds and has no mechanism to. It never sees a card number — payment happens on Stripe's own hosted page.
Only if there is something on it. A board with no listings is a page with a payment button and nothing to look at, and nobody pays to be first on an empty list. The script helps — sample data, an empty-board state, and a way to add your early sponsors by hand — but filling the first ten places is your job, not the software's. The documentation is blunt about this.
Then this is not the right script for you, and it is better to know now. Payments go through Stripe, which operates in a limited set of countries — check stripe.com/global. PayPal is planned but is not in 1.0, so there is no second option yet.
Not in 1.0. A second payment provider means a second refund model, a second dispute model and a second webhook, all in the part of the system where a bug costs you money. It is planned rather than pretended.
No — one per installation. The ranking is a comparison of amounts, and mixing currencies would make the sort meaningless. Decide before you take the first payment; changing it afterwards reinterprets every existing total.
Their total drops by that amount and they fall down the board automatically, as soon as Stripe tells your site. You keep the audit record either way.
Readable. Unencrypted, unobfuscated and commented — which matters rather more than usual for something handling other people's card payments.
English only in 1.0. The strings are in Blade templates rather than a language file, so translating means editing templates.
Yes, given PHP 8.3 and the extensions listed above. No build step, no queue worker, nothing to compile.
The login details are on the sign-in page. Place a bid and watch the board reorder, then sign in as the administrator and look at the other side of it. The demo's payment step is simulated rather than taking a card — everything after it, and the Stripe integration itself, is the real thing on your own installation.
Open the demoThe demo resets every night.