HelperBot · Milan Storage Operations

Milan Storage — Vacancy Reduction Campaign

Live tracking of marketing-attributed rentals, traffic, and channel ROI.
Updated
November 03, 2026 at 11:25 PM MST
TRACKING DATA: RED — Sparefoot pull
October 2026 (last full month) vs prior years
▶ EVEN
+0 net units (12 in / 12 out) in October 2026, -0.3 vs 3-year avg net (+0.3)
2023: +3 net ▼32024: -4 net ▲42025: +2 net ▼2
November so far: +0 net (1 in / 1 out) through day 3 (not scored until the month closes — full-month prior-year nets: 2023: +10, 2024: -1, 2025: -3)
Vacancy since marketing launch (2026-04-13): 77 → 58 vacant units (19 fewer vacant, as of 2026-11-03) · vs ~58 vacant this time last year (+0 YoY — that gap opened before the campaign: already 77 vacant at launch)

Campaign Snapshot — since 2026-04-13 (204 days)

Move-ins
79
Move-outs
61
Net
+18
Occupancy %
69.8% → 77.3% +7.5pp
Move-in/out from StorEdge /reports/move_in_move_out · occupancy from vacancy-snapshot trend (every-2-day cron).

All Rentals — Categorized by Source — since campaign start (2026-04-13)

Facebook Ads*Google Ads (high likelihood)Walk-in / Untracked TOTAL
21454 79
* Channel attribution & how confidence is assigned

A rental is tagged with a channel by a multi-strategy match engine that fires in priority order. First hit wins.

  1. sparefoot_email / sparefoot_phone_last4 / sparefoot_name (HIGH or MEDIUM-HIGH confidence) — tenant matches a Sparefoot reservation pulled in the prior 21 days by email (HIGH), phone last-4 (MEDIUM-HIGH), or normalized name (MEDIUM-HIGH). Direct lead-platform match. Live since 2026-05-11 ahead of Sparefoot bidding being turned on.
  2. exact_phone (HIGH) — tenant's phone equals a Twilio call we captured in the prior 14 days. Definitive.
  3. last4_phone (MEDIUM) — tenant's last-4 digits match a captured call but full numbers differ (cell at sign-up vs landline at call).
  4. high_likelihood_fb (MEDIUM, MEDIUM-HIGH, or HIGH) — phone + Sparefoot match failed, but the move-in date had ≥10 Facebook sessions to milanstorageil.com OR ≥1 FB begin_checkout event:
    • MEDIUM = sessions only, no conversion events
    • MEDIUM-HIGH = sessions + non-checkout events (generate_lead / fb_phone_swap_fired)
    • HIGH = ≥1 same-day FB begin_checkout event (user clicked "Reserve Now" on il.com → went to qc.com to reserve). Strongest non-phone, non-Sparefoot signal.
  5. If none match → Unattributed (LOW — walk-in, organic, untracked main-line call, etc.)

Why this exists: most calls to Milan go to (309) 787-3737, the main facility line, which isn't routed through Twilio. With phone match starved, the next signals are direct Sparefoot lead-list match and same-day FB-traffic inference. Engine: tools/marketing-tracker/pipeline/attribution.py.

Source Breakdown (with share)

SourceRentalsShare
Unattributed (walk-in or untracked)5468.4%
Facebook Ads (high likelihood)2126.6%
Google Ads (high likelihood)45.1%
What "(high likelihood)" means: the rental's tenant phone didn't match any captured Twilio call (most calls go to the untracked main-line 787-3737), so we couldn't confirm the source by phone. Instead, the data points to Facebook: the move-in date had ≥10 FB sessions to milanstorageil.com (often plus a same-day FB conversion event — `begin_checkout`, `generate_lead`, or `fb_phone_swap_fired`). It's a defensible call from real signals, not a phone confirmation. The expandable block above breaks down the 4 confidence tiers (HIGH / MEDIUM-HIGH / MEDIUM / LOW) so you can see exactly what evidence each rental has.
Match strategies used in this window: unattributed: 54 circumstantial_fb: 21 circumstantial_google: 4
Latest data: 2026-11-03. Source: logs/marketing/attribution/ (PII-free rollup, derived from StorEdge /reports/move_in_move_out + GA4 traffic + Twilio calls).

Year-over-Year — Are We Winning?

Same-month comparison vs prior years, scored on net (move-ins − move-outs). Source: StorEdge /reports/move_in_move_out, refreshed with the every-2-day vacancy snapshot.

November (current month)

