653c6d486e
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
115 lines
9.7 KiB
JavaScript
115 lines
9.7 KiB
JavaScript
// Founding week checklist: members only; every item reads from the live account
|
|
// (IAP.launchChecks in common.js is shared with the dashboard's "launch ready" mark).
|
|
(async function () {
|
|
const $ = id => document.getElementById(id);
|
|
try { await IAP.renderNav('training'); } catch (e) {}
|
|
let me = null, cfg = {};
|
|
try { me = await (await fetch('/api/me')).json(); } catch (e) {}
|
|
// buyerCount and the referral list live on the dashboard endpoint; merge it in
|
|
if (me && me.signedIn) { try { const d = await (await fetch('/api/my/dashboard')).json(); if (d && !d.error) me = Object.assign({}, me, d, { signedIn: true, email: me.email }); } catch (e) {} }
|
|
try { cfg = await IAP.getConfig(); } catch (e) {}
|
|
const signedIn = !!(me && me.signedIn && me.email);
|
|
$('gate').style.display = signedIn ? 'none' : 'block';
|
|
$('body').style.display = signedIn ? 'block' : 'none';
|
|
if (!signedIn) return;
|
|
const pb = $('printBtn'); if (pb) pb.addEventListener('click', () => window.print());
|
|
const tok = me.username || me.refCode || me.memberId;
|
|
if (tok) document.querySelectorAll('[data-link]').forEach(el => { el.textContent = location.origin + '/join/' + tok; });
|
|
// launch week swipes: four promoter emails, the member's link + FOUNDER code filled in (Marty, 2026-09-15)
|
|
const LINK = location.origin + '/join/' + (tok || '') + '?promo=FOUNDER';
|
|
const SW = [
|
|
{ when: 'Day 1 · six days out', subject: 'Something opens Monday. I am bringing a few people in early.', body: `Quick one, because I want you positioned before this goes public.
|
|
|
|
I have been inside a new advertising platform for a week. It pays sponsors in the same transaction a package is bought, wallet to wallet, on the Polygon ledger where anyone can check it. No back office. No payday. I have watched the payouts land.
|
|
|
|
It opens to everyone Monday, September 21 at 9 AM Central. Founding members are in now, and the people they bring in before then are the ones the launch traffic lands under.
|
|
|
|
Joining is free with an email. This week the code FOUNDER gives you 500 ad credits to run a campaign on day one:
|
|
|
|
{link}
|
|
|
|
No income is promised. It is an ad platform with a referral program. But the payment mechanics are real and public, and that is why I am in.
|
|
|
|
Look before Monday. I will walk you through the first three steps.`},
|
|
{ when: 'Day 2 · five days out', subject: 'Five hundred free credits, and what you can do with them', body: `Yesterday I sent you a link. Here is what is on the other side of it.
|
|
|
|
You join free with your email. Every day you view a short set of ads and earn credits. Credits run your own ads: banners, text ads, video ads, solo mailings, verified visits, across the whole network.
|
|
|
|
This week the FOUNDER code adds 500 credits on top the moment you join, enough to launch a real campaign pointed at whatever you are promoting. Watch it deliver before Monday, when everyone else arrives.
|
|
|
|
The other half is simple. When someone you invite buys an ad package, the contract pays you 50 percent instantly. Level two gets 20 percent, level three 10 percent. Same transaction, on the public ledger.
|
|
|
|
{link}
|
|
|
|
Use the code before it expires Monday morning. Then tell me you are in and I will show you the checklist.`},
|
|
{ when: 'Day 4 · the weekend', subject: 'The two people you bring in this weekend', body: `The doors open Monday morning and I am spending the weekend getting my first people set up. I want you to be one of them.
|
|
|
|
Here is why the weekend matters. Everyone who joins now is a founding member. The traffic that arrives Monday lands under whoever is already in and set up. Two people under you before Monday, and your line is built when the wave hits.
|
|
|
|
Setup takes ten minutes: username, link a wallet, switch on payouts. Then share your link. The site gives you posts, swipes, banners and a leaderboard with weekly credit prizes for the top sponsors.
|
|
|
|
Join with the FOUNDER code and the 500 credits are yours:
|
|
|
|
{link}
|
|
|
|
Message me when you are in and I will go through the checklist with you before Monday.`},
|
|
{ when: 'Day 6 · Sunday evening', subject: 'Doors open tomorrow at 9 AM Central', body: `Last note before the launch.
|
|
|
|
InstantAdPay opens to the public tomorrow, Monday, at 9 AM Central. After that the FOUNDER code is gone. Tonight it still gives you 500 free ad credits.
|
|
|
|
If you join tonight you are in as a founding member with a campaign already funded and your link ready when the first wave arrives. If you wait, you join the wave.
|
|
|
|
Free to join, real advertising, and every payment lands in your own wallet the second it happens, on a ledger anyone can read. No income promises. Just mechanics you can verify.
|
|
|
|
{link}
|
|
|
|
I will be online from 8 AM tomorrow walking people through the first three steps. Get in tonight and you are ahead of them.`}
|
|
];
|
|
// short posts and a DM for the same days, one per day, link + code included
|
|
const POSTS = [
|
|
{ when: 'Day 1 · six days out', text: `Something I have been inside for a week opens to the public Monday, September 21 at 9 AM Central. An ad platform that pays sponsors in the same transaction a package is bought, on the Polygon ledger where anyone can check it. Free to join. Code FOUNDER gives you 500 ad credits before then. No income promises, just mechanics you can verify. {link}` },
|
|
{ when: 'Day 2 · five days out', text: `500 free ad credits for joining before Monday. View a short daily set of ads, earn more, run banners, text ads, video ads and solo mailings across the network. When someone you invite buys a package, the contract pays you 50 percent instantly, wallet to wallet. Code FOUNDER. {link}` },
|
|
{ when: 'Day 4 · the weekend', text: `The doors open Monday morning. Everyone joining this weekend is a founding member, and the launch traffic lands under whoever is already set up. Ten minutes to set up, 500 credits with code FOUNDER, and a leaderboard that pays weekly credit prizes to the top sponsors. {link}` },
|
|
{ when: 'Day 6 · Sunday evening', text: `Doors open tomorrow, 9 AM Central. Tonight the FOUNDER code still gives you 500 free ad credits; tomorrow it is gone. Free to join, real advertising, every payment on a public ledger. Get in tonight and you are ahead of the wave. {link}` },
|
|
{ when: 'Text or DM · any day', text: `Hey, I am in something that opens publicly Monday and I am bringing a few people in early. Free to join, real advertising, every payment lands in your own wallet the second it happens. Use code FOUNDER for 500 free credits. Ten minutes to set up and I will walk you through it: {link}` }
|
|
];
|
|
const pl = $('postList');
|
|
if (pl) {
|
|
pl.innerHTML = POSTS.map((s, i) => '<div class="swipe"><div class="cap"><span>' + s.when + '</span><button type="button" class="btn sec" data-post="' + i + '">Copy post</button></div><pre>' + s.text.replace('{link}', LINK).replace(/&/g, '&').replace(/</g, '<') + '</pre></div>').join('');
|
|
pl.querySelectorAll('[data-post]').forEach(b => b.addEventListener('click', async () => {
|
|
const t = POSTS[Number(b.dataset.post)].text.replace('{link}', LINK);
|
|
try { await navigator.clipboard.writeText(t); b.textContent = 'Copied'; setTimeout(() => { b.textContent = 'Copy post'; }, 1500); } catch (e) { IAP.status('Copy failed; select the text by hand.', 'bad'); }
|
|
}));
|
|
}
|
|
const wrap = $('swipeList');
|
|
if (wrap) {
|
|
wrap.innerHTML = SW.map((s, i) => '<div class="swipe"><div class="cap"><span>Email ' + (i + 1) + ' · ' + s.when + '</span><button type="button" class="btn sec" data-swipe="' + i + '">Copy email</button></div><div class="subj">Subject: ' + s.subject + '</div><pre>' + s.body.replace('{link}', LINK).replace(/&/g, '&').replace(/</g, '<') + '</pre></div>').join('');
|
|
wrap.querySelectorAll('[data-swipe]').forEach(b => b.addEventListener('click', async () => {
|
|
const s = SW[Number(b.dataset.swipe)]; const text = 'Subject: ' + s.subject + '\n\n' + s.body.replace('{link}', LINK);
|
|
try { await navigator.clipboard.writeText(text); b.textContent = 'Copied'; setTimeout(() => { b.textContent = 'Copy email'; }, 1500); } catch (e) { IAP.status('Copy failed; select the text by hand.', 'bad'); }
|
|
}));
|
|
}
|
|
|
|
// launch moment (admin: Settings > launchAt, ISO 8601 with offset)
|
|
const at = cfg.launchAt ? new Date(cfg.launchAt) : null;
|
|
if (at && !isNaN(at)) {
|
|
$('lwWhen').hidden = false;
|
|
$('lwWhenAt').textContent = at.toLocaleString([], { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });
|
|
const tick = () => { const ms = at - Date.now(); if (ms <= 0) { $('lwWhenIn').textContent = 'doors are open'; return; }
|
|
const d = Math.floor(ms / 86400000), h = Math.floor(ms % 86400000 / 3600000), m = Math.floor(ms % 3600000 / 60000);
|
|
$('lwWhenIn').textContent = (d ? d + 'd ' : '') + h + 'h ' + m + 'm to go'; };
|
|
tick(); setInterval(tick, 30000);
|
|
}
|
|
|
|
function render() {
|
|
const items = IAP.launchChecks(me);
|
|
const done = items.filter(i => i.done).length;
|
|
$('lwDone').textContent = done; $('lwBar').style.width = Math.round(done / items.length * 100) + '%';
|
|
$('chk').innerHTML = items.map((i, n) => '<li class="' + (i.done ? 'done' : '') + '"><div class="box">' + (i.done ? '✓' : (n + 1)) + '</div>'
|
|
+ '<div><h3>' + i.title + '</h3><p>' + i.how + '</p><div class="why">' + i.why + '</div>' + (i.note ? '<p class="small" style="margin-top:4px">' + i.note + '</p>' : '') + '</div>'
|
|
+ '<div class="act">' + (i.manual ? '<button class="btn small ' + (i.done ? 'sec' : '') + '" type="button" data-manual="' + i.key + '">' + (i.done ? 'Undo' : 'Mark done') + '</button>' : '<a class="btn small sec" href="' + i.href + '">' + i.cta + '</a>') + '</div></li>').join('');
|
|
$('chk').querySelectorAll('[data-manual]').forEach(b => b.addEventListener('click', () => { IAP.launchToggle(b.dataset.manual); render(); }));
|
|
}
|
|
render();
|
|
})();
|