Give the top of the ladder a real prize: Team Grants + Network Intelligence

Marty's read was right — the upper tiers felt flat, and the reason is that
they scaled QUANTITY, not KIND. L1->L2 was a category change (you couldn't
write, now you can). Everything above L4 was a multiplier on a capability
already owned at L2: sound more like you, measure it, more pages, five at
once. Meanwhile the price doubles each rung — Corona costs ~17x Culmen. No
batch button is worth 17x a voice profile.

The fix is a change of axis. Every tool from L1 to L8 was a "me" tool, but
past the first levels this business isn't about you: get two, help your two,
teach them to teach. So the top now operates on the ORGANISATION.

L7 Team Grants — hand Suite capacity down to anyone in your own org.
Deliberately from a separate pool that the level grants, NOT out of the
leader's own allowance: making someone choose between equipping their team
and using their own tools means nobody ever grants anything. Recipients are
verified in-org against the contract. Grants can lift a tool the recipient's
level hasn't unlocked — that's the point, not a loophole. Being helped is
made visible to the recipient, since half the value is knowing an upline
backed you.

L8 Network Intelligence — every team ad pooled and anonymised: which angles,
headlines, creative and formats actually earn their impressions. No member
alone has enough traffic to learn anything from display; together they do.
It can't be bought, and it compounds monthly with no further work. Holds two
lines: nothing identifies anyone, and nothing under 2,000 impressions gets a
reported rate — under-evidenced rows are counted and disclosed rather than
silently dropped. The written readout is hand-authored, not generated:
these are conclusions about money, and a model paraphrasing a table is
exactly where an invented number slips in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-08-28 12:26:39 -05:00
parent 1d52597c1c
commit 6a7c5161ff
11 changed files with 760 additions and 11 deletions
+68
View File
@@ -0,0 +1,68 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex"><meta name="description" content="Team Grants — hand Suite capacity down into your own organisation."><title>Team Grants | The Circle Suite</title><link rel="icon" type="image/png" href="/favicon.png"><link rel="stylesheet" href="/styles.css">
<style>
.gw{max-width:860px;margin:0 auto;padding:24px 20px 70px}
.gw h1{font-size:clamp(26px,4.5vw,36px);margin:6px 0 8px}
.gw .lede{color:var(--muted);line-height:1.6;margin-bottom:18px}
#gGate{display:none;border:2px solid var(--gold);border-radius:12px;padding:16px 20px;margin-bottom:18px;line-height:1.6}
.g-card{background:var(--card,#0d2236);border:1px solid var(--line,#24425d);border-radius:14px;padding:18px 20px;margin-bottom:16px}
.g-pools{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:6px}
.g-pool{border:2px solid var(--line);border-radius:12px;padding:12px 14px;cursor:pointer;transition:border-color .12s}
.g-pool.on{border-color:var(--gold);background:rgba(212,175,55,.07)}
.g-pool .big{font-size:24px;font-weight:900;color:var(--gold);font-variant-numeric:tabular-nums;line-height:1}
.g-pool .lab{font-size:11.5px;font-weight:800;letter-spacing:1.1px;text-transform:uppercase;color:var(--muted);margin-top:5px;line-height:1.35}
.g-pool .of{font-size:12px;color:var(--muted);margin-top:5px}
label.g-lab{display:block;font-weight:700;font-size:14px;margin:16px 0 5px}
.g-hint{color:var(--muted);font-size:12.5px;line-height:1.5;margin-bottom:7px}
.g-card input[type=number]{width:150px;background:var(--bg,#0b1d2e);border:1px solid var(--line);border-radius:10px;color:var(--text);padding:10px 12px;font-size:15px}
.g-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:16px}
#gErr{display:none;color:#f0a05a;margin-top:12px;font-size:14px;line-height:1.55}
#gOk{display:none;border:2px solid var(--teal);border-radius:12px;padding:14px 18px;margin-top:14px;line-height:1.6}
.g-tbl{width:100%;border-collapse:collapse;font-size:14px}
.g-tbl th{text-align:left;padding:7px 9px;font-size:10.5px;letter-spacing:1px;text-transform:uppercase;color:var(--muted);border-bottom:2px solid var(--line)}
.g-tbl td{padding:8px 9px;border-bottom:1px solid var(--line);color:var(--muted);font-variant-numeric:tabular-nums}
.g-tbl td b{color:var(--text)}
.g-got{border:2px solid var(--teal);border-radius:14px;padding:14px 18px;margin-bottom:18px;line-height:1.65}
.spin{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.25);border-top-color:var(--gold);border-radius:50%;animation:sp .8s linear infinite;vertical-align:-2px;margin-right:7px}
@keyframes sp{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.spin{animation:none}}
.g-note{margin-top:22px;font-size:12.5px;color:var(--muted);line-height:1.6;border-top:1px solid var(--line);padding-top:12px}
</style></head>
<body>
<header class="wrap nav"><a class="brand" href="/suite"><img class="brand-mark" src="/logo.jpg" alt="The RM Circle" width="42" height="42"><span><span id="brandName">RM Circle</span><small>Team Grants</small></span></a><div class="nav-actions"><a class="btn btn-secondary hide-mobile" href="/suite">← The Suite</a><a class="btn btn-primary" href="/my">My Dashboard</a></div></header>
<main class="gw">
<div class="eyebrow" style="color:var(--gold)">CIRCLE SUITE · VERTEX (LEVEL 7)</div>
<h1>Team <span class="gold">Grants.</span></h1>
<p class="lede">Every other tool in the Suite helps you. This one helps the people under you. Hand your own capacity — ad impressions, copy generations, page builds — to anyone in your organisation who is stuck without it.</p>
<div id="gGate"></div>
<div id="gGot"></div>
<div id="gBody" style="display:none">
<div class="g-card">
<label class="g-lab" style="margin-top:0">What do you want to give?</label>
<div class="g-pools" id="gPools"></div>
<label class="g-lab" for="gTo">Who needs it?</label>
<div class="g-hint">Their position number. It has to be someone in your own organisation — check <a href="/suite/leader" style="color:var(--gold);font-weight:700">Leader Ops</a> if you are not sure who is stuck.</div>
<input type="number" id="gTo" min="1" step="1" placeholder="46">
<label class="g-lab" for="gN">How much?</label>
<input type="number" id="gN" min="1" step="1">
<div class="g-hint" id="gNHint"></div>
<div class="g-row"><button id="gGo" class="btn btn-primary">🎁 Give it to them</button></div>
<div id="gErr"></div>
<div id="gOk"></div>
</div>
<div id="gHistWrap" style="display:none">
<h2 style="font-size:19px;margin:22px 0 10px">What you've given this month</h2>
<div class="table-wrap"><table class="g-tbl"><thead><tr><th>To</th><th>What</th><th>How much</th><th>When</th></tr></thead><tbody id="gHist"></tbody></table></div>
</div>
</div>
<p class="g-note"><strong style="color:var(--text)">Grants come out of a separate monthly pool that your level gives you</strong> — giving to your team never eats into your own allowances, because nobody should have to choose between equipping their people and using their own tools. Pools reset on the 1st along with everything else, so a grant is for unblocking somebody now rather than building a balance. <br><br>Independent team resource · No income is guaranteed · Cryptocurrency involves risk.</p>
</main>
<script src="/suite-grants.js"></script>
<script src="/chat.js" defer></script>
<script src="/translate.js" defer></script><script src="/tg-app.js" defer></script><script src="/nav-dash.js" defer></script></body></html>
+160
View File
@@ -0,0 +1,160 @@
// Team Grants client.
(function () {
'use strict';
var $ = function (id) { return document.getElementById(id); };
function esc(s) {
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
});
}
function n(v) { return Number(v || 0).toLocaleString(); }
var state = { tool: null, status: null, level: 0, minLevel: 7 };
function gate(msg) {
$('gGate').style.display = 'block';
$('gGate').innerHTML = msg;
}
// Shown to everyone, including people below level 7 — being helped should be
// visible, not silent.
function renderReceived(received) {
var keys = Object.keys(received || {});
if (!keys.length) { $('gGot').innerHTML = ''; return; }
var parts = keys.map(function (k) {
var r = received[k];
var who = r.from.map(function (f) { return '#' + f.by; });
var uniq = who.filter(function (v, i) { return who.indexOf(v) === i; });
var t = (state.status && state.status.tools[k]) || {};
return '<div>· <b style="color:var(--text)">' + n(r.total) + ' ' + esc(t.unit || k) +
'</b> of ' + esc((t.label || k).toLowerCase()) + ', from ' + uniq.join(', ') + '</div>';
});
$('gGot').innerHTML = '<div class="g-got"><b style="color:var(--teal)">Someone above you topped you up this month.</b>' +
parts.join('') + '<div style="color:var(--muted);font-size:12.5px;margin-top:6px">' +
'It is already added to your allowances — nothing to claim.</div></div>';
}
function renderPools() {
var host = $('gPools');
host.innerHTML = '';
var tools = state.status.tools;
Object.keys(tools).forEach(function (k) {
var t = tools[k];
var d = document.createElement('div');
d.className = 'g-pool' + (state.tool === k ? ' on' : '');
d.innerHTML = '<div class="big">' + n(t.remaining) + '</div>' +
'<div class="lab">' + esc(t.label) + '</div>' +
'<div class="of">left to give of ' + n(t.pool) + '</div>';
d.addEventListener('click', function () {
state.tool = k;
renderPools();
var el = $('gN');
el.max = Math.min(t.max, t.remaining);
el.step = t.step;
el.value = Math.min(t.step, t.remaining) || '';
$('gNHint').textContent = 'Up to ' + n(Math.min(t.max, t.remaining)) + ' ' + t.unit +
' in one go. You have ' + n(t.remaining) + ' left to give this month.';
});
host.appendChild(d);
});
}
function renderHistory(hist) {
if (!hist || !hist.length) { $('gHistWrap').style.display = 'none'; return; }
$('gHistWrap').style.display = 'block';
var tb = $('gHist');
tb.innerHTML = '';
hist.forEach(function (h) {
var t = (state.status.tools[h.tool]) || {};
var tr = document.createElement('tr');
tr.innerHTML = '<td><b>#' + esc(h.to) + '</b></td>' +
'<td>' + esc(t.label || h.tool) + '</td>' +
'<td><b>' + n(h.n) + '</b> ' + esc(t.unit || '') + '</td>' +
'<td>' + esc(String(h.at || '').slice(0, 10)) + '</td>';
tb.appendChild(tr);
});
}
async function give() {
$('gErr').style.display = 'none';
$('gOk').style.display = 'none';
if (!state.tool) {
$('gErr').textContent = 'Pick what you want to give first.';
$('gErr').style.display = 'block';
return;
}
var to = Number($('gTo').value) || 0;
var amount = Number($('gN').value) || 0;
if (!to) {
$('gErr').textContent = 'Enter the position number you want to help.';
$('gErr').style.display = 'block';
return;
}
$('gGo').disabled = true;
$('gGo').innerHTML = '<span class="spin"></span>Sending…';
try {
var r = await fetch('/api/public/suite-grants', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ to: to, tool: state.tool, n: amount })
});
var d = await r.json();
if (!r.ok) {
$('gErr').textContent = d.error || 'That did not go through.';
$('gErr').style.display = 'block';
} else {
state.status = d.status;
var t = state.status.tools[d.granted.tool] || {};
$('gOk').innerHTML = '✅ <b>Sent.</b> #' + esc(d.granted.to) + ' now has ' + n(d.granted.n) + ' more ' +
esc(t.unit || '') + ' this month. Worth telling them — it will just appear in their allowance otherwise.';
$('gOk').style.display = 'block';
renderPools();
renderHistory(state.status.history);
}
} catch (e) {
$('gErr').textContent = 'Connection hiccup — try again.';
$('gErr').style.display = 'block';
}
$('gGo').disabled = false;
$('gGo').innerHTML = '🎁 Give it to them';
}
async function boot() {
try {
var r = await fetch('/api/public/suite-grants');
if (r.status === 401) { gate('You’re not signed in yet. <a href="/suite" style="color:var(--gold);font-weight:700">Open the Suite</a> and connect the wallet that holds your position, then come back.'); return; }
if (r.status === 403) {
var g = await r.json();
gate((g.error || 'Not open for this position yet.') + ' <a href="/suite" style="color:var(--gold);font-weight:700">See your Suite</a>.');
return;
}
if (!r.ok) return;
var d = await r.json();
state.status = d.status;
state.level = d.level;
state.minLevel = d.minLevel;
renderReceived(d.status.received);
if (!d.status.canGrant) {
gate('<b>Team Grants unlock at Vertex (level 7).</b> At that point you can hand your own Suite capacity ' +
'down to anyone in your organisation who needs it. Anything granted <em>to</em> you shows above and is already in your allowances.');
return;
}
$('gBody').style.display = 'block';
var first = Object.keys(d.status.tools)[0];
state.tool = first;
renderPools();
var t = d.status.tools[first];
$('gN').max = Math.min(t.max, t.remaining);
$('gN').step = t.step;
$('gN').value = Math.min(t.step, t.remaining) || '';
$('gNHint').textContent = 'Up to ' + n(Math.min(t.max, t.remaining)) + ' ' + t.unit + ' in one go.';
renderHistory(d.status.history);
} catch (e) {}
}
document.addEventListener('DOMContentLoaded', function () {
boot();
$('gGo').addEventListener('click', give);
});
})();
+50
View File
@@ -0,0 +1,50 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex"><meta name="description" content="Network Intelligence — what is actually working across every ad the whole team runs."><title>Network Intelligence | The Circle Suite</title><link rel="icon" type="image/png" href="/favicon.png"><link rel="stylesheet" href="/styles.css">
<style>
.iw{max-width:940px;margin:0 auto;padding:24px 20px 70px}
.iw h1{font-size:clamp(26px,4.5vw,36px);margin:6px 0 8px}
.iw .lede{color:var(--muted);line-height:1.6;margin-bottom:18px}
#iGate{display:none;border:2px solid var(--gold);border-radius:12px;padding:16px 20px;margin-bottom:18px;line-height:1.6}
.i-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin-bottom:16px}
.i-tile{border:2px solid var(--line);border-radius:14px;padding:14px 16px}
.i-tile .big{font-size:26px;font-weight:900;color:var(--gold);font-variant-numeric:tabular-nums;line-height:1}
.i-tile.cool .big{color:var(--teal)}
.i-tile .lab{font-size:11px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;color:var(--muted);margin-top:5px;line-height:1.35}
#iReadout{border:2px solid var(--teal);border-radius:14px;padding:16px 19px;margin-bottom:18px;line-height:1.75}
#iReadout div{margin-bottom:7px}
#iReadout div:last-child{margin-bottom:0}
.i-sec{background:var(--card,#0d2236);border:1px solid var(--line,#24425d);border-radius:14px;padding:16px 18px;margin-bottom:14px}
.i-sec h2{font-size:17px;margin:0 0 3px}
.i-sec .why{color:var(--muted);font-size:12.5px;line-height:1.55;margin-bottom:10px}
.i-tbl{width:100%;border-collapse:collapse;font-size:14px}
.i-tbl th{text-align:left;padding:7px 9px;font-size:10.5px;letter-spacing:1px;text-transform:uppercase;color:var(--muted);border-bottom:2px solid var(--line)}
.i-tbl td{padding:8px 9px;border-bottom:1px solid var(--line);color:var(--muted);font-variant-numeric:tabular-nums}
.i-tbl tr:first-child td{color:var(--text)}
.i-tbl tr:first-child td b{color:var(--gold)}
.i-bar{height:6px;border-radius:3px;background:var(--gold);min-width:2px}
.i-thin{color:var(--muted);font-size:12px;margin-top:9px;font-style:italic}
.spin{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.25);border-top-color:var(--gold);border-radius:50%;animation:sp .8s linear infinite;vertical-align:-2px;margin-right:7px}
@keyframes sp{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.spin{animation:none}}
.i-note{margin-top:22px;font-size:12.5px;color:var(--muted);line-height:1.6;border-top:1px solid var(--line);padding-top:12px}
</style></head>
<body>
<header class="wrap nav"><a class="brand" href="/suite"><img class="brand-mark" src="/logo.jpg" alt="The RM Circle" width="42" height="42"><span><span id="brandName">RM Circle</span><small>Network Intelligence</small></span></a><div class="nav-actions"><a class="btn btn-secondary hide-mobile" href="/suite">← The Suite</a><a class="btn btn-primary" href="/my">My Dashboard</a></div></header>
<main class="iw">
<div class="eyebrow" style="color:var(--gold)">CIRCLE SUITE · CORONA (LEVEL 8)</div>
<h1>Network <span class="gold">Intelligence.</span></h1>
<p class="lede">Every member running ads is answering the same question: which words make a stranger click. On their own, none of them has enough traffic to know. Pooled across the whole team, it becomes an answer — and one nobody outside this team can buy.</p>
<div id="iGate"></div>
<div id="iLoading" style="color:var(--muted)"><span class="spin"></span>Reading the network…</div>
<div id="iBody" style="display:none">
<div class="i-tiles" id="iTiles"></div>
<div id="iReadout"></div>
<div id="iSections"></div>
</div>
<p class="i-note"><strong style="color:var(--text)">Nothing here identifies anybody.</strong> No positions, no names, no per-person numbers — this is a picture of what works, not a leaderboard of who is working. Groupings with too little traffic behind them are held back and counted rather than shown, because a click rate built on a few hundred impressions is noise dressed up as insight. <br><br>Independent team resource · No income is guaranteed · Cryptocurrency involves risk.</p>
</main>
<script src="/suite-intel.js"></script>
<script src="/chat.js" defer></script>
<script src="/translate.js" defer></script><script src="/tg-app.js" defer></script><script src="/nav-dash.js" defer></script></body></html>
+89
View File
@@ -0,0 +1,89 @@
// Network Intelligence client — renders the pooled, anonymised ad results.
(function () {
'use strict';
var $ = function (id) { return document.getElementById(id); };
function esc(s) {
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
});
}
function n(v) { return Number(v || 0).toLocaleString(); }
function pct(r) { return (Number(r || 0) * 100).toFixed(3) + '%'; }
function gate(msg) {
$('iLoading').style.display = 'none';
$('iGate').style.display = 'block';
$('iGate').innerHTML = msg;
}
function tile(v, label, cls) {
return '<div class="i-tile ' + (cls || '') + '"><div class="big">' + v + '</div><div class="lab">' + label + '</div></div>';
}
function section(title, why, group, unitLabel) {
if (!group || !group.rows.length) return '';
var top = group.rows[0].rate || 1;
var rows = group.rows.map(function (r) {
var w = Math.max(2, Math.round((r.rate / top) * 100));
return '<tr><td><b>' + esc(r.label) + '</b></td>' +
'<td>' + n(r.served) + '</td>' +
'<td>' + n(r.clicks) + '</td>' +
'<td><b>' + pct(r.rate) + '</b></td>' +
'<td style="width:110px"><div class="i-bar" style="width:' + w + '%"></div></td></tr>';
}).join('');
var thin = group.thin
? '<div class="i-thin">' + group.thin + ' more not shown — under the evidence threshold (' +
n(group.thinServed) + ' impressions between them).</div>'
: '';
return '<div class="i-sec"><h2>' + esc(title) + '</h2><div class="why">' + esc(why) + '</div>' +
'<div class="table-wrap"><table class="i-tbl"><thead><tr><th>' + esc(unitLabel) +
'</th><th>Served</th><th>Clicks</th><th>Rate</th><th></th></tr></thead><tbody>' +
rows + '</tbody></table></div>' + thin + '</div>';
}
function render(d) {
var rep = d.report;
$('iLoading').style.display = 'none';
if (!rep || !rep.ready) {
gate('<b>Not enough data yet.</b> ' + esc((rep && rep.reason) || 'This fills in as the team advertises.'));
return;
}
$('iBody').style.display = 'block';
$('iTiles').innerHTML =
tile(n(rep.totals.ads), 'team ads measured', 'cool') +
tile(n(rep.totals.served), 'impressions served') +
tile(n(rep.totals.clicks), 'clicks', 'cool') +
tile(pct(rep.totals.rate), 'network click rate');
$('iReadout').innerHTML = (d.readout || []).map(function (line) {
return '<div>' + esc(line) + '</div>';
}).join('') || '<div>Not enough evidence yet to draw conclusions.</div>';
var html = '';
html += section('Format', 'Text placements against banner placements, across everything the team has run.', rep.format, 'Format');
html += section('Angle', 'Which hook the destination link carried. This is the one worth acting on — it tells you what to lead with everywhere, not just in ads.', rep.angle, 'Angle');
html += section('Banner creative', 'Which designs from the team kit are actually earning their impressions.', rep.creative, 'Design');
html += section('Banner size', 'Placement size, pooled across every design.', rep.size, 'Size');
html += section('Text ad headlines', 'Individual headlines that have run enough to be judged.', rep.headline, 'Headline');
$('iSections').innerHTML = html || '<div class="i-sec"><div class="why">Nothing has crossed the evidence threshold yet. Keep the ads running.</div></div>';
}
async function boot() {
try {
var r = await fetch('/api/public/suite-intel');
if (r.status === 401) { gate('You’re not signed in yet. <a href="/suite" style="color:var(--gold);font-weight:700">Open the Suite</a> and connect the wallet that holds your position, then come back.'); return; }
if (r.status === 403) {
var g = await r.json();
gate((g.error || 'Not open for this position yet.') + ' <a href="/suite" style="color:var(--gold);font-weight:700">See your Suite</a>.');
return;
}
if (!r.ok) { gate('Could not read the network just now — try again shortly.'); return; }
render(await r.json());
} catch (e) {
gate('Connection hiccup — reload to try again.');
}
}
document.addEventListener('DOMContentLoaded', boot);
})();
+2
View File
@@ -21,6 +21,8 @@
{ lv: 5, ico: '🔬', name: 'Split Tester', desc: 'Run two or three versions of an ad head to head and find out which wording people actually click. Apex is where your impressions jump to 50,000 — enough for the answer to mean something.', href: '/suite/split', live: true },
{ lv: 1, ico: '🚦', name: 'Traffic Desk', desc: 'Syndicated network display advertising — run banners or AI-written text ads on the team’s own ad network. Monthly impressions scale with your level: 2,500 at Scintilla up to 150,000 at Corona.', href: '/suite/traffic', live: true },
{ lv: 6, ico: '🏭', name: 'Funnel Factory', desc: 'A separate hosted landing page for every audience you talk to — each on its own address, each one something you can point a different ad at.', href: '/suite/funnel', live: true },
{ lv: 7, ico: '🎁', name: 'Team Grants', desc: 'Hand Suite capacity down into your own organisation — impressions, generations, page builds. Your level stops being something you bought for yourself and becomes something you give your team.', href: '/suite/grants', live: true },
{ lv: 8, ico: '🛰️', name: 'Network Intelligence', desc: 'What is actually working across every ad the whole team runs — best angles, headlines and creative, pooled and anonymised. Nobody can buy this; it is the team\'s own accumulated result, and it compounds every month.', href: '/suite/intel', live: true },
{ lv: 7, ico: '🧭', name: 'Leader Ops', desc: 'Everyone below you, read live from the contract and sorted by who needs you most — plus a written coaching plan you can teach forward to your own two.', href: '/suite/leader', live: true },
{ lv: 8, ico: '👑', name: 'Founder Desk', desc: 'A whole week of promotion built in one pass — posts, outreach messages, an email and text ads — plus an API key to pull your position, your organisation and the writer into anything you already run.', href: '/suite/founder', live: true }
];