Apples-to-apples: each year shows only the first 3 days of November (since 2026 is partial through day 3 of 30).
Comparison baseline: average net (move-ins − move-outs) of 2023, 2024, 2025 in November (first 3 days) = +0.7. Current-year row shows net units above/below this baseline.
YearMove-insMove-outsNetvs baseline avg
202320+2—
202400+0—
202511+0—
202611+0▼ -0.7 units
vs avg net +0.7 (avg of 2023, 2024, 2025)
first 3 days only · small sample
Same-window comparison (net): +0 net (1 in / 1 out) in first 3 days of November 2026 vs +0.7 avg net for the same window across 2023, 2024, 2025.
Linear pace projection (full month): ~10 move-ins at current rate vs full-month historical avg 9.0.

October (last full month)

Comparison baseline: average net (move-ins − move-outs) of 2023, 2024, 2025 in October = +0.3. Current-year row shows net units above/below this baseline.
YearMove-insMove-outsNetvs baseline avg
202385+3—
20241115-4—
202542+2—
20261212+0▼ -0.3 units
vs avg net +0.3 (avg of 2023, 2024, 2025)

Vacancies in November — same month, prior years

Rented units per StorEdge yearly report; vacant assumes the current 255-unit count. 2023 unavailable from the StorEdge yearly report.
YearRentedVacantVacancy %
20222134216%
20242163915%
20251975823%
20261985722%

Revenue — Year-over-Year

Monthly revenue collected vs prior years. Source: StorEdge /reports/yearly, refreshed with the every-2-day vacancy snapshot.

November (current month)

