Correct the DripOffers capacity figure and tighten the cap

I read campaigns.received_today as a per-day counter and told Marty the
platform delivers about 2,700 clicks a day. It doesn't. That column is
only a daily figure while the nightly cron resets it, and that reset has
stopped running, so the value is an accumulation since it last ran.

The permanent click ledger is unambiguous: roughly 40 to 50 clicks a day
across the whole platform. It also agrees exactly with ordered-minus-
remaining on every campaign, which is a good independent check that the
read-never-derive design is reading the right thing.

So MAX_CLICKS drops from 10,000 to 2,500. At the real volume a 10,000-click
booking would hold the top of the offerwall for most of a year.

The pack-2 placement is working as intended and is already measurable: the
three backfilled campaigns took 14 of the platform's 17 clicks today.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-18 07:04:20 -05:00
parent 71ab9555e2
commit a84b851272
2 changed files with 16 additions and 8 deletions
+15 -7
View File
@@ -25,18 +25,26 @@
// 3. A SYNDICATION HICCUP NEVER BLOCKS THE MEMBER. Callers swallow errors; the IAP campaign
// goes live either way.
//
// Capacity note (2026-09-18): the offerwall is a menu, not a rotator - every eligible campaign
// is listed at once, ordered by reward, and the member chooses. So adding campaigns does not
// starve the others the way the AdRevLinks rotator does; it lengthens the menu. What is finite
// is total clicks, running around 2,700 a day across the whole platform. Hence MAX_CLICKS
// below: one campaign booking 50,000 clicks would sit in the list for weeks. Cost is not the
// reason for the caps - Marty owns the platform and treats these placements as free.
// Capacity note (2026-09-18, corrected same day): the offerwall is a menu, not a rotator -
// every eligible campaign is listed at once, ordered by reward, and the earner chooses. So
// adding campaigns does not starve the others the way the AdRevLinks rotator does; it
// lengthens the menu.
//
// What is finite is total clicks, and the real figure is SMALL: the permanent click ledger
// shows roughly 40-50 clicks A DAY across the whole platform. (An earlier read of 2,700/day
// was wrong - it came from campaigns.received_today, which is only a daily figure while the
// nightly cron resets it, and that reset has stopped running.) Pack 2 puts our offers above
// the house campaigns, and they are indeed taking the large majority of that trickle.
//
// Hence a deliberately small MAX_CLICKS: at this volume a 10,000-click booking would sit at
// the top of the list for most of a year and crowd everything else out. Cost is not the reason
// for the caps - Marty owns the platform and treats these placements as free.
'use strict';
const https = require('https');
const { URL } = require('url');
const MIN_CREDITS = Number(process.env.DRIPOFFERS_MIN_CREDITS || 1000); // below this, not worth a listing
const MAX_CLICKS = Number(process.env.DRIPOFFERS_MAX_CLICKS || 10000);
const MAX_CLICKS = Number(process.env.DRIPOFFERS_MAX_CLICKS || 2500);
const MIN_CLICKS = 500; // the platform's own floor
const PACK_ID = Number(process.env.DRIPOFFERS_PACK_ID || 2); // 2 = a 10-second dwell
const USER_ID = Number(process.env.DRIPOFFERS_USER_ID || 1); // the funding account
+1 -1
View File
@@ -22,7 +22,7 @@ t('tier 1+2 merges both lists', drip.countriesFor('1,2', tiers) === 'US,CA,GB,BR
// worldwide would deliver the Tier 1 traffic its owner deliberately excluded
t('tier 3 alone is skipped, not silently widened', drip.countriesFor('3', tiers) === null, String(drip.countriesFor('3', tiers)));
t('credits convert to clicks one for one', drip.clicksFor(4000) === 4000, String(drip.clicksFor(4000)));
t('credits convert to clicks one for one', drip.clicksFor(2000) === 2000, String(drip.clicksFor(2000)));
t('one campaign cannot swallow the platform', drip.clicksFor(500000) === drip.MAX_CLICKS, String(drip.clicksFor(500000)));
// the offerwall title a stranger actually reads (the platform's floor is 5 characters)
const T = (c, u) => drip.titleFor(c, u || 'https://www.mailer.gold/x');