diff --git a/public/assets/my.js b/public/assets/my.js index 60b3371..817fa92 100644 --- a/public/assets/my.js +++ b/public/assets/my.js @@ -1702,8 +1702,12 @@ + ''; if (box) box.querySelectorAll('[data-earnnext]').forEach(b => b.addEventListener('click', () => { if (b.dataset.earnnext === 'campaigns') setPane('campaigns'); else setEarnSub('visits'); })); if ($('earnStartBtn')) $('earnStartBtn').hidden = true; - } else if ($('earnStartBtn')) $('earnStartBtn').hidden = false; - else if (done) $('earnHint').textContent = 'Set complete. Claim your ' + st.claimCredits + ' credits' + (st.streakDay > 1 ? ' (streak day ' + st.streakDay + ')' : '') + '.'; + } else { + if ($('earnStartBtn')) $('earnStartBtn').hidden = done; // set done: the claim button takes over + $('earnHint').textContent = done + ? 'Set complete. Claim your ' + st.claimCredits + ' credits' + (st.streakDay > 1 ? ' (streak day ' + st.streakDay + ')' : '') + '.' + : (st.views ? (st.target - st.views) + ' more to go, then claim ' + st.claimCredits + ' credits' + (st.streakDay > 1 ? ' (streak day ' + st.streakDay + ')' : '') + '.' : 'View ' + st.target + ' ads to unlock the daily claim of ' + st.claimCredits + ' credits' + (st.streakDay > 1 ? ' (streak day ' + st.streakDay + ')' : '') + '.'); + } return st; } catch (e) { return null; } } diff --git a/public/earning.html b/public/earning.html new file mode 100644 index 0000000..cf758b7 --- /dev/null +++ b/public/earning.html @@ -0,0 +1,72 @@ + + + + +How earning works | InstantAdPay + + + + + + + + + +
+
+

Member guide

+

How earning works, and what to do with it.

+

Every free way to earn ad credits, the claim streak, and the one thing that makes the credits worth anything: spending them on a campaign.

+
+ +
One credit is one cent of ad delivery. Credits are not money and cannot be withdrawn. They buy impressions, clicks and visits for your own campaigns across InstantAdPay and the partner network. Payouts in POL come only from packages people in your line buy.
+ +

1. The daily set

+

Earn credits › Watch ads. Five ads a day. Each one opens full screen, a 10-second countdown runs while you look, you pass a quick click-the-icon check, and you earn 1 credit. Finish all five and the Claim button appears.

+ +

2. The claim streak

+

The claim pays more the more days in a row you claim it. Miss a day and it restarts at day 1.

+ + + + + + +
Consecutive dayClaim pays
Day 15 credits
Day 27 credits
Day 3 and on10 credits
Every 7th day in a row25 credits
+

The hint under the set always tells you which day you are on and what tomorrow's claim pays. Days are counted in UTC, so the set resets at 7 PM Central.

+ +

3. After the set: verified visits

+

When the set is claimed, the done screen offers verified visits: up to 20 a day, 1 credit each. You open a member's site in a new tab, stay for the dwell, and the visit counts. Each visit is unique per site per day, so it is 20 different sites, not one site 20 times.

+ +

4. Videos and inbox ads

+ + +

5. The sign-in bonus and milestones

+

Signing in pays 5 credits a day, rising by one for each consecutive day up to 10. Milestone badges pay too: Spark when payouts are on, Surge at your first qualifying buyer, Circuit at two, Nexus at five.

+ +

6. Now spend it

+

Credits sitting in your balance do nothing. Campaigns › New campaign: pick a banner or a text ad, give it a name and a budget in credits, point it at your own invite link or wall, and launch. Banner and text ads also push out to the partner network, so a 100-credit campaign is a hundred cents of real delivery. The done screen has a one-tap button for this after every claim.

+

Two things to know: a campaign reserves its whole budget the moment you start it, so your available balance drops right away and never surprises you later, and login ads are the one format that needs purchased credits.

+ +

No income is guaranteed. Results depend on your effort. Cryptocurrency involves risk of loss. InstantAdPay sells advertising; it is not an investment.

+ +
+ + + diff --git a/public/my.html b/public/my.html index 3e44e98..27d8c0f 100644 --- a/public/my.html +++ b/public/my.html @@ -915,7 +915,7 @@ - + diff --git a/server.js b/server.js index 5d02156..f8c1480 100644 --- a/server.js +++ b/server.js @@ -28,7 +28,7 @@ const tank = require('./tank'); // holding tank: unsponsored free members, a const legacy = require('./legacy'); // Faucet Wave / Tier One Ads bridge: welcome-back credits for listed emails const traffic = require('./traffic'); // public page views by referring domain (admin Traffic tab) const promos = require('./promos'); // partner promo codes -> free ad credits (link ?promo=CODE or the dashboard box) -const TRAFFIC_PAGES = new Set(['/', '/ledger', '/contract', '/shorts', '/plays', '/wallets', '/launch', '/partners']); +const TRAFFIC_PAGES = new Set(['/', '/ledger', '/contract', '/shorts', '/plays', '/wallets', '/launch', '/partners', '/earning']); let tankWaitCache = null; // dashboard: who is waiting for a sponsor (refreshed every minute) const geo = require('./geo'); // viewer country -> tier (DB-IP lite), for campaign targeting const burner = require('./burner'); // automatic on-chain credit burns (inert without ENGINE_KEY) @@ -2144,6 +2144,7 @@ const server = http.createServer(async (req, res) => { if (p === '/shorts') return sendFile(res, path.join(PUBLIC_DIR, 'shorts.html')); if (p === '/plays') return sendFile(res, path.join(PUBLIC_DIR, 'plays.html')); if (p === '/partners') return sendFile(res, path.join(PUBLIC_DIR, 'partners.html')); // site-owner kit (Marty, 2026-09-12) + if (p === '/earning') return sendFile(res, path.join(PUBLIC_DIR, 'earning.html')); // member guide: how earning works (2026-09-12) if (p === '/wallets') return sendFile(res, path.join(PUBLIC_DIR, 'wallets.html')); if (p === '/launch') return sendFile(res, path.join(PUBLIC_DIR, 'launch.html')); if (/^\/view\/[a-f0-9]{32}$/.test(p)) return sendFile(res, path.join(PUBLIC_DIR, 'view.html'));