Analytics
Internal performance dashboard
Only @bina.cx accounts are allowed
Loading…
Loading full screenshot…
↗ Open Lander

📖 Documentation

BINA Analytics — team reference
Overview
Statuses
Lander score
Creative score
Metrics
Departments
Report
Glossary
Thresholds
Cron Job
How to Use

What is this?

One live, high-level read on every BINA landing page and client — classified by performance, refreshed automatically each week. It answers: what's making money, what's leaking it, what to scale, and who to call — across all clients and departments.

How it works

A single-file web app (index.html) hosted on Vercel. A weekly cron rebuilds the dataset and stores it in Vercel Blob; the app reads it from /api/data. No browser or manual export needed — everything is API-driven.

1
Discovers the live roster from Base44 entities (clients + landing pages/LPIDs).
2
Pulls Meta Ads spend/clicks/CPC/CTR/CPM (+ creative metrics on demand) and GHL leads/appointments.
3
Classifies every lander, writes a dated snapshot to Vercel Blob (history is never deleted).

Data sources

SourceWhat it provides
Base44Live roster: clients, landers + LPIDs, CPL/CPA targets, monthly budget, service areas, account manager / media buyer.
Meta Ads APISpend, clicks, CPC, CTR, CPM, impressions + per-creative Hook / Hold (fetched live in Creatives/Alignment).
GHL · getPortfolioConversionsLeads, appointments, CPL, CPA, lead→appointment % per lander.
Analysis baselineFunnel step counts, pixel-event status, page↔ad alignment, creative notes.

The lander statuses

🏆
Winning
2+ metrics in the good range and no losing flag. Scale & replicate.
👁
Watch
No red flags but not proving itself — the gray zone.
🚨
Losing
2+ metrics critically bad. Fix or cut.
Insufficient
Under 3 leads — not enough data to judge yet. Not the same as Losing.

Insufficient, split three ways

The Landers tab breaks "insufficient" into actionable buckets instead of one pile:

BucketMeaning
RampingA few leads (1–9) — still building signal, may graduate to a verdict.
💀 DeadZero leads on live spend — dormant or wasting budget (sorted by spend).
🌿 GoogleRuns on Google, not Meta — low Meta volume is expected, judged separately.

Channels & organic landers

Landers now carry Meta AND Google spend — a Google lander with spend is judged on CPL/CPA exactly like Meta (see the channel filter). Only true organic landers (no ad spend at all) are judged on lead→appointment % (client follow-up); their status prefix is organic_*.

Lander classification

MetricGood ✅Gray zoneBad 🚨
LP Conv%≥ 5%3–4.9%< 3%
CPL≤ $80$81–$149≥ $150
CPA≤ $450$451–$999≥ $1,000
1
< 3 leads → Insufficient
2
2+ bad → Losing
3
2+ good → Winning
4
Everything else → Watch
CPA > $2,000 is ignored. That high almost always means the client isn't logging appointments in GHL — meaningless data, so it's dropped from the verdict.

Creative score (0–100)

Each ad is scored from its Meta metrics — not one make-or-break rule. Every metric becomes a sub-score from −1 (its bad line) to +1 (its good line); the weighted average sets the verdict. Hover any creative card to see the exact breakdown.

MetricGoodBadWeight
CTR — clicks ÷ impressions≥ 1.5%≤ 0.8%
CPC — $ per click≤ $1.50≥ $3.00
CPM — $ per 1,000 impr≤ $20≥ $50
Hook — 3-sec views ÷ impr (video)≥ 30%≤ 15%1.5×
Hold — 25%-watched ÷ impr (video)≥ 25%≤ 12%
1
Each metric → sub-score −1…+1 (clamped).
2
Weighted average → normalized score, shown as 0–100.
3
≥ +0.2 → Winner · ≤ −0.2 → Losing · else Neutral.
Under 500 impressions = not scored (not enough data). Images skip Hook/Hold and score on CTR/CPC/CPM only.

Every metric, in funnel order

StageMetricWhat it measuresBetter
Meta adsCTR% of impressions that clicked. Creative pull.
CPCCost per link click.
CPMCost per 1,000 impressions — cost of reach.
Hook / HoldVideo stopping power / retention (video ads).
Landing pageLP Conv%% of clicks that submitted the form. Page quality.
LeadsForm submissions in the window.
CPLSpend ÷ leads. Cost per lead.
Leads/$1kLeads per $1,000 spent — efficiency at a glance.
AppointmentsApptsBooked appointments from this lander's leads (GHL).
L→A%% of leads that became appointments. Lead quality / speed-to-lead.
CPASpend ÷ appointments. Cost per appointment.
The Metrics tab lays all of these out as one spreadsheet per lander (or rolled up by client / state / vertical), with CSV export. CPM & Hook & Hold are per-creative and live on the Creatives tab.

Who owns what

The Report routes every action to the team that can fix it.

