TODAY

Main to-do list

PROJECT 25 · LONDON, ON
ALL BUSINESSES

Structured by week: this week, next week, then later, with finished work in Completed at the bottom. Tasks and ticks are saved on the server, so this list reads the same on your phone and your laptop. Unfinished items roll into next week on their own. claude items happen when you say go; you means it is genuinely yours.

0 of 0 done
Blocked on you first: the credential decision and a London mailing address. Say go and the spec homepages happen before your downtown walk.

Pavan's two '25' companies on one page: Virtue25, the media studio, and Optimize25, the AI company that builds agent systems for owner-operated local businesses. True Figure, the bookkeeping service, sits inside Optimize25 and is paused. Pick a business at the top to narrow the sidebar and this page.

Virtue25 Productions

Media studio

Live at virtue25.com
  • Web analytics needs Google access
Optimize25

AI agent systems

Building: 2 clients, 1 prospect
  • CozyInkz (Vik), client #1 ·
  • Squints Optical, prospect ·
  • The Painting Plastering Specialist (Ramzy), client ·
  • Website preview only
True Figure · inside Optimize25

Bookkeeping (paused)

Paused, not pursued actively
  • Site live at truefigure.ca
  • Wave 2 240 sent, 0 meetings
  • Prospects on file 896
Virtue25 spend
·
CAD, all time
Optimize25 spend
·
CAD, all time, incl. True Figure
Owed to Pavan
·
paid by Pavan, not yet repaid
To-do still open
·

Virtue25 Productions, the media studio. virtue25.com runs the OG2 design (live since Sep 29) as the Cloudflare Worker virtue25; the site source is virtue-twenty-five/ in this repo.

Pages
6
Home, Work, Services, Process, About, Contact
Hosting
CF Worker
Deployed by the Project 25 agent with deploy-site
Web analytics
Not set up

Google Analytics and Search Console for virtue25.com, baked at deploy like True Figure's numbers and shown only after unlock.

Needs Google access. virtue25.com has no Google Analytics tag and no Search Console property yet. They go in the True Figure Google account for now, so the same login reads both sites. Once Pavan has done the steps below, the numbers show here on the next deploy.

  1. Google Analytics: signed in as the True Figure Google account, create a GA4 property and web stream for https://virtue25.com and send us its measurement ID (G-...) and property ID (the number). The tag then goes on the site in a normal pull request.
  2. Search Console: add virtue25.com as a Domain property and verify it with the DNS TXT record Google gives (the virtue25.com zone is on Cloudflare).
  3. First pull: the True Figure login files aren't on the agent's machine, so Pavan decides where the first pull runs.
Search Console
Not connected
clicks, impressions, average position and top queries load here
Google Analytics 4
Not connected
sessions, users, page views and channels load here

Optimize25 client builds (optimize25/clients/). Previews are public links, safe to show a client. The open to-dos are the top of each client's TODO file, baked at deploy by tools/bake_clients.py.

Client #1 · tattoo studio

CozyInkz (Vik)

Building: booking, site, agents, money dashboard
Waiting on
  1. Loads after unlock.
VIK-TODO.md
Prospect · optical store

Squints Optical

Plan drafted; store system built as a dry run
Waiting on
  1. Loads after unlock.
TODO-NAYIF.md
Client · painting & plastering, London

The Painting Plastering Specialist (Ramzy)

New site built as a preview; waiting on his access to move it to paintingplastering.com
Waiting on
  1. Loads after unlock.
TODO-RAMZY.md

The Optimize25 website: generic "AI solutions for every kind of business", six pages, source in optimize25/site-src/. Preview only; it is not on a domain yet.

Pages
6
Home, Solutions, Industries, How it works, About, Contact

The whole funnel in one view. The pipeline reads every list in the sidebar; the scoreboard is a self-saving weekly log; web numbers come from Google Analytics and Search Console (links below), copied into the log each week.

Prospects
896
105 wave 1 + 173 new + 533 existing + 85 London
Contacted
0
marked emailed +
Replied
0
reply rate
Clients
0
signed

Weekly scoreboard

Log the sales inputs and the web totals once a week. Pipeline is the leading indicator; revenue lags it.

Week ofTouchesRepliesReviewsClosesWeb sessionsWeb leadsNotes

Web analytics and search

Everything measuring truefigure.ca, wired and verified Jul 7, 2026. Connect once and the real numbers from Google Analytics and Search Console load straight into this page; the latest snapshot stays cached on this device.

Not connected yet.
On the site right now
·
active visitors this instant, GA Realtime
Sessions · 28 days
·
users and page views load here
Leads · 28 days
·
generate_lead totals, plus the supporting events
Google Search · 28 days
·
clicks from Google results; impressions and position load here

Stack status

Google Analytics 4 · live
G-1FQLQJ3FFG
Property "True Figure", stream 15217629231, owned by info@truefigure.ca. One config point in the site's app.js puts the tag on all 26 pages.
Search Console · verified
Domain property
DNS TXT record on the truefigure.ca zone: covers every URL, survives redeploys. Sitemap submitted Jul 7.
Sitemap health
26 / 26
Every URL returns a clean 200 with zero redirects (guides trailing-slash fixed Jul 7). robots.txt keeps this tracker out of Google.
Money event
generate_lead
Fires on every click to email you a booking. Star it as a key event in GA so it counts as a conversion.

