Promo tools built out: posts, text-a-friend, swipes, banner kit, handouts, objections
- 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>
This commit is contained in:
+11
-35
@@ -401,7 +401,7 @@
|
||||
} catch (e) {}
|
||||
// ready-to-send share message + promo tools, personalized
|
||||
const link = location.origin + '/join/' + (d.username || d.refCode || d.memberId || '');
|
||||
fillPromo(link);
|
||||
fillPromo(link, d);
|
||||
if (d.username) { // wall link rides the username
|
||||
const wl = location.origin + '/wall/' + d.username;
|
||||
$('wallLine').textContent = wl;
|
||||
@@ -1013,7 +1013,7 @@
|
||||
b.addEventListener('click', () => setEarnSub(b.dataset.earn)));
|
||||
// promo tools: pill menu switches between posts / swipes / banners / wall / videos
|
||||
function setPromoSub(name) {
|
||||
const ids = ['posts', 'swipe', 'banners', 'wall', 'videos'];
|
||||
const ids = ['posts', 'text', 'swipe', 'banners', 'flyers', 'wall', 'objections', 'videos'];
|
||||
if (!ids.includes(name)) name = 'posts';
|
||||
ids.forEach(id => { const el = $('promo-' + id); if (el) el.hidden = id !== name; });
|
||||
document.querySelectorAll('.promo-pills [data-promo]').forEach(b => {
|
||||
@@ -1124,45 +1124,18 @@
|
||||
}
|
||||
$('ibBack').addEventListener('click', ev => { ev.preventDefault(); clearInterval(ibTimer); loadInbox(); });
|
||||
|
||||
// ── promo tools: Branded Voice copy, personalized with the member link ──
|
||||
const PROMO_POSTS = [
|
||||
'A membership site where money is handled by code, not people. Every purchase splits instantly to sponsor wallets on the Polygon blockchain. Nothing to withdraw. The money just lands in your wallet. Plus you earn ad credits for viewing ads while you\'re there. {{LINK}}',
|
||||
'No withdrawal button. Think about that. A smart contract on Polygon splits every payment the second it hits. 50% to the sponsor. 20% to the next level. 10% to the next. Lands straight in your own wallet. No button to push. No waiting. Just money where it belongs. See how it works: {{LINK}}',
|
||||
'Every payment is public on the blockchain. You can watch the ledger move in real time. Every split, every wallet, every transaction. Nothing hidden. Nothing you have to take on faith. That\'s the difference between a platform that asks for trust and one where trust isn\'t needed. See for yourself: {{LINK}}'
|
||||
];
|
||||
const PROMO_SWIPE = {
|
||||
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 doesn\'t 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\'s advertising, not investing.\n\n{{LINK}}'
|
||||
};
|
||||
function promoBlock(text) {
|
||||
const div = document.createElement('div');
|
||||
div.className = 'promo-block';
|
||||
div.textContent = text;
|
||||
const btn = document.createElement('button');
|
||||
btn.className = 'btn small sec';
|
||||
btn.textContent = 'Copy';
|
||||
btn.addEventListener('click', async () => {
|
||||
try { await navigator.clipboard.writeText(text); IAP.status('Copied. Paste it anywhere.', 'ok'); }
|
||||
catch (e) { IAP.status('Copy failed. Select the text instead.', 'bad'); }
|
||||
});
|
||||
div.appendChild(btn);
|
||||
return div;
|
||||
}
|
||||
function fillPromo(link) {
|
||||
const posts = $('promoPosts');
|
||||
if (!posts || posts.dataset.filled === link) return;
|
||||
posts.dataset.filled = link;
|
||||
posts.innerHTML = '';
|
||||
for (const p of PROMO_POSTS) posts.appendChild(promoBlock(p.replace('{{LINK}}', link)));
|
||||
const sw = $('promoSwipeWrap');
|
||||
sw.innerHTML = '';
|
||||
sw.appendChild(promoBlock('Subject: ' + PROMO_SWIPE.subject + '\n\n' + PROMO_SWIPE.body.replace('{{LINK}}', link)));
|
||||
// ── promo tools: content + rendering live in promo.js (IAPPromo.fill) ──
|
||||
function fillPromo(link, me) {
|
||||
if (window.IAPPromo) IAPPromo.fill(link, me || {});
|
||||
// banner kit
|
||||
const bwrap = $('promoBanners');
|
||||
if (bwrap && !bwrap.dataset.filled) {
|
||||
bwrap.dataset.filled = '1';
|
||||
const BANNERS = [
|
||||
{ file: 'iap-hero-1200x630.png', size: '1200×630 (social / hero)' },
|
||||
{ file: 'iap-1080x1080.png', size: '1080×1080 (Instagram / Facebook square)' },
|
||||
{ file: 'iap-1080x1920.png', size: '1080×1920 (story / reel)' },
|
||||
{ file: 'iap-1280x720.png', size: '1280×720 (Telegram group post)' },
|
||||
{ file: 'iap-728x90.png', size: '728×90 (leaderboard)' },
|
||||
{ file: 'iap-336x280.png', size: '336×280 (large rectangle)' },
|
||||
{ file: 'iap-300x250.png', size: '300×250 (rectangle)' },
|
||||
@@ -1179,6 +1152,9 @@
|
||||
d.className = 'pb-item';
|
||||
d.innerHTML = '<img src="/banners/' + b.file + '?v=3" alt="InstantAdPay banner ' + b.size + '" loading="lazy">'
|
||||
+ '<div class="pb-row"><span class="pb-size">' + b.size + '</span></div>';
|
||||
const dl = document.createElement('a');
|
||||
dl.className = 'btn small'; dl.textContent = 'Download'; dl.href = '/banners/' + b.file; dl.setAttribute('download', b.file);
|
||||
d.querySelector('.pb-row').appendChild(dl);
|
||||
const btn = document.createElement('button');
|
||||
btn.className = 'btn small sec';
|
||||
btn.textContent = 'Copy image URL';
|
||||
|
||||
Reference in New Issue
Block a user