Demand to tenants web sessions · enquiries · move-ins per day i
Campaign performance in selected period i
Contact list growth added per month by segment · line = total list size iBars are contacts added to the GoHighLevel list each month, split by segment; the line is the running total. Segments come from GHL tags, not the "source" field — that field is empty on almost every contact, so channel attribution for the list isn't possible. Hover a month for the emailable share: contacts with an email address (roughly a quarter of the list; nearly all have a phone number). Not affected by the period filter — it is a snapshot of the whole list.
Facility operations move-ins/outs · line = occupied iFrom the three Cubby reports uploaded weekly. Moves: bars are move-ins and move-outs per day and the line is occupied units, both from the management summary, so they cover exactly the facilities in that export. Move-out reasons come from the move-in/move-out detail (test rentals excluded) with the free-text reasons bucketed into a handful of themes, year to date. Payments are dollars collected per day; a negative day is a refund issued on move-out.
Enquiries per source, in period i
Sessions paid vs earned vs direct i
Page traction views and sessions per page in period
iViews are page views; sessions are visits that included the page at least once, so a page's sessions can never exceed its views. Query strings are stripped, so /spaces-pricing?unit=10x10 and /spaces-pricing count as one page. The two pages that matter for the funnel are /spaces-pricing (intent) and /checkout (a reservation attempt).
Source performance volume · engagement · intent, in period iOne row per GA4 source / medium. Facebook and Instagram arrive under several names and are folded into Meta with the medium kept: Meta / social is tagged posts and campaigns, Meta / referral is untagged shares. Engaged follows GA4's definition: the visitor stayed 10+ seconds, viewed 2+ pages or converted. Intent is the pair of pages that signal a real shopper — sessions that reached /spaces-pricing and sessions that reached /checkout (a page view, not yet a lead — the checkout itself is Cubby's widget). Shading is per column: darker means larger relative to the other sources in the list. The type filter groups sources the same way the Sessions chart does.
Paid channels sessions per day · performance in period i
Where the paid clicks land green = South Carolina · hover a state for its cities iPaid sessions by the visitor's location as GA4 infers it from the network address — accurate to the metro area, not the street, and mobile carriers sometimes place a visitor in a neighbouring city. South Carolina is highlighted because the Greenville facility is the only market the ads should be buying; clicks from elsewhere are spend worth questioning with the agency. Hover a state to see its cities and how many of those sessions reached pricing or checkout.
Assistant watchlist every AI referral we can see, in period iThis counts visitors who clicked through from an AI assistant. Assistants often answer without sending a click, so treat these numbers as the floor of AI-driven interest, not the total.
Visitor journey from first click to signed tenant i
Audience per day · by network i
Top posts published in period · by impressions iEvery post published in the period, one row per network, with the metrics that network reports for it: impressions (Facebook, LinkedIn) or views (Instagram — Meta's replacement for impressions), reach where available (Meta only), interactions (reactions, comments, shares, clicks or saves), and Metricool's engagement rate — interactions over reach, or over unique impressions. Sorted by impressions; shading is per column. The text is the post's opening line — click it to open the post.
Upload Cubby reports
The weekly five from Cubby → Reports, as XLSX, all 17 facilities iCubby has no API, so the Facilities tab runs on five reports exported by hand once a week. This week shows which have landed and what the latest file covered; How to export is the full procedure — settings for each report, the checks, what the warnings mean, and what to do when something is off. Files load in the nightly run and show on the dashboard from about 06:45 ET.
What this is, and why it matters
Cubby, the property-management system, has no API we can read from. Everything on the Facilities tab of this dashboard — occupancy, move-ins and move-outs, enquiries, payments, the facility picker itself — comes from five reports that a person exports from Cubby and drops on this page once a week. If the reports stop, the Facilities tab stops moving; the Web, Outreach and Social tabs are unaffected because they load automatically.
The upload is forgiving by design. Every file is stored, the nightly pipeline merges all files it has ever received, and where two files describe the same day or the same lead, the newest upload wins. So overlapping date ranges are harmless, uploading the same file twice is harmless, and a wider range than asked for simply corrects earlier rows. The only things that hurt are a report exported for a subset of facilities, a management summary exported without daily columns, and a report that was never uploaded at all.
When, and who
- Once a week, any day. Monday is the habit. Files load in the nightly run at 06:00 ET and appear on the dashboard from about 06:45 ET, so Monday's upload shows on Tuesday morning.
- Whoever holds the Cubby login for the consolidated account, with the uploader or admin role on this dashboard. An admin grants the role on the Access page (account menu, top right). No shared code is needed.
- If it cannot wait for the nightly run, ask the data owner for an immediate load after uploading.
Settings that apply to every report
| Facilities | All 17, consolidated. A subset silently drops sites from the dashboard: a facility absent from the file is treated as having no data. Row 4 of the exported file must read “Consolidated for 17 facilities”. |
|---|---|
| Format | XLSX (Excel). Not CSV, not PDF. The loader reads the first sheet, and for the management summary the per-facility sheets. |
| Date range | Differs per report — see below. When in doubt, wider is safe; narrower loses days. |
| File name | Anything. A helpful habit is YYYY-MM-DD_range.xlsx, e.g. 2026-09-15_jul01-sep15.xlsx. The page routes the file by its title inside, not by its name. |
The five reports, one by one
- Historical management summary — Cubby → Reports → Historical management summary.
Range: the current quarter to today (Jan 1, Apr 1, Jul 1 or Oct 1 → today).
Setting that matters: Split period: Day. This gives one column per day (row 5 reads “Jan 01, 2026”, “Jan 02, 2026”, …). Without it Cubby produces one total per metric for the whole range, and there is nothing to draw and no “as of today” value — the upload will warn and the file is useless.
Why the shorter range: exporting by day is slow in Cubby — several minutes for a quarter, far longer for a year. Older quarters already sit in the lake.
Feeds: occupancy, payments, move-in and move-out KPIs and bars, and the facility picker. A new facility only appears on the dashboard once it is in this report. - Move-in/move-out detail — Cubby → Reports → Move-in/move-out detail.
Range: the current quarter to today. Move events never change after the fact, so re-exporting the quarter is enough.
Feeds: move-out reasons, and the “left within two weeks” signal. - Leads activity — Cubby → Reports → Leads activity.
Range: January 1 to today. Lead statuses keep changing after a lead is created (new → reserved → converted, or archived), so the whole year is re-exported each week to pick up those changes.
Feeds: enquiries by origin, the funnel, and the lead signals. - Facility portfolio — Cubby → Reports → Facility portfolio.
Range: last week, Monday to Sunday.
Feeds: nothing yet. It is stored for a planned loader (delinquency, autopay, insurance, revenue per facility). Keep sending it so the history exists when that loader lands. - Payment details — Cubby → Reports → Payment transactions.
Range: last week, Monday to Sunday.
Feeds: nothing yet. Stored for a planned loader (approvals, declines, autopay share). Same advice: keep sending it.
The quarter-boundary rule
In the first week of a new quarter — early January, April, July and October — export reports 1 and 2 twice: once for the new quarter (a few days) and once more for the previous quarter. A “current quarter” export on October 5 covers October 1–5 only; the last days of September are in no file unless the previous quarter is exported one final time.
Check each file before uploading
- Row 3 of the first sheet shows the range you meant. Cubby's date picker has produced “through June 09” and “2025” files by accident.
- Row 4 says “Consolidated for 17 facilities”.
- Report 1, row 5: the columns are dates, one per day.
- No duplicate downloads: a file whose name ends in “(1)” is a second copy of the same export. Upload one.
The upload checks all four and tells you. A warning does not block the upload — the file is stored either way — but a warned file will not fix the dashboard, so re-export and upload again.
Uploading
Drop all five files on the right, in any order, or click to choose them. Each file is recognised by its title, stored in the data lake, and reported back with what it covered and how many facilities it held. This week then updates. What the warnings mean:
| “Covers N facilities, not 17” | The export was run for a subset. Sites missing from the file will show no data. Re-export with all facilities selected. |
|---|---|
| “No daily columns” | Report 1 was exported without Split period: Day. Re-export with it. |
| “The range ends … days ago” | The date range stopped short of today, so the newest days are missing. Re-export to today. |
| “A sheet name carries (1)” | This is probably a duplicate download. Harmless if it is the same export; check it is the one you meant. |
| “Not one of the five Cubby exports” | The title in cell A2 did not match any of the five. Usually a different report, or a file that is not from Cubby. Nothing was stored. |
| “Expected an .xlsx file” | Cubby exported CSV or PDF. Choose Excel. |
After the nightly run
- The dashboard header reads “Data through” with yesterday's date.
- Facilities tab, StorPro Grnvl: occupancy matches Cubby's current figure.
- The facility picker lists all 17 sites.
When something is off
- A facility is missing from the picker. Either it was absent from report 1 (check row 4 and re-export), or it is a newly opened site that the dashboard does not know yet — new facilities are added by the data owner.
- The numbers did not change after uploading. The nightly run has not happened yet (before ~06:45 ET), or the file carried a warning. Check This week for what the latest file covered.
- Uploaded the wrong range or the wrong week. Harmless. Upload the right one; the newest copy of each row wins.
- Cubby is slow or times out on report 1. Exporting by day is heavy. Keep the range to the current quarter; if a longer history is ever needed, export one quarter at a time.
- Tenant names and phone numbers are in these files. That is expected — reports 2, 3 and 5 carry them. They stay in the raw data lake and never reach the dashboard, which shows counts only. Do not email the files around.
Where the files go
For the technically minded: each report lands under its own prefix in the data lake — raw/cubby/historical_management_summary/, move_in_out_detail/, leads_activity/, facility_portfolio/, payment_details/ — as upload_<timestamp>.xlsx with the range, facility count and uploader recorded on the file. The nightly extractor merges every file under a prefix, newest upload winning per row, into the raw BigQuery tables; dbt builds the marts the dashboard reads.