Verified end to end on Jul 7. Headless-browser test: the tag injects, hits reach Google carrying G-1FQLQJ3FFG, and Google accepts them (HTTP 204). If Realtime shows 0, that is your ad blocker or a brand-new property still warming up, not the site. Standard reports fill in 24 to 48 hours.

Every event we track

Fired by the site's shared app.js on truefigure.ca. These names are exactly what you will see in GA reports.

EventFires whenWhy it matters
generate_lead money eventA click on any email link, "email to book your review"The lead itself. Star it as a key event and judge every page and channel by it
book_review_clickA click through to the contact / booking pageIntent, one step earlier in the funnel
phone_clickA tap on the phone numberThe mobile lead path
email_copyThe copy-email buttonLeads who copy the address instead of clicking
calculator_useFirst interaction with the HST Quick Method calculatorEngaged visitor; the tool is the content magnet
page_view, scroll, outboundAutomatic, GA enhanced measurementSessions, top pages, traffic sources: the base layer

Measurement to-dos

The last clicks to finish the stack. These save on this device, separate from the 33-step launch plan.

Wave 2, live: 240 emails Aug 10 to Sep 3, Mon to Thu, sent by the cloud scheduler. Everything on this page bakes from the campaign plan at deploy.

Sends per day

solid = sent · outline = scheduled · hover for detail

Cumulative progress

bold = actually sent · faint = the full plan

Vertical mix by week

TemplateVerticalPoolSends

Upcoming send days

Every human who has ever written back, newest first, with what happened next. Reply same day; the playbook lives on the Reply kit page.

Never email these addresses again. campaign.py enforces this file automatically on every build; check it by hand before any manual send.

AddressBusinessCategoryNote

Canned responses for the two most likely replies, and the command that builds a personalized one-pager + full-width draft. Click to copy.

What a client signs and what happens next. Rewritten Sep 21 for any business rather than restaurants only, on the current plans, with the dashboard and the closed-by-the-10th promise in the letter. Baked from the repo at deploy time; re-run outreach/bake_client_kit.py after editing.

One pipeline for the London walk-ins. Website and bookkeeping sit on the same record on purpose, because a walk-in is one visit with two things to sell and the relationship history should not be split. Saved in Cloudflare D1, so your phone and laptop show the same thing.

0 need action now · 0 in the pipeline
Open a card to log what happened, set the next action, or change the status.

Business expenses for the two businesses, Virtue25 and Optimize25 (True Figure's costs count under Optimize25), in CAD. Saved in Cloudflare D1 behind the PIN. "Owed to Pavan" is everything he paid personally that has not been marked repaid.

Virtue25
·
Optimize25 (incl. True Figure)
·
Overall
·
Owed to Pavan
·
paid by Pavan, not yet repaid
Add expense

Export CSV
DateBusinessVendorDescriptionAmountTaxPaid byReceipt

Wave 1 complete: all 86 emails sent Jul 2 to 21 (6 bounces, 3 declines, 0 meetings; touch-2 follow-up still open). Real Gmail sends sync in automatically and rows you set by hand always win.

BusinessAreaOwnerEmailStatusNotes

Toronto new-business pipeline from the Aug 4, 2026 email sweep: 777 signals, 411 unique new 2026 businesses; the 173 workable ones are below (25 with a published CASL-eligible email ★ incl. source proof in outreach/toronto-new-businesses.md, 133 pre-open for walk-in/DM, 9 opened with an Instagram channel, 6 to verify). The other ~240 opened-2026 rows with no public contact stay in the .md archive; the raw city-data universe (DineSafe first-inspections, licences, permits) is in outreach/toronto-universe/. Check suppression-list.md before any send.

BusinessTypeWhereStageContactStatusNotes

Tier 2 volume pool from the Aug 5, 2026 batch harvest (40 agents, 7 verticals x neighbourhoods): 533 net-new CASL-emailable EXISTING Toronto businesses, each email verified on the business's own page with the source URL kept as consent proof in outreach/toronto-emailable-existing.md. Deduped against wave 1 and the Toronto-new tab. Sequences A (food), B (fitness) and C (clinics) already exist; beauty, retail, trades and pro services still need templates written. 6 rows are flagged no MX and must not be sent. Check suppression-list.md before any send.

BusinessSegmentAreaVerticalContactStatusNotes

London ON expansion pipeline from the 71-agent lead-engine sweep (Jul 13, 2026): 121 new or upcoming businesses found; the 85 actionable ones are below. Chains/corporate, the not-actually-new rows, coverage gaps and the re-run recipe live in outreach/london-new-businesses.md (+ .json). ★ = conspicuously published email (CASL-eligible; log the source URL before sending). Pre-open spots have no incumbent bookkeeper: walk-in and DM convert best.

BusinessTypeWhereStageContactStatusNotes