Referral rewards: pay a hunter for bringing someone who actually hunts
PolHunter retains well and recruits badly. On 2026-09-22 it had its best day, 105 finds from 37 hunters, and had sent three people to InstantAdPay in its whole life, all three on one member's link. Earning and sharing were separate actions and only one of them paid. Bringing someone is now the best-paid thing on the board, and the card sits first in the mission list rather than on a promo page nobody opens. A flat 3 POL the first time someone they brought finds a code, then 20% on top of that person's finds for their first 30 days, paid from the pool and never taken out of the newcomer's drip. Who counts as "brought by me" is the sponsor they actually joined InstantAdPay under, handed over in the sign-in payload, so the bounty and the commission always land on the same person. The bounty only pays for a member who is genuinely new, once per person, and referral drips have their own daily ceiling so a good referral day can never starve the finds. Also: findsToday defaulted its day argument to undefined and silently returned zero for every caller that omitted it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+2
-2
@@ -5,7 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Your board · PolHunter</title>
|
||||
<meta name="robots" content="noindex">
|
||||
<link rel="stylesheet" href="/style.css?v=12">
|
||||
<link rel="stylesheet" href="/style.css?v=13">
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
@@ -46,6 +46,6 @@
|
||||
<footer class="foot">Rewards are for completed missions, not income. The daily pool is limited; when it is spent, claims close until midnight Central. Cryptocurrency involves risk of loss.</footer>
|
||||
</div>
|
||||
<div class="modal" id="shareModal" hidden><div class="modal-card"><button class="modal-x" id="shareClose" type="button" aria-label="Close">×</button><div id="shareBody"></div></div></div>
|
||||
<script src="/app.js?v=12"></script>
|
||||
<script src="/app.js?v=13"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -46,6 +46,26 @@
|
||||
: '<div style="margin-top:14px"><button class="btn" data-start="' + esc(m.id) + '">Start mission</button></div>')
|
||||
+ '</div>';
|
||||
}
|
||||
// The best-paid thing on the board, and the reason it sits first: sharing used to live on a page
|
||||
// nobody opened, so nobody shared (Marty, 2026-09-23).
|
||||
function referralCard() {
|
||||
const rf = board.referral; if (!rf || !rf.on) return '';
|
||||
const link = (board.share && board.share.link) || '';
|
||||
const today = rf.broughtToday, total = rf.brought;
|
||||
const people = (rf.people || []).slice(0, 5).map(p =>
|
||||
'<div class="ref-row"><span>' + esc(p.name) + '</span><span class="ref-state">' + esc(p.state) + '</span></div>').join('');
|
||||
return '<div class="card ref-card">'
|
||||
+ '<span class="tag gold">Best paid</span>'
|
||||
+ '<h3>🤝 Bring a hunter</h3>'
|
||||
+ '<p>Send your link. When someone new opens PolHunter and finds their first code, you get <b>' + rf.bountyPol + ' POL</b>. '
|
||||
+ 'After that you earn <b>' + rf.matchPct + '%</b> on top of everything they find for their first ' + rf.matchDays + ' days. '
|
||||
+ 'It comes out of our pool, never theirs.</p>'
|
||||
+ '<div class="codebox"><input id="refLink" readonly value="' + esc(link) + '"><button class="btn pol" id="refCopy">Copy</button></div>'
|
||||
+ '<p style="margin-top:10px"><span class="range">' + today + ' brought today</span> '
|
||||
+ '<span style="color:var(--dim);font-size:12px">· ' + total + ' all time · ' + rf.earnedPol + ' POL earned</span></p>'
|
||||
+ (people ? '<div class="ref-list">' + people + '</div>' : '<p style="color:var(--dim);font-size:12px;margin-top:10px">Nobody yet. One message is all it takes.</p>')
|
||||
+ '</div>';
|
||||
}
|
||||
const IAP = 'https://instantadpay.com';
|
||||
function until(ms) { const s = Math.max(0, Math.round((ms - Date.now()) / 60000)); const h = Math.floor(s / 60), m = s % 60; return h ? h + 'h ' + m + 'm' : m + 'm'; }
|
||||
// no wallet on the InstantAdPay account yet: the three steps, in place of the missions
|
||||
@@ -83,7 +103,14 @@
|
||||
const pool = board.pool || {};
|
||||
if (!board.me.wallet) $('missions').innerHTML = onboarding();
|
||||
else $('missions').innerHTML = (pool.spent ? '<div class="notice" style="grid-column:1/-1"><b>Today\u2019s POL pool is spent.</b> No more claims today. Claims reopen at midnight Central' + (pool.resetsAt ? ', in ' + until(pool.resetsAt) : '') + '.</div>' : '')
|
||||
+ referralCard()
|
||||
+ (board.missions.length ? board.missions.map(card).join('') : '<div class="card"><p>No missions are open right now. Check back soon.</p></div>');
|
||||
const rc = $('refCopy');
|
||||
if (rc) rc.addEventListener('click', async () => {
|
||||
const v = $('refLink').value;
|
||||
try { await navigator.clipboard.writeText(v); } catch (e) { $('refLink').select(); document.execCommand('copy'); }
|
||||
rc.textContent = 'Copied'; setTimeout(() => { rc.textContent = 'Copy'; }, 1600);
|
||||
});
|
||||
// standing: badges and rank
|
||||
const rk = board.rank || {}; const line = [];
|
||||
if (rk.week) line.push('This week <b>#' + rk.week.rank + '</b> of ' + rk.week.of); if (rk.all) line.push('All time <b>#' + rk.all.rank + '</b> of ' + rk.all.of);
|
||||
|
||||
@@ -111,3 +111,10 @@ textarea{width:100%;padding:12px 14px;border-radius:12px;border:1px solid var(--
|
||||
@media (max-width:820px){.hero{min-height:0;margin:0 -20px 6px;border-top:0;display:block}.hero-art{position:relative;inset:auto;display:block;height:270px}.hero-art img{object-position:60% 50%}.hero::before{inset:auto 0 auto 0;top:150px;height:121px;background:linear-gradient(180deg,transparent,var(--bg))}.hero-copy{padding:6px 20px 32px}.hero p{font-size:16.5px}.play{right:auto;left:14px;bottom:auto;top:214px;padding:9px 16px 9px 10px;font-size:13px;white-space:nowrap}.play .tri{width:28px;height:28px}.play .tri::after{left:10px;top:7px}.play .lbl-long{display:none}.nav a:nth-child(2),.nav a:nth-child(3){display:none}.adslot{overflow-x:auto;justify-content:flex-start}.row{grid-template-columns:1fr auto;row-gap:6px}.row .when{grid-column:1/-1;font-size:13px;color:var(--pol-hi)}.adslot{margin:18px -4px}}
|
||||
/* every drip row carries its blockchain verify link; on phones it sits on its own line (Marty, 2026-09-19) */
|
||||
.row a.when{color:var(--pol-hi)} .row a.when:hover{color:var(--gold-hi)}
|
||||
|
||||
/* Bring a hunter: the referral card sits first in the mission grid (Marty, 2026-09-23) */
|
||||
.ref-card{border-color:rgba(243,190,67,.34);background:linear-gradient(170deg,rgba(243,190,67,.07),rgba(0,0,0,0) 60%)}
|
||||
.ref-card .codebox input{font:500 13px var(--mono);letter-spacing:0;text-transform:none}
|
||||
.ref-list{margin-top:12px;border-top:1px solid var(--edge);padding-top:8px}
|
||||
.ref-row{display:flex;justify-content:space-between;gap:10px;font-size:13px;padding:4px 0}
|
||||
.ref-row .ref-state{color:var(--dim);font-size:12px;text-align:right}
|
||||
|
||||
Reference in New Issue
Block a user