1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[72],{72:function(s,e,t){t.r(e),t.d(e,{default:function(){return c}});var n=t(85893),a=t(67294);let i="/performance/rtp-performance.css";function o(){document.querySelectorAll("script[data-rtp-renderer]").forEach(s=>s.remove())}async function l(){o();let s=await fetch("/api/rtp-performance/renderer",{credentials:"same-origin",headers:{accept:"application/javascript, text/javascript, */*"}});if(!s.ok)throw Error("the renderer route answered ".concat(s.status));let e=await s.text(),t=document.createElement("script");t.dataset.rtpRenderer="true",t.textContent="(function(){\n".concat(e,"\n})();"),document.body.appendChild(t)}async function d(s){let e=await fetch("/api/rtp-performance/data",{headers:{accept:"application/json"},credentials:"same-origin",signal:s});if(!e.ok)throw Error("the data route answered ".concat(e.status));let t=await e.json();if(!t||!(t.data||t).ledger)throw Error("the response did not look like the dashboard dataset");window.__RTP__=t.data||t,window.__RTP_META__={publishedAt:t.publishedAt||null},await l()}function c(){let s=(0,a.useRef)(null),[e,t]=(0,a.useState)(""),[l,c]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{let s=!1,e=new AbortController;return function(){if(document.querySelector('link[href="'.concat(i,'"]')))return;let s=document.createElement("link");s.rel="stylesheet",s.href=i,document.head.appendChild(s)}(),c(!1),t(""),d(e.signal).then(()=>{s||c(!0)}).catch(e=>{s||e instanceof DOMException&&"AbortError"===e.name||t(e instanceof Error?e.message:String(e))}),()=>{s=!0,e.abort(),o()}},[]),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{ref:s,dangerouslySetInnerHTML:{__html:'<div class="rtp-embed">\n\n<div class="shell">\n\n <aside class="rail" aria-label="Report sections">\n <nav class="navlist">\n<button class="navitem" type="button" data-view="overview" aria-current="page">Overview</button>\n <p class="navgroup">Sales</p>\n <button class="navitem" type="button" data-view="ledger">Sales Ledger</button>\n <button class="navitem" type="button" data-view="setters">Setters</button>\n <button class="navitem" type="button" data-view="closers">Closers</button>\n <button class="navitem" type="button" data-view="doors">Doors</button>\n <button class="navitem" type="button" data-view="speed">Speed to Book</button>\n <button class="navitem" type="button" data-view="retention">Cancellations</button>\n <p class="navgroup">Volume</p>\n <button class="navitem" type="button" data-view="production">Monthly Totals</button>\n <button class="navitem" type="button" data-view="funnel">Funnel Rates</button>\n <p class="navgroup">Marketing</p>\n <button class="navitem" type="button" data-view="sources">By Lead Source</button>\n <button class="navitem" type="button" data-view="spend">Spend</button>\n <button class="navitem" type="button" data-view="cost">Cost per Sale & Install</button>\n <button class="navitem" type="button" data-view="paid">Paid Media</button>\n <button class="navitem" type="button" data-view="campaigns">Campaigns</button>\n <button class="navitem" type="button" data-view="method">Method & Sources</button>\n </nav> </aside>\n\n <div class="mainpane">\n <header class="topbar">\n <div class="controls">\n <label for="f-month">Period</label>\n <select id="f-month"></select>\n <label for="f-src">Lead source</label>\n <select id="f-src"><option value="">All sources</option></select>\n <button class="tg" id="f-thin" aria-pressed="false" type="button">Hide thin samples</button>\n <button class="tg" id="f-reset" type="button">Reset</button>\n </div>\n <div class="stamp" id="stamp">Data as of 28 July 2026</div>\n </header>\n\n <!-- The skip link targets this, not the outer wrapper. Pointing it at the top of the\n document put the reader ABOVE the fifteen-item section list rather than past it,\n so "Skip to report" skipped nothing. -->\n <div class="pane" id="main">\n <p class="meta">Jan–25 Jun is the inherited baseline; Anthony Wesley took over marketing 26 June. Sources: Podio, GoHighLevel, the canvassing team’s appointment board, Google and Meta, vendor invoices. For verification with the team, not audited.</p>\n\n<div class="view" id="v-overview">\n <header class="vhead">\n <p class="eyebrow" id="hero-eyebrow">July 2026</p>\n <h2 class="vtitle">What we sold, and how much of it stuck</h2>\n </header>\n <section class="vsec">\n <div class="hero reveal">\n <div>\n <div class="hero-numeral" id="hero-figure">–</div>\n <p class="hero-lead" id="hero-lead"></p>\n <div class="hero-sub" id="hero-sub"></div>\n </div>\n <div class="hero-trio" id="hero-trio"></div>\n </div>\n <div class="reveal" id="briefing"></div>\n </section>\n <section class="vsec">\n <p class="seclabel reveal">The Funnel, Step by Step</p>\n <div class="kpis reveal" id="kpis"></div>\n <div class="asides reveal" id="kpi-asides" hidden></div>\n <details class="howto">\n <summary>How these figures are measured</summary>\n <p>Headline numbers follow the selected period and source. Full-year matrices keep every month visible; lifecycle outcomes are year to date. <strong>GoHighLevel owns the current month’s appointments and sits; Podio owns sales and installs.</strong> Sit rate uses settled appointments only. Installs completed this period from jobs sold in a prior year are reported separately.</p>\n <p id="sum-note"></p>\n </details>\n </section>\n <section class="vsec">\n <p class="seclabel">The Year in Shape</p>\n <div class="chartgrid two" id="ch-row1"></div>\n <div class="chartgrid two" id="ch-row2"></div>\n </section>\n <section class="vsec">\n <p class="seclabel">Every Month on One Line</p>\n <div class="scroll"><table id="t-glance"></table></div>\n <p class="small">The current month is partial. Its appointments and sits come from GoHighLevel; sales from the project system.</p>\n </section>\n</div>\n\n<div class="view" id="v-production" hidden>\n <header class="vhead">\n <p class="eyebrow">Production</p>\n <h2 class="vtitle">Monthly totals: leads, appointments, sits, sales, installs</h2>\n </header>\n <section class="vsec">\n <div class="kpis" id="prod-kpis"></div>\n </section>\n <section class="vsec">\n <div class="vread"><div class="vtxt" id="a7t"></div></div>\n </section>\n <section class="vsec">\n <div class="scroll"><table id="t-mom"></table></div>\n <p class="small">The current month’s appointments come from GoHighLevel;
1 installs are counted in the month the job completed.</p>\n </section>\n</div>\n\n<div class="view" id="v-sources" hidden>\n <header class="vhead">\n <p class="eyebrow">By Lead Source</p>\n <h2 class="vtitle">Every metric by lead source, <span id="src-title">July 2026</span></h2>\n <p class="vsub">One row per source, every metric side by side.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="srcv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="chartgrid two" id="ch-sources"></div>\n </section>\n <section class="vsec">\n <div class="scroll"><table id="t-src"></table></div>\n <p class="small">Same column definitions as the sales tracker. <strong>Net Conversion %</strong> is sold less cancelled, per lead: the number that cannot be flattered by selling jobs that do not stick. Small samples show raw counts instead of a percentage; a dash means no figure exists.</p>\n </section>\n</div>\n\n<div class="view" id="v-spend" hidden>\n <header class="vhead">\n <p class="eyebrow">Spend</p>\n <h2 class="vtitle">What we spent, by lead source and by month</h2>\n </header>\n <section class="vsec">\n <div class="kpis" id="spendv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="vread"><div class="vtxt" id="a1t"></div></div>\n </section>\n <section class="vsec">\n <div class="scroll"><table id="t-spend"></table></div>\n <p class="small">Badges show the basis: <span class="pill p-inv">INV</span> vendor invoice · <span class="pill p-plat">PLAT</span> ad platform · <span class="pill p-crm">CRM</span> recorded in the CRM.</p>\n </section>\n</div>\n\n<div class="view" id="v-funnel" hidden>\n <header class="vhead">\n <p class="eyebrow">Conversion</p>\n <h2 class="vtitle">Where the funnel loses its volume</h2>\n <p class="vsub">Each step, month by month and by source.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="funnelv-kpis"></div>\n </section>\n <section class="vsec">\n <p class="seclabel">Schedule Rate</p>\n <div class="vread"><div class="vfig" id="a2">–</div><div class="vtxt" id="a2t"></div></div>\n <div class="scroll"><table id="t-sched"></table></div>\n <p class="small">Appointments set divided by leads received, month by month.</p>\n </section>\n <section class="vsec">\n <p class="seclabel">Sit Rate</p>\n <div class="vread"><div class="vfig" id="a3">–</div><div class="vtxt" id="a3t"></div></div>\n <div class="scroll"><table id="t-pres"></table></div>\n <p class="seclabel" style="margin-top:20px">Where Every Appointment Stands</p>\n <div class="scroll"><table id="t-presbreak"></table></div>\n <p class="small">Appointments still to come, and those whose outcome was never recorded, sit outside the rate rather than counting as misses.</p>\n </section>\n <section class="vsec">\n <p class="seclabel">Close Rate</p>\n <div class="vread"><div class="vfig" id="a4">–</div><div class="vtxt" id="a4t"></div></div>\n <div class="scroll"><table id="t-close"></table></div>\n <p class="small">Sales divided by sits. The current month is partial and a share of its sits are still working toward a decision.</p>\n </section>\n</div>\n\n<div class="view" id="v-cost" hidden>\n <header class="vhead">\n <p class="eyebrow">Cost</p>\n <h2 class="vtitle">What a sale costs, and what an install costs</h2>\n </header>\n <section class="vsec">\n <div class="kpis" id="costv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="vread"><div class="vtxt" id="a5t"></div></div>\n </section>\n <section class="vsec">\n <p class="seclabel">Cost per Sale, by Lead Source</p>\n <div class="scroll"><table id="t-cpa"></table></div>\n <p class="small"><strong>Paid rows can read high</strong> where sales attribution is incomplete. The table reports only sales traceable to the named source; tracking work to close that gap is underway.</p>\n </section>\n <section class="vsec">\n <p class="seclabel">Cost per Install, and What Cancellations Do to It</p>\n <div class="vread"><div class="vfig" id="a6">
1–</div><div class="vtxt" id="a6t"></div></div>\n <p class="vsub" id="q6-lead"><strong>Start with what has actually happened in the 2026 sales cohort.</strong></p>\n <div class="scroll"><table id="t-scen"></table></div>\n <p class="small">Cost per install moves entirely on how many jobs survive to completion. Nothing else in this report has that much leverage over it.</p>\n </section>\n <section class="vsec">\n <p class="seclabel">By Source, Year to Date, on the 75% Assumption</p>\n <div class="scroll"><table id="t-cpi"></table></div>\n <p class="small">2026 spend against 2026 sales. <strong>Installed</strong> is certain; <strong>in progress</strong> is sold and not yet finished. Sources that sold without recorded spend are listed so the totals reconcile, but no cost per install can be calculated for them.</p>\n </section>\n <section class="vsec">\n <p class="seclabel">Which Sources Produce Jobs That Stick</p>\n <div class="scroll"><table id="t-ret"></table></div>\n </section>\n <section class="vsec">\n <p class="seclabel">Installs Completed Each Month</p>\n <div class="scroll"><table id="t-inst"></table></div>\n <p class="small" id="inst-note">–</p>\n </section>\n</div>\n\n<div class="view" id="v-retention" hidden>\n <header class="vhead">\n <p class="eyebrow">Retention</p>\n <h2 class="vtitle">Cancellations and net conversion</h2>\n <p class="vsub">Year-to-date cohort facts, ranked by cancel rate, worst first.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="retv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="scroll"><table id="t-canc"></table></div>\n <p class="small" id="canc-note"></p>\n </section>\n</div>\n\n<div class="view" id="v-setters" hidden>\n <header class="vhead">\n <p class="eyebrow">Setters</p>\n <h2 class="vtitle">What each setter booked, <span id="set-title">July 2026</span></h2>\n <p class="vsub">Counted on the date the appointment was set, which is the setter’s own output.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="setv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="chartgrid two" id="ch-setters"></div>\n </section>\n <section class="vsec">\n <div class="scroll"><table id="t-setters"></table></div>\n <p class="small" id="set-note"></p>\n </section>\n</div>\n\n<div class="view" id="v-doors" hidden>\n <header class="vhead">\n <p class="eyebrow">Canvassing</p>\n <h2 class="vtitle">What the doors team booked, <span id="doors-title">July 2026</span></h2>\n <p class="vsub">Appointment data only, from the sales system’s self-generated leads app.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="doors-kpis"></div>\n <div id="doors-gap"></div>\n </section>\n <section class="vsec">\n <div class="chartgrid two" id="ch-doors"></div>\n </section>\n <section class="vsec">\n <p class="seclabel">By Canvasser</p>\n <div class="scroll"><table id="t-doors"></table></div>\n </section>\n <section class="vsec">\n <p class="seclabel">Why Appointments Get Kicked</p>\n <div id="doors-lead"></div>\n <div class="chartgrid two" id="ch-kicked"></div>\n <div class="scroll"><table id="t-kicked"></table></div>\n <p class="small" id="kicked-note"></p>\n </section>\n <section class="vsec">\n <p class="seclabel">Every Job the Doors Team Sold</p>\n <div class="scroll"><table id="t-doors-ledger"></table></div>\n <p class="small" id="doors-note"></p>\n </section>\n <section class="vsec" id="sec-board" hidden>\n <p class="seclabel">Against the Team’s Own Board</p>\n <div class="vread"><div class="vfig" id="board-fig">–</div><div class="vtxt" id="board-intro"></div></div>\n <div class="kpis" id="board-kpis"></div>\n <div id="ch-grade"></div>\n <p class="small" id="grade-note"></p>\n <div class="scroll"><table id="t-board"></table></div>\n <p class="small" id="board-note"></p>\n </section>\n</div>\n\n<div class="view" id="v-closers" hidden>\n <header class="vhead">\n <p class="eyebrow">Closers</p>\n <h2 class="vtitle">What each closer did with the appointments they sat</h2>\n <p class="vsub">A closer is judged on what happened once they were in front of the customer, so the denominator is sits.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="closers-kpis"></div>\n </section>\n <section class="vsec">\n <div class="chartgrid two" id="ch-closers"></div>\n </section>\n <section class="vsec">\n <p class="seclabel">By Closer</p>\n <div class="scroll"><table id="t-closers"></table></div>\n <p class="small" id="closers-note"></p>\n </section>\n</div>\n\n<div class="view" id="v-paid" hidden>\n <header class="vhead">\n <p class="eyebrow">Paid Media</p>\n <h2 class="vtitle">Meta and Google, month by month</h2>\n <p class="vsub">What the ad platforms report on their own side. A conversion here is a form fill or a call, <strong>not a sale</strong>.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="paidv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="scroll"><table id="t-plat"></table></div>\n <p class="small"><strong>Meta was paused on 23 July.</strong> Cost per conversion had roughly doubled and the leads were not holding as appointments, so spending into it would have bought more of the same. The relaunch runs one offer on one consolidated budget so the next read is a real one. <strong>Google has not been paused</strong>: it is being rebuilt on clean campaign structure with manual bidding and a cap, which is the right approach until there is enough trustworthy conversion data to bid on.</p>\n </section>\n</div>\n\n<div class="view" id="v-speed" hidden>\n <header class="vhead">\n <p class="eyebrow">Speed to Book</p>\n <h2 class="vtitle">What the wait costs between a lead arriving and an appointment being booked</h2>\n <p class="vsub">What the delay between a lead arriving and someone booking it did to the appointment.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="speed-kpis"></div>\n <div class="vread"><div class="vfig" id="speed-fig">–</div><div class="vtxt" id="speed-read"></div></div>\n </section>\n <section class="vsec">\n <div class="chartgrid two" id="ch-speed"></div>\n </section>\n <section class="vsec">\n <p class="seclabel">By How Long the Lead Waited</p>\n <div class="scroll"><table id="t-speed"></table></div>\n <p class="small" id="speed-note"></p>\n </section>\n <section class="vsec">\n <p class="seclabel">Who We Are Slow On</p>\n <div class="scroll"><table id="t-speed-src"></table></div>\n <p class="small" id="speed-src-note"></p>\n </section>\n</div>\n\n<div class="view" id="v-campaigns" hidden>\n <header class="vhead">\n <p class="eyebrow">Campaigns</p>\n <h2 class="vtitle">The level below source: which campaign the money bought</h2>\n <p class="vsub">The level below lead source. Read the coverage first: it says how much of each channel this can see.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="campaigns-kpis"></div>\n </section>\n <section class="vsec">\n <p class="seclabel">Attribution Coverage</p>\n <div id="ch-coverage"></div>\n <p class="small" id="coverage-note"></p>\n </section>\n <section class="vsec">\n <p class="seclabel">By Campaign</p>\n <div class="scroll"><table id="t-campaigns"></table></div>\n <p class="small" id="campaigns-note"></p>\n </section>\n</div>\n\n<div class="view" id="v-ledger" hidden>\n <header class="vhead">\n <p class="eyebrow">Sales Ledger</p>\n <h2 class="vtitle">Every job sold in 2026</h2>\n <p class="vsub"><strong>Every job the company sold in 2026</strong>, marketing and canvassing together, with who set it, who closed it and where it stands.</p>\n </header>\n <section class="vsec">\n <div class="kpis" id="ledv-kpis"></div>\n </section>\n <section class="vsec">\n <div class="controls inline">\n <label for="f-status">Status</label>\n <select id="f-status">\n <option value="">All Statuses</option>\n <option value="Installed">Installed</option>\n <option value="In progress">In Progress</option>\n <option value="Cancelled">Cancelled</option>\n <option value="No project record">No Project Record</option>\n </select>
1\n <span class="nm" id="ledger-count"></span>\n </div>\n <div class="scroll tall"><table id="t-ledger"></table></div>\n <p class="small" id="ledger-note"></p>\n </section>\n <section class="vsec">\n <p class="seclabel">Excluded from the Marketing Numbers</p>\n <div class="scroll"><table id="t-excluded"></table></div>\n </section>\n</div>\n\n<div class="view" id="v-method" hidden>\n <header class="vhead">\n <p class="eyebrow">Method</p>\n <h2 class="vtitle">GoHighLevel is the source of truth for appointment reporting</h2>\n <div class="vread"><div class="vfig">7</div><div class="vtxt">Seven separate systems hold a piece of this picture, and several report the same metric differently. <strong>That is why appointment reporting is consolidated onto GoHighLevel</strong>: it owns the calendar, so it is the only system that knows what was actually booked, sat, cancelled or is still to come.</div></div>\n </header>\n <section class="vsec">\n <p class="seclabel">Which System Owns What</p>\n <div class="scroll"><table>\n <thead><tr><th>System</th><th>What It Holds</th><th>Role Going Forward</th></tr></thead>\n <tbody>\n <tr><td>GoHighLevel</td><td class="l">Leads, contacts, the appointment calendar, dispositions</td><td class="l"><strong>Source of truth for leads and appointments</strong></td></tr>\n <tr><td>Podio — Project Management</td><td class="l">Installs, cancellations, project status</td><td class="l"><strong>Source of truth for installs</strong></td></tr>\n <tr><td>Podio — Leads</td><td class="l">Historic lead records and per-lead cost</td><td class="l">Historic reference</td></tr>\n <tr><td>Podio — Self-Generated Leads</td><td class="l">Canvassing appointments, canvasser, closer, dispositions</td><td class="l"><strong>Source of truth for doors</strong></td></tr>\n <tr><td>Sales tracker (Power BI)</td><td class="l">Set %, Sit %, Sold %, Cancel %, Net Conversion %</td><td class="l">Sales reporting; definitions adopted here</td></tr>\n <tr><td>Google Ads & Meta</td><td class="l">Ad spend, clicks, platform conversions</td><td class="l"><strong>Source of truth for ad spend</strong></td></tr>\n <tr><td>Vendor portals & invoices</td><td class="l">What each lead partner actually billed</td><td class="l"><strong>Source of truth for lead cost</strong></td></tr>\n </tbody>\n </table></div>\n <p class="small">The metric definitions on this page follow the sales tracker exactly. Set %, Sit %, Sold %, Cancel % and Net Conversion % mean the same thing here as they do there, so the two line up rather than competing. <strong>The current month’s appointment figures are drawn from GoHighLevel</strong>, and earlier months are being brought onto the same basis.</p>\n </section>\n <footer>\n <strong>Appointment reporting comes from GoHighLevel</strong>, the system of record for the calendar. Sit rate counts settled outcomes, so appointments still to come and those without a recorded outcome sit outside the rate rather than counting as misses. Spend comes from vendor invoices, ad-platform reported cost, or cost recorded in the CRM, and the badge on each figure shows which. Installs come from the Project Management system. Percentages are suppressed below a denominator of ten, where the raw count is shown instead.\n </footer>\n</div>\n </div>\n </div>\n</div>\n\n</div>\n'}}),e?(0,n.jsxs)("p",{className:"boot",children:["The figures could not be loaded: ",e]}):!l&&(0,n.jsx)("p",{id:"boot",className:"boot",children:"Loading the current figuresâ¦"})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.