DepartmentOwnsTypical action
🎨 CreativeAd performance — CTR, hook, CPC, fatigue.Refresh losing creatives; double down on winners.
🔨 FunnelLanding page + tracking — LP conv, pixel.Fix low-converting pages & broken CompleteRegistration pixels.
📞 AccountingClient outcomes — CPA, lead→appt, off-CRM.Call clients with high/rising CPA or slow follow-up.
📊 MediaBudget allocation — dead spend, overspend, scaling.Pause dead landers; shift budget to winners.

Role dashboards

The Dashboard adapts to who's logged in: COO sees the portfolio, Account Manager sees CPA / lead→appt per client, Media Buyer sees campaign performance, Tech sees pixels & page conversion.

Report = analytics dashboard

The Report is now a pure reporting view — metrics, charts and trends, no to-do items (those live in the Suggestions tab). It answers "how is the whole business performing," anchored on the CPA ≤ $400 north-star.

SectionShows
📊 ScorecardSpend, Leads, Appts, Blended CPL, Blended CPA ★, landers/clients — each with the week-over-week delta.
🔽 Conversion funnelClicks → Leads → Appts with the drop-off % and cost at each stage — shows exactly where volume leaks.
🎯 CPA health% of spend producing ≤$400 appointments, plus the lander CPA distribution.
📈 By segmentSpend & CPA per media buyer / vertical / state / account manager (pivot selector).
🧹 Portfolio mixStatus donut, appointments by source (Meta vs Google), headline↔ad alignment.
🩺 Page & creative healthPixel-firing %, average CTR, misaligned pages, funnel-length distribution.
📉 TrendsWeekly spend / appointments / blended CPA lines — accumulate every Monday.
For "what to fix," see the Suggestions tab; to file a request, use Notes.

Glossary

LanderA landing page — the quiz/form funnel an ad sends traffic to.
LPIDLanding-page ID — the unique key that matches a lander to its Meta ads (via the adset name).
Funnel stepsHow many screens the funnel has before the contact form. Read from the page's own "Question X of N" counter.
CompleteRegistrationThe Meta pixel event for a form submit. If it's not firing, Meta optimizes blind even though leads arrive in GHL.
Off-CRM 📵A client whose leads aren't tracked in our GHL — so their lead→appt / CPA may be unreliable.
Channelmeta / google / both — all judged on CPL/CPA. Only organic (no ad spend) is judged on lead→appt. Filter by channel in the lander views.
Migration stateActivity flag: active (spending), stalled, stopped, or organic (Google).
BlendedA portfolio/client rollup computed from summed totals (e.g. total spend ÷ total leads), never an average of averages.
Target CPL / CPAThe client's goal cost per lead / appointment. Defaults when unset: CPL $75, CPA $400.

Lander thresholds

SettingDefaultControls
min_leads3Below this = Insufficient.
win_lp_conv / lose_lp_conv5% / 3%LP Conv% good / bad lines.
win_cpl / lose_cpl$80 / $150CPL good / bad lines.
win_cpa / lose_cpa$400 / $1,000CPA good / bad lines.
cpa_max_reliable$2,000CPA above this is ignored (tracking gap).
lose_flags_needed2Bad metrics needed for Losing.

Creative thresholds (CREATIVE_T)

MetricGood / BadWeight
CTR1.5% / 0.8%
CPC$1.50 / $3.00
CPM$20 / $50
Hook30% / 15%1.5×
Hold25% / 12%
Win / lose verdict cutoffs: normalized score ≥ +0.2 / ≤ −0.2.

Report defaults

CPL target falls back to $75 and CPA target to $400 when a client hasn't set one. At-risk = CPA >20% over target or ≥15% higher than last week.

Lander thresholds are editable live in ⚙ (session only). Permanent changes live in cron/baseline.json.

Weekly refresh

A Vercel Cron runs every Monday 13:00 UTC — fully automated, no browser. It calls /api/refresh, which rebuilds the dataset and writes it to Vercel Blob.

1
Discover the live roster from Base44 (clients + landers).
2
Pull Meta spend + GHL conversions for each lander.
3
Classify, then append a dated snapshot (history preserved for week-over-week).
4
App reads /api/data — reopen to see the latest.
Runs in "light mode" to stay under Vercel's 60-second function limit — deep creative metrics are fetched on demand in the Creatives / Alignment tabs instead.

The tabs

DashboardRole-based overview (COO / Account Mgr / Media / Tech).
MetricsFull per-lander spreadsheet, groupable + CSV export.
Creatives / AlignmentAd-level scores; page↔ad side-by-side.
LandersEvery lander grouped by status (cards / list / compact).
ReportAnalytics dashboard — funnel, CPA health, per-segment performance, trends.
SuggestionsPrioritized "fix this ASAP" list — kill / fix / rebuild / call / scale.
NotesFile a fix / edit / add ticket for the team.
Ask AINatural-language questions about any client or lander.

Tips

  • Toggle light / dark theme from the sidebar.
  • ⌘K opens the quick command palette.
  • Most tables export to CSV; search matches URL, client, ZIP, or area.
  • Thresholds ⚙ reclassify everything instantly (session-only).

Questions?

Ping Itai — he owns this dashboard and the GHL automations.