November 2026 is in progress (day 3 of 30). Due shows the projected full-month billing (last full month's due × rented-unit ratio, 198 → 198 units); Collected is actual cash received so far.
Comparison baseline: average of 2022, 2024, 2025 collected in November = $16,720. Current-year row shows percent above/below this baseline.
YearCollectedDueCollect %vs baseline avg
2022$16,437$14,147116%—
2024$18,297$15,946115%—
2025$15,426$16,40494%—
2026
collected through day 3 of 30 · Due = projected full month; charges posted so far: $9,367
$3,738$20,18519%-78% (partial)
vs $16,720 (avg of 2022, 2024, 2025)
partial month — expect to close gap by month end
No pace projection: rent collection is front-loaded (most posts in the first week of the month), so linear extrapolation would mislead. Wait until ~day 10 for a meaningful month-over-month read.

October (last full month)

Comparison baseline: average of 2022, 2024, 2025 collected in October = $16,803. Current-year row shows percent above/below this baseline.
YearCollectedDueCollect %vs baseline avg
2022$16,141$14,496111%—
2024$16,306$15,491105%—
2025$17,961$17,488103%—
2026$19,349$20,18596%▲ +15%
vs $16,803 (avg of 2022, 2024, 2025)
77.3%
Occupancy
58
Vacant Units
▲21
Since 2026-04-02
38
Target Vacant (85%)
20
Units to Fill

Website Traffic

Daily sessions by source (mutually exclusive). GA4 baseline since Jan 2023 — figures are conservative (ad blockers strip ~30-40%).

Sessions by Hostname

il.com (Cloudflare marketing) vs qc.com (StorEdge tenant portal). Hostname split available from 2026-04-27 forward (when GA4 was instrumented on il.com).
FACEBOOK Jan-Feb 2023: 250+ sessions/week

Facebook (m.facebook.com + l.facebook.com) drove 170+ sessions/week in early 2023 — likely a Facebook ad or viral post. When it stopped, total traffic dropped from 250/week to 60-100/week. Google organic was only ~12 sessions/week at the time.

Takeaway: Facebook ads were the single biggest traffic driver Milan has ever had. Restarting Facebook marketing could replicate this.

CRAVO SEO Apr-Sep 2023: Peter from Cravo handled SEO

External SEO services ran from April through September 2023. Traffic during this period held at 80-150 sessions/week but was declining from the Facebook highs. After Cravo ended in September, traffic dropped further to 34-80/week before stabilizing. Google organic remained low (4-12/week) throughout, suggesting the SEO work had limited lasting impact on organic search visibility.

TRAFFIC DECLINE Late 2023-2024: No marketing = steady decline

After both Facebook and Cravo SEO ended, traffic settled at 60-90 sessions/week through most of 2024. A spike in Oct-Nov 2025 (150-220/week) occurred — source unidentified. Current baseline without marketing is ~100 sessions/week, almost entirely direct + Google organic.

SUMMER 2024 Organic surge — Google doubled to 26-42 sessions/week

May-August 2024 saw Google organic traffic double without any marketing spend — likely seasonal (summer = moving season for storage). Combined with increased internal site referrals, total traffic hit 100-120/week. This pattern suggests summer campaigns would amplify an already-natural demand spike.

GOOGLE ORGANIC Baseline: 4-8 sessions/week (low but stable)

Outside of seasonal spikes, Google organic search sits at 4-8 sessions/week. No SEO work has been done historically — the new milanstorageil.com pages are the first effort to change this number.

Phone Calls — Last 7 Days (no calls captured since 2026-10-09)

0
TOTAL CALLS
0
ANSWERED
ChannelCallsAnsweredAvg Duration
SEO/Website 0 0 —
Facebook Ads 0 0 —

Channel Performance

Total rentals since 2026-04-13: 79 · attributed to channels: 25 · unattributed baseline: 54
ChannelStatusVisitsCallsPhoneCost/MoRentalsCost/Unit
Facebook / Instagram LIVE
since 2026-04-14
Ads live for 204 days at $6/day. Total spent: $121.66 (actual, as of 2026-05-04). 1961 FB referral sessions to the site. 8 calls to 485-5597 so far.
1961 8 (309) 485-5597 + (309) 893-1852 $180 25 —
SEO Pages (milanstorageil.com) LIVE
since 2026-04-13
8 SEO pages live on Cloudflare since campaign launch. Currently ranking #3 for '10x10 storage Milan IL'. Most milanstorageil.com sessions are FB-driven (paid), not organic — see All Rentals section above for FB-attributed rentals.
47 — (309) 893-1852 $0 0 —
SpareFoot LIVE — no leads
since 2026-04-28
Listing live (account_id 10812). Daily lead + billing pull active since 2026-04-28; last pull 2026-06-24. 0 active reservations on Sparefoot right now and no billing receipts in the last 30 days. Bids may be off in the console, or live but losing the auction — verify in console before assuming scraper drift.
— — — TBD 0 res —
Unattributed (organic + walk-in + main-line calls) BASELINE
Rentals not attributable to a paid channel: walk-ins, main-line 787-3737 calls (not Twilio-tracked), organic search, referrals. 5300 direct/unknown site sessions since campaign start.
— — (309) 787-3737 $0 54 $0

Google Search Rankings — 2026-11-01

KeywordMilanAll Tracked Results
storage units Milan IL — Scan blocked — will retry
self storage Quad Cities — Scan blocked — will retry
10x10 storage Milan IL — Scan blocked — will retry
cheap storage Quad Cities — Scan blocked — will retry
storage near Rock Island IL — Scan blocked — will retry
climate controlled storage Quad Cities — Scan blocked — will retry
Tracking every 4 days · 54 scans stored · First scan: 2026-04-14

Active Promotions

1st Month Free — 5x10 NC
Launched 2026-04-13 · $49/mo
25
Vacant at start
25
Vacant now
0
Rentals since
47.9% → 47.9%
Fill rate: 0.0/week (pre-promo) → 0.0/week (during promo)
1st Month Free — 10x10 NC
Launched 2026-04-13 · $65/mo
19
Vacant at start
7
Vacant now
12
Rentals since
62.7% → 86.3%
Fill rate: 4.0/week (pre-promo) → 0.4/week (during promo)

Sparefoot — Bidding Strategy — per-unit-type plan, not facility-wide

The premise: Sparefoot bids are a multiplier on monthly rent, not a flat $/lead. Bid 2.00 on a $49 unit = $98 per reservation. Bid 2.00 on a $179 unit = $358. Combined with our measured 45% reservation→move-in rate, the real customer-acquisition cost is (multiplier × rent) / 0.45. Cheap units have terrible margins at the floor; expensive units can absorb bigger bids and still print money.
Current Bid (floor)
2.00×
Rank #4 city / #2 ZIP
Last 30d leads
0
Bidding off — no reservations
Move-in rate (Milan)
45%
Above network avg ~25-30%
Avg-stay assumption
12 mo
Conservative — refine when StorEdge tenure data lands

Per-Unit-Type Plan — vacancy as of 2026-11-03

Unit Type Rent Vacant CAC @ 2.00× CAC @ 2.40× CAC @ 3.65× 12-mo LTV Recommendation
10x15 CC$1492/7 (29%)$662$795$1209$1788BID UP TO 2.40× (ZIP #1)
10x20 NC$1596/38 (16%)$707$848$1290$1908FLOOR (2.00×)
5x9 CC$755/22 (23%)$333$400$608$900FLOOR (2.00×)
5x8 CC$655/15 (33%)$289$347$527$780FLOOR (2.00×)
10x30 NC$1551/6 (17%)$689$827$1257$1860FLOOR (2.00×)
7x5 CC$492/3 (67%)$218$261$397$588FLOOR (2.00×)
5x5 CC$452/12 (17%)$200$240$365$540FLOOR (2.00×)
8x9 CC$751/1 (100%)$333$400$608$900FLOOR (2.00×)
5x10 CC$721/2 (50%)$320$384$584$864FLOOR (2.00×)
4.5x7.0 CC$491/1 (100%)$218$261$397$588FLOOR (2.00×)
7.0x4.5 CC$491/1 (100%)$218$261$397$588FLOOR (2.00×)
5x10 NC$019/48 (40%)$0$0$0$0FLOOR (2.00×)
10x10 NC$07/51 (14%)$0$0$0$0FLOOR (2.00×)
10x12 CC$01/7 (14%)$0$0$0$0FLOOR (2.00×)
6x9 CC$850/1 (0%)$378$453$689$1020SKIP
6x5 CC$490/2 (0%)$218$261$397$588SKIP
8x10 CC$850/11 (0%)$378$453$689$1020SKIP
10x10 CC$920/7 (0%)$409$491$746$1104SKIP
6x12 CC$750/2 (0%)$333$400$608$900SKIP
9x12 CC$1290/1 (0%)$573$688$1046$1548SKIP
7x12 CC$890/1 (0%)$396$475$722$1068SKIP
6x7 CC$690/2 (0%)$307$368$560$828SKIP
8x12 CC$950/1 (0%)$422$507$771$1140SKIP
8x15 CC$1350/1 (0%)$600$720$1095$1620SKIP

Strategy Summary

▲ BID UP — 1 type. High vacancy (≥25%) + premium rent (≥$90/mo) = the bid bump pays for itself in 1-2 months of rent. Estimated extra spend at full ZIP #1: $119; at City #1 across qualifying types: $492. Both assume every vacant unit fills via Sparefoot — actual will be a fraction of this.

— FLOOR — 13 types. Either price is too low to absorb a multiplier bump, or vacancy is moderate (10–25%). Stay at 2.00× and let the channel deliver passively.

⊘ SKIP — 10 types. Vacancy <10% means there's no inventory pressure to pay for. Pause Sparefoot bidding on these unit types entirely until vacancy opens up.

Open Questions Before Going Live

  1. Per-type bid setting on Sparefoot: the bid console screenshot Kevin shared shows a facility-level bid. Need to confirm Sparefoot lets us set per-unit-type bids (typical platform behavior, but verify before assuming).
  2. Real avg length-of-stay: 12 months is a conservative industry-average placeholder. StorEdge has tenure data — pull average stay per unit type and re-run this card. If actual stay is <6 months, several of the "BID UP" calls flip to FLOOR.
  3. Bid-vs-paid-FB tradeoff: we're currently spending FB ad money to drive il.com traffic. Sparefoot at floor is "free" (no leads, no charges). Reactivating bidding will start charging — decide whether to pull a slice of FB budget into Sparefoot or treat it as additive.
  4. Lead exclusivity: Sparefoot leads are non-exclusive — same shopper may also be on competitors' lists. Doesn't change the math, but means our 45% move-in rate already absorbs that competition.
Tracker: recommendations refresh whenever the metrics dashboard rebuilds. Source: latest vacancy snapshot (2026-11-03) joined with pricing CSV. CAC math assumes flat 45% reservation→move-in rate (current Sparefoot reading). Adjust thresholds in scripts/update-metrics-dashboard.py::_build_sparefoot_strategy_html.

⚠ Anomalies — Last 30 Days

Tracking patterns that don't add up. Each card shows what the data says and the most likely cause.
MED "Direct" traffic (822) is 3.9× all other tracked channels combined
What we see: Last 30d: 822 Direct vs 209 from all other tracked sources combined.
Likely cause: Mobile Facebook + Instagram strip the referrer header on outbound clicks. Untagged ad clicks land on the marketing site as "Direct", not Facebook. The 78 sessions could be hidden FB ad traffic.
LOW 13 move-ins this 30d, all unattributed to a channel
What we see: attribution.py 5-strategy match returned 0 channel matches. Tenants either walked in, called the main facility number (untracked), or signed up online via the Storable booking site.
Likely cause: The attribution window can only see Twilio inbound calls + GA4 lead events. If the tenant signed up entirely on milanstorageqc.com without going through milanstorageil.com first, or called the main number, we have nothing to match against.

Unit Type Detail (click to expand)

Data from 102 vacancy snapshots (2026-04-02 — 2026-11-03) · 54 ranking scans · Auto-generated by HelperBot