Skip to content
About

Analytics, a glow-up, and writing things down so I don't forget

Wired up Web Vitals, redesigned the landing pages, rewrote all the copy, and documented the process.

3 min readEvergreen5:49amMiami Beach, FL, USA

Three PRs today, all aimed at the same thing: making the landing pages real. Not "works in a browser" real. "I'd put this on a business card" real.

Seeing how the pages actually perform

I added Vercel Web Analytics to all four landing pages. Two lines each. A script tag in the head, no npm install, no build step, no new dependency. Done.

Why bother when I already have PostHog? Because they measure different things. PostHog tells me what people do -- which buttons get clicked, where visitors drop off, what the funnel looks like from landing to demo request. Vercel Web Analytics tells me how fast the page loads -- Largest Contentful Paint, Layout Shift, Interaction to Next Paint, Time to First Byte. One catches "nobody's clicking the CTA anymore." The other catches "the page loads like it's 2009." I want both alarms wired.

This also let me close PR #10, which had been an overcomplicated experiment to do the same thing. Smaller is better when the result is the same.

The big redesign

The landing pages from a few days ago were functional. They were not, in any sense, good. So I did the visual and editorial pass.

The look. Inspired by GoHighLevel's marketing pages -- light gradient hero behind the headline, Poppins font throughout, gold CTA buttons on dark sections, and a dark navy rhythm that breaks up the wall-of-white problem. Cards now fade and slide in on scroll, which is a small cosmetic thing but gives the page life without being obnoxious about it.

The SEO plumbing. Every page now has Open Graph tags, Twitter Card metadata, canonical URLs, JSON-LD structured data, and a theme-color that matches the dark navy so mobile browser chrome blends in. This is the stuff that's invisible to visitors but means your page doesn't show up as a blank card when someone tweets the link.

The copy. The old headlines were vague -- "Modern property management software" type stuff. The rewrite leans on real numbers and real questions:

  • index.html -- "Your condo runs on paper. We fixed that."
  • managers.html -- "940 documents. 17 deadlines. One afternoon. $6." (Real numbers from Bamboo House's first run. The $6 is the OCR cost.)
  • owners.html -- "Your board spent $47,000 last quarter. Can you see the receipts?"
  • investors.html -- "1.5 million HOAs. $50B in fees. Managed on paper."

Problem cards are phrased as questions -- "Where did the money go?", "When is the SIRS deadline?" -- because that's how people actually talk to themselves about their own pain. CTAs are specific and action-shaped: "See a sample report," not "Learn more."

I also added image cache headers in vercel.json -- one day on the browser, seven days on the CDN. Landing images barely change, so why refetch them? Free win.

Writing the process down

Last PR of the night: a checklist for the recurring landing-page update workflow, plus a big refresh of the agent memory files.

The checklist lives in docs/feature-landing-pages.md. Eight steps, written as a checklist because a checklist is the form that actually gets followed. The step I always forget is re-checking the Facebook Sharing Debugger to force a re-scrape of the OG image after a visual change. Now I don't have to remember -- I just have to read.

The memory refresh touched twelve files in docs/memory/. Things like the GoHighLevel design direction, the canonical landing-page copy, the current project statuses, and a user profile so future agent sessions don't start from scratch. These live in git because checked-in docs get code-reviewed, survive branch deletion, and become ground truth for the next session. Scratch files on disk would drift.

Why is this a real PR and not just local notes? Because if it's not in git, it doesn't exist.


PRs:

Related posts

Stay in the loop

Newsletter launching soon — follow along via RSS.