f3f9662d99
- Social posts for X / Facebook / LinkedIn / Telegram-WhatsApp with post and share buttons; 5 SMS-sized Text-a-friend messages (Text it / WhatsApp / Telegram / Copy); email swipes short, standard, long, follow-up. - Banner kit adds 1080x1080, 1080x1920 and 1280x720 (tools/gen-social-banners.cjs) with Download buttons. - Printable half-sheet handouts at /flyers with the member's QR + invite link (qrlib.js, two per letter page, cut line, print-one). - Objection handling bank: truth + ready-to-send reply per objection. - Invite-link strip, Branded Voice CTA, pill menu covers every kit; chatbot canned answer + prompt facts updated. Angle links carry ?v= for the upcoming hook pages. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
153 lines
18 KiB
JavaScript
153 lines
18 KiB
JavaScript
// Promo tools content + rendering for the member area (Promo tools pane).
|
|
// Everything is personalized from the member's join link. Angle links carry
|
|
// ?v=<angle> so they keep working when the matched squeeze pages ship.
|
|
// Copy rules: no income promises, package prices in dollars are fine, never a
|
|
// POL figure, no em dashes.
|
|
window.IAPPromo = (function () {
|
|
const $ = id => document.getElementById(id);
|
|
const esc = s => String(s == null ? '' : s).replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
const status = (m, c) => (window.IAP && IAP.status) ? IAP.status(m, c) : console.log(m);
|
|
const angleLink = (link, angle) => angle ? link + '?v=' + angle : link;
|
|
|
|
// ── social posts ──
|
|
const POSTS = [
|
|
{ net: 'X', label: 'X · instant payout', text: 'No withdraw button. A smart contract on Polygon splits every ad package the second it sells: 50% to the sponsor, 20% to level 2, 10% to level 3. Lands in your own wallet. Watch the ledger move: {{LINK:instant}}' },
|
|
{ net: 'X', label: 'X · advertiser', text: 'Marketers: you were buying traffic anyway. Here the ad spend in your line pays you, in the same transaction, on a public ledger. Packages from $5. Join free: {{LINK:adspend}}' },
|
|
{ net: 'X', label: 'X · free join', text: 'Join free. View a few ads, earn credits, run your first campaign for zero dollars. Seven ad formats, real dwell-timed attention, every payout public on Polygon. {{LINK:free}}' },
|
|
{ net: 'Facebook', label: 'Facebook · story post', text: 'I got tired of "your commission is pending." So I joined a platform where there is no pending. A smart contract on the Polygon blockchain splits every ad package the moment it sells: half to the sponsor, then levels two and three, then the platform. It lands in your own wallet in seconds. No approval queue, no withdrawal button, no 15th of the month.\n\nYou are buying real advertising: banners, text ads, login ads, solo ads to member inboxes, video ads, featured links and verified visits. Members earn credits for their attention, so the ads actually get seen.\n\nJoin free, look around, and check the public ledger before you spend a dollar: {{LINK:instant}}\n\nNo income promises. It is advertising, not investing, and crypto carries risk.' },
|
|
{ net: 'Facebook', label: 'Facebook · skeptic angle', text: 'Every online program I ever joined asked me to trust a back office. This one does not. Every payout is a public transaction on Polygon you can look up yourself, with the wallet addresses and amounts right there. The split is written in a verified smart contract nobody can quietly edit.\n\nFree to join with just an email. The wallet comes out only if you buy a package or switch on payouts. Packages run $5 to $250, and every one of them is ad delivery you can watch running.\n\nTake the tour: {{LINK:ledger}}' },
|
|
{ net: 'LinkedIn', label: 'LinkedIn · professional', text: 'An experiment in transparent affiliate payouts: InstantAdPay sells advertising packages ($5 to $250) whose sponsor commissions are settled by a verified smart contract on Polygon in the same transaction as the purchase. 50 / 20 / 10 across three levels, 20 percent to the platform, every payment public on the chain.\n\nWhat I find interesting is not the commission. It is that "pending payout" stops being a concept. If you buy traffic for a living and want to see how same-transaction settlement works in practice, the tour is free: {{LINK:adspend}}' },
|
|
{ net: 'Telegram', label: 'Telegram or WhatsApp group', text: 'Quick one for the group. Ad platform on Polygon where every package splits to sponsor wallets the second it sells. No withdrawals, no pending. Free to join by email, packages from $5, seven ad formats, and you earn credits for viewing. Tour here: {{LINK:instant}}' },
|
|
{ net: 'Telegram', label: 'Telegram or WhatsApp group · free angle', text: 'If you want to test an ad network without spending anything: join free, view a handful of ads, earn credits, run your first campaign on the house. Payouts are on the public Polygon ledger. {{LINK:free}}' }
|
|
];
|
|
|
|
// ── text a friend (SMS-sized) ──
|
|
const TEXTS = [
|
|
{ angle: '', title: '"Thought of you"', text: 'Hey, found an ad platform where the commission lands in your wallet the second someone buys. No pending, no withdraw button. Free to look: {{LINK}}' },
|
|
{ angle: 'instant', title: '"Before the page reloads"', text: 'Random thought. What if your commission showed up before the thank-you page finished loading? That is literally how this works: {{LINK:instant}}' },
|
|
{ angle: 'adspend', title: '"You buy ads anyway"', text: 'You already buy traffic. This one pays your line every time someone in it buys ads, same transaction, on Polygon. Two-minute look: {{LINK:adspend}}' },
|
|
{ angle: 'free', title: '"Costs nothing to try"', text: 'Try this without spending a dollar: join free, view a few ads, earn credits, run your first campaign. {{LINK:free}}' },
|
|
{ angle: 'ledger', title: '"No back office"', text: 'Remember waiting on payouts that never came? This one has no back office. Every payment is public on the blockchain. Check it yourself: {{LINK:ledger}}' }
|
|
];
|
|
|
|
// ── email swipes ──
|
|
const SWIPES = [
|
|
{ tier: 'Short', subject: 'Paid the second it sells', body: 'Quick one.\n\nI joined an ad platform where every package splits to sponsor wallets in the same transaction as the sale. No pending payouts, no withdraw button. It is on the Polygon blockchain, and every payment is public.\n\nJoin free, look at the ledger, decide later: {{LINK:instant}}\n\nNo income promises. Advertising, not investing.' },
|
|
{ tier: 'Standard', subject: 'Your wallet gets paid instantly', body: 'You know the usual drill. Someone buys on your link, you wait for a payout. Maybe days. Maybe an approval hold. Maybe a "your account is under review."\n\nInstantAdPay does not work like that.\n\nA smart contract on the Polygon blockchain handles every purchase the second it happens. 50% to the sponsor. 20% to the next level. 10% to the one after that. 20% to the platform. Each split lands directly in your own wallet. No withdrawal button. No "request payout." No approval queue.\n\nThe money just shows up.\n\nYou can watch every transaction on the public ledger. Real time. Anyone can verify it.\n\nFree to join. Packages from $5 to $250. No income promises. It is advertising, not investing.\n\n{{LINK}}' },
|
|
{ tier: 'Long', subject: 'The ad network with no pending payouts', body: 'Let me tell you what you are actually looking at, because "crypto ad platform" can mean anything.\n\nInstantAdPay sells advertising. Five packages, $5 to $250. A package mints ad credits, and one credit is one cent of delivery across seven formats: display banners, text ads, full-screen login ads, solo ads delivered into member inboxes, video ads, featured links, and verified visits. Members earn credits for their attention, with a timer that pauses when they look away, so your ad is seen by a person, not a script.\n\nNow the part that made me join.\n\nWhen anyone in your line buys a package, a verified smart contract on Polygon splits the payment in that same transaction: 50 percent to their direct sponsor, 20 percent to level two, 10 percent to level three, 20 percent to the platform. It lands in real wallets in seconds. There is no balance to withdraw because nothing is ever held.\n\nEvery one of those payments is public. Open the ledger, click a transaction, read it on Polygonscan.\n\nJoining is free and only needs an email. Your wallet comes out when you buy a package or switch on payouts. If you never spend a dollar, you can still view ads, earn credits, and run a small campaign on those.\n\nHave a look: {{LINK:instant}}\n\nOne honest line: nobody is promising you an income. Results depend on your effort, and crypto carries risk of loss.' },
|
|
{ tier: 'Follow-up', subject: 'Did you see the ledger?', body: 'Following up on the ad platform I sent over.\n\nIf you only look at one thing, look at the live ledger. Every purchase and every payout, with real wallet addresses, in the order they happened. That is the whole pitch: nothing to take on faith.\n\n{{LINK:ledger}}\n\nIf it is not for you, no worries at all.' }
|
|
];
|
|
|
|
// ── objection bank (truth + say this) ──
|
|
const OBJECTIONS = [
|
|
{ q: 'Is this a pyramid scheme?', truth: 'You are buying advertising that actually runs: a credit is one cent of delivery across seven live formats, and members earn credits for dwell-timed attention. Sponsor payments are referral commissions written as constants in a verified contract, paid only when a real package sells. Nobody has to recruit to use the ads, and joining costs nothing.', say: 'Fair question. Here is the test I use: is there a real product that people would buy with no referral involved? Here the product is ad delivery, seven formats, one cent per credit, and you can watch your campaign serving. The sponsor split is a referral commission on those sales, fixed in a public contract. Join free and run the ads with zero referrals if you like. {{LINK:free}}' },
|
|
{ q: 'I do not have a crypto wallet. I am not technical.', truth: 'Joining needs only an email and a 6-digit code. The wallet comes out only when someone buys a package or switches on payouts, and the site walks them through it. A card on-ramp (MoonPay) delivers POL straight to their own wallet. Email first, wallet second.', say: 'You do not need one to join. It is email only, no password even. The wallet shows up later, only if you decide to buy a package or want payouts, and the site walks you through it step by step. Start here and look around first: {{LINK}}' },
|
|
{ q: 'What am I actually buying?', truth: 'Ad credits minted on-chain the moment a package is bought: $5 = 500, $20 = 2,000, $50 = 5,500, $100 = 12,000, $250 = 32,500. Credits spend on banners, text ads, login ads, solo ads to member inboxes, video ads, featured links and verified visits, with live stats per campaign. Only the buyer\'s campaigns can spend them.', say: 'Advertising. A package mints credits, one credit is one cent of delivery, and you spend them on seven ad formats from your own dashboard with live stats. The $5 package is 500 credits, the $250 package is 32,500. You can see the formats before you spend anything: {{LINK:adspend}}' },
|
|
{ q: 'Who holds my money?', truth: 'Nobody. A purchase is one Polygon transaction that splits to the sponsor line and the platform wallets immediately. The site never holds balances, and the contract source is verified on Polygonscan and Sourcify. Overpayment refunds itself in the same transaction.', say: 'That is the part I like most: nobody holds it. The purchase is a single blockchain transaction that pays the sponsor line and the platform in the same moment. There is no balance sitting anywhere waiting for a withdrawal. The contract code is public and verified, and every payment is on the ledger: {{LINK:ledger}}' },
|
|
{ q: 'What if POL drops?', truth: 'Packages are priced in dollars and settled in POL at the live Chainlink rate at the moment of purchase. Payouts arrive as POL in the recipient\'s own wallet immediately, so what they do with it is their call. This is advertising, not an investment, and POL is volatile like any crypto asset.', say: 'Packages are dollar priced, so $20 is $20 worth of POL at that moment. Payouts land in your wallet right away, and it is your money from that second. Crypto does move, so treat it as advertising you bought, not an investment. {{LINK}}' },
|
|
{ q: 'Why would anyone buy ads here?', truth: 'The members are marketers who already buy traffic. Viewers earn credits only after a server-timed dwell, so impressions are real people. Solo ads reach member inboxes with a guaranteed delivery count, verified visits are one unique member per visit, and banner and text ads also syndicate to a partner ad network.', say: 'Because the people on it are marketers, and they get paid to actually look. Every view is dwell-timed on the server, solo ads land in real inboxes with a guaranteed count, and verified visits are one real person each. You can watch your own campaign serve: {{LINK:adspend}}' },
|
|
{ q: 'I do not know anyone to refer.', truth: 'Referrals are optional. Members can view ads, earn credits and advertise with no line at all. When they do refer, every direct buyer pays them 50 percent from the very first package, and their line banner is shown to their next three levels during welcome tours.', say: 'You do not have to refer anyone. Join free, earn credits by viewing, run ads. If one person ever joins through you and buys a $5 package, half of it hits your wallet in that transaction. That is the whole referral side, and it is optional. {{LINK:free}}' },
|
|
{ q: 'How much can I make?', truth: 'No income is guaranteed or implied. Sponsor commissions are 50 / 20 / 10 across three levels on packages that actually sell; level 2 needs 2 qualifying buyers ($20 or more) and level 3 needs 5. Results depend on the member\'s effort, and crypto carries risk of loss. Never quote a figure.', say: 'Nobody can tell you that, and I would not trust anyone who did. What I can tell you is exactly how it is split: 50 percent to the direct sponsor, 20 and 10 to the next two levels, paid the moment a package sells, all public. What that adds up to depends entirely on what you build. {{LINK:instant}}' }
|
|
];
|
|
|
|
function fillLink(text, link) {
|
|
return text.replace(/\{\{LINK(?::([a-z]+))?\}\}/g, (m, a) => angleLink(link, a));
|
|
}
|
|
function copyBtn(text, label) {
|
|
const b = document.createElement('button');
|
|
b.className = 'btn small sec'; b.type = 'button'; b.textContent = label || 'Copy';
|
|
b.addEventListener('click', async () => {
|
|
try { await navigator.clipboard.writeText(text); status('Copied. Paste it anywhere.', 'ok'); }
|
|
catch (e) { status('Copy failed. Select the text instead.', 'bad'); }
|
|
});
|
|
return b;
|
|
}
|
|
function block(text, head, extraBtns) {
|
|
const div = document.createElement('div');
|
|
div.className = 'promo-block';
|
|
if (head) { const h = document.createElement('div'); h.className = 'pb-head'; h.innerHTML = head; div.appendChild(h); }
|
|
const pre = document.createElement('div'); pre.className = 'pb-text'; pre.textContent = text; div.appendChild(pre);
|
|
const row = document.createElement('div'); row.className = 'pb-actions';
|
|
row.appendChild(copyBtn(text));
|
|
(extraBtns || []).forEach(b => row.appendChild(b));
|
|
div.appendChild(row);
|
|
return div;
|
|
}
|
|
function linkBtn(href, label, cls) {
|
|
const a = document.createElement('a');
|
|
a.className = 'btn small ' + (cls || 'sec'); a.href = href; a.textContent = label;
|
|
if (!/^sms:/.test(href)) { a.target = '_blank'; a.rel = 'noopener'; }
|
|
return a;
|
|
}
|
|
|
|
function fill(link, me) {
|
|
const token = (me && (me.username || me.refCode || me.memberId)) || '';
|
|
// invite strip
|
|
if ($('promoLink')) $('promoLink').textContent = link;
|
|
if ($('promoLinkCopy')) $('promoLinkCopy').onclick = async () => {
|
|
try { await navigator.clipboard.writeText(link); status('Link copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); }
|
|
};
|
|
// posts
|
|
const posts = $('promoPosts');
|
|
if (posts && posts.dataset.filled !== link) {
|
|
posts.dataset.filled = link; posts.innerHTML = '';
|
|
for (const p of POSTS) {
|
|
const text = fillLink(p.text, link);
|
|
const extras = [];
|
|
if (p.net === 'X') extras.push(linkBtn('https://twitter.com/intent/tweet?text=' + encodeURIComponent(text), 'Post on X'));
|
|
if (p.net === 'Facebook') extras.push(linkBtn('https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(angleLink(link, (/\{\{LINK:([a-z]+)\}\}/.exec(p.text) || [])[1] || '')), 'Share on Facebook'));
|
|
if (p.net === 'LinkedIn') extras.push(linkBtn('https://www.linkedin.com/sharing/share-offsite/?url=' + encodeURIComponent(angleLink(link, 'adspend')), 'Share on LinkedIn'));
|
|
if (p.net === 'Telegram') extras.push(linkBtn('https://t.me/share/url?url=' + encodeURIComponent(angleLink(link, (/\{\{LINK:([a-z]+)\}\}/.exec(p.text) || [])[1] || '')) + '&text=' + encodeURIComponent(text.replace(/\s*\{\{LINK[^}]*\}\}\s*$/, '').replace(/https?:\/\/\S+$/, '').trim()), 'Share on Telegram'));
|
|
posts.appendChild(block(text, '<span class="pb-net">' + esc(p.label) + '</span>', extras));
|
|
}
|
|
}
|
|
// text a friend
|
|
const texts = $('promoTexts');
|
|
if (texts && texts.dataset.filled !== link) {
|
|
texts.dataset.filled = link; texts.innerHTML = '';
|
|
TEXTS.forEach((t, i) => {
|
|
const text = fillLink(t.text, link);
|
|
const enc = encodeURIComponent(text);
|
|
const tgUrl = angleLink(link, t.angle);
|
|
const tgLead = text.replace(/https?:\/\/\S+/, '').trim();
|
|
const extras = [
|
|
linkBtn('sms:?&body=' + enc, 'Text it', ''),
|
|
linkBtn('https://wa.me/?text=' + enc, 'WhatsApp'),
|
|
linkBtn('https://t.me/share/url?url=' + encodeURIComponent(tgUrl) + '&text=' + encodeURIComponent(tgLead), 'Telegram')
|
|
];
|
|
texts.appendChild(block(text, '<span class="pb-net">Text ' + (i + 1) + (t.angle ? ' · ' + esc(t.angle) + ' angle' : ' · general') + '</span> <b>' + esc(t.title) + '</b>', extras));
|
|
});
|
|
}
|
|
// swipes
|
|
const sw = $('promoSwipeWrap');
|
|
if (sw && sw.dataset.filled !== link) {
|
|
sw.dataset.filled = link; sw.innerHTML = '';
|
|
for (const s of SWIPES) {
|
|
const text = 'Subject: ' + s.subject + '\n\n' + fillLink(s.body, link);
|
|
sw.appendChild(block(text, '<span class="pb-net">' + esc(s.tier) + '</span> <b>' + esc(s.subject) + '</b>'));
|
|
}
|
|
}
|
|
// objections
|
|
const ob = $('promoObjections');
|
|
if (ob && ob.dataset.filled !== link) {
|
|
ob.dataset.filled = link; ob.innerHTML = '';
|
|
for (const o of OBJECTIONS) {
|
|
const d = document.createElement('details'); d.className = 'obj';
|
|
const s = document.createElement('summary'); s.textContent = o.q; d.appendChild(s);
|
|
const body = document.createElement('div'); body.className = 'obj-body';
|
|
const t = document.createElement('div'); t.className = 'obj-truth';
|
|
t.innerHTML = '<span class="lab">The truth</span><p>' + esc(o.truth) + '</p>'; body.appendChild(t);
|
|
const say = fillLink(o.say, link);
|
|
const sayEl = block(say, '<span class="lab lab-say">Say this</span>');
|
|
sayEl.classList.add('obj-say'); body.appendChild(sayEl);
|
|
d.appendChild(body); ob.appendChild(d);
|
|
}
|
|
}
|
|
// handouts link
|
|
if ($('flyersOpen')) $('flyersOpen').href = '/flyers' + (token ? '?ref=' + encodeURIComponent(token) : '');
|
|
try { if (token) localStorage.setItem('iap.ref', String(token)); } catch (e) {}
|
|
}
|
|
|
|
return { fill, POSTS, TEXTS, SWIPES, OBJECTIONS };
|
|
})();
|