Graydian
Internal. For Jon. Roof Maxx of Cleveland · roofhubohio.com
18 August 2026 · do not send to Drew
First 30 days · then you own it month to month

Wire the scoreboard. Then ship pages every week.

You own this account after setup. Week 1 is tracking and Semrush, not just copy. If Google Analytics and Search Console are not connected, we will keep doing the work and getting none of the credit. Do not put Semrush on anything the client sees.

July in their books
3 sales
Roof Hub · about $26,251
GA4 YTD
0 / 0
Qualified leads / converted
Semrush guess
~4 visits
Organic per month. Ignore this.
Search Console
172 clicks
32,975 impressions. Jan–Aug 2.

Why week 1 is tracking, not just pages

GSC and GA4 stay the owned truth. Semrush is the workbench. Connecting them is how Semrush stops guessing. A form fill is a lead. A sale is Dispatch tagged Roof Hub.

Site roofhubohio.com → GTM → GA4. Quote and phone clicks become events.
Search Site + Google listing → Search Console. Queries and pages.
Workbench Same GA4 property and same GSC property into every Semrush tool.
Books Dispatch source = Roof Hub. That is the sale. GA4 does not invent it.

Guardrails. Do not skip.

No Google Ads, Bing, or PMax Corporate PPC is zero-tolerance. Agencies count. We win by ranking.
Original copy only Do not clone roofmaxx.com. No “sealant.” No “waterproofing.” Keep “up to” on 15 years and 80%.
Roof Maxx of Cleveland URL stays roofhubohio.com. Do not put Roof Maxx in a new URL. Phone stays 330-500-9505.
Local listing stays on Corporate owns GBP. Do not create a second listing. Inspection first on any new-roof page.

Day 0. Access before you touch a page

Empty boxes are the first Slack to Norm. Do not start content until Google and Semrush are connected. Checks save on this browser.

0 checked

Google

Semrush

Site and client systems

Need from the shop in week 1 or the scoreboard stays fiction. One test quote from a real device. Who marks a sold job as Roof Hub in Dispatch. Fast yes or no on new page copy.

Block A. Connect GA4 and Search Console to Semrush

Semrush does not inherit one connection across every tool. Same Google account each time. Same GA4 property. Same GSC property. Official map: Semrush KB 857.

System Minimum to connect What we want
GA4 Viewer Editor, so you can mark key events
Search Console Owner or Full user Full user on the live property. Restricted fails Backlink Audit and others.

A1. Project Dashboard

  1. Projects → roofhubohio.com.
  2. Gear / Integrations, or dashboard settings → Google account settings.
  3. Connect Google Analytics 4. Account → property Roof Maxx of Cleveland → Web data stream for roofhubohio.com.
  4. Connect Search Console. The property that already has 172 YTD clicks.
  5. Grant read-only. Semrush should not get write access to Google.
  6. Wait 15–30 minutes. Refresh.

Pass: widgets show GSC clicks in the same ballpark as Search Console, not “4 visits.”

A2. Organic Traffic Insights. Do this. This is the join.

This puts GSC queries and landing pages next to GA4 behavior. Without it you are flying on Semrush keyword guesses.

  1. Organic Traffic Insights → folder for roofhubohio.com.
  2. Connect GA. Same property / stream. Connect GSC. Same property.
  3. Database United States. Device: start with Mobile (87 of 172 clicks). Add Desktop if the UI allows both.
  4. Launch / update the campaign.

Pass: you can see real queries like roof maxx of cleveland, roof rejuvenation near me, roof repair with impressions and no clicks.

A3. Position Tracking

  1. Edit the existing campaign. Do not start a second overlapping one.
  2. Location: Cleveland, Ohio, United States. Device: Mobile primary. Add Desktop only if the plan allows a second campaign.
  3. Local pack on. Business name: Roof Maxx of Cleveland.
  4. Connect GA4 and GSC inside this campaign. Separate connect.
  5. Seed keywords after GSC import. Drop junk geo from the Aug 7 export (El Paso, Lake Orion, Columbus).

Core brand / dealer

roof maxx of cleveland roof maxx near me roof maxx roof rejuvenation near me roof restoration near me

Intercept. Honest, inspection-first pages.

roof replacement roof replacement cleveland new roof cleveland roof repair do i need a new roof

City modifiers should match live /areas-we-serve/ slugs (Cleveland, Akron, Canton, North Canton, Medina, Mentor, Westlake, Brunswick). Competitors: roofmaxx.com, getroofmaxx.com, plus 2–3 Cleveland replacement companies that actually rank here. Not random Semrush “competitors” in other states.

A4. Site Audit. Schedule weekly.

  1. Connect Google Analytics in Site Audit settings.
  2. Crawl sitemap + website. Confirm the live sitemap in robots.txt. Allow JS rendering if the theme needs it.
  3. Schedule Monday morning. Recrawl after you connect GA.
Known 7 Aug crawl Count Do in week 1–2
Structured data errors 79 Fix LocalBusiness / FAQ / Review JSON-LD. Do not invent ratings.
Missing meta description 22 Unique copy. Area pages first.
Broken internal links / 4xx 3 / 1 Fix or 301.
Title too long / missing h1 3 / 3 Trim. One h1 per template.
HTTP links on HTTPS 78 Force https in links and canonical.
Low text-to-HTML / unminified JS-CSS 73 / 468 Don’t boil the ocean. Fix templates you touch. Cache plugin if missing.

A5. On Page SEO Checker

Connect GA4 and GSC. Run on /, /get-a-free-quote/, /contact-us/, /how-it-works/, area pages, and /how-much-does-roof-replacement-cost-in-northeast-ohio/ (already around 15 for Akron replacement cost). Use it for week 2 cleanup. Do not paste Semrush’s suggested sentences. Original only.

A6. Backlink Audit

Connect GSC (Owner / Full user). Start the campaign. Toxic list later. Week 1 is who already links, plus five real local asks you can actually send.

A7. My Reports. Your monthly machine.

Connect GA4 and GSC inside My Reports. One template named Roof Hub monthly.

Semrush traffic widgets stay off this template, or sit in a footnote labeled estimate. Client numbers come from GSC, GA4, GBP Insights, and Dispatch.

A8. Connection proof. Save this.

Fail if the dashboard still looks like ~4 organic visits and you cannot see “roof maxx of cleveland” as a GSC query. Wrong property. Fix that before writing pages.

Block B. Tracking so we get credit

A homeowner who finds Roof Hub should show up in four places. Search Console. GA4. Dispatch source Roof Hub. Your monthly report.

B1. Inventory what is on the site today

Tag Assistant / GTM preview / GA4 DebugView. GA4 already shows 16 key events YTD (7 on quote, 5 on contact) while Generate leads is 0 / 0. Something fires. Qualified lead is not mapped. Do not add a second GA4 property. Fix the one we have.

B2. Events. Names stay stable. Mark as key events.

Event Fires when Params
generate_lead Quote form success and contact form success form_id, page_location, lead_type = quote or contact
phone_click Click on any tel to 330-500-9505 page_location
email_click Mailto to the shop page_location
quote_start First interaction on the quote form. Optional. page_location

Until we have a sold-job webhook, do not invent a “converted” key event from a form fill. Lead = generate_lead or phone_click. Sale = Dispatch source Roof Hub.

B3. Form success has to be a real hit

What you see on the test quote What you do
Separate thank-you URL GA4 event on that page plus generate_lead.
AJAX. Stay on page. Thanks message. dataLayer push on success. GTM trigger. Do not fire on button click.
Redirect with ?sent=1 Trigger on that query.
Posts to a third party Catch the success callback. If you cannot, we are blind. Flag Norm.

Confirmation email to Jon and Norm on every quote so you can pair timestamp with GA4.

B4. Phone credit. Do not change the public number.

B5. Stop Direct from eating our work

GA4 YTD is mostly Direct / (none) (~720–764 vs organic ~158–285). Snapshot cities were Singapore 254, then Cleveland 15. Singapore never goes in a client sentence.

B6. Search Console hygiene

B7. Dispatch is the sale

B8. Day-0 scoreboard. Write numbers before you change anything.

Source Window Metric
GSC Last 28 days Clicks / impressions / CTR, and clicks on home vs area vs quote
GA4 Last 28 days Organic sessions, generate_lead (0 until you fix it), key events
GBP Insights Last 28 days Calls / website clicks / search views
Dispatch July 2026 Roof Hub 3 sales / $26,251. Already on file.
Semrush PT Day you connect Visibility + seed ranks

Block C. Production by week

Local listing work runs every week. Reviews, photos, posts, the listing NAP. That is the old $1,200. Do not drop it.

Week 1

Wire the machine + first pages

Done when you trust Roof Hub numbers in GA4, Semrush shows GSC not guesses, first pages live, one test quote in the log.

Week 2

Pages people already use

Done when main templates make it easy to call or quote on a phone. Second page set live.

Week 3

Intercept “I need a new roof”

Legal intercept. Organic pages. Not ads. Every path still says full inspection.

Done when a replacement searcher has a real Roof Hub place to land. Inspection language is on the page.

Week 4

Ship again + 30-day review

After day 30. Month to month.

This is the rhythm so it does not slide back to light Local and a blog post.

Every week Tool Output
Google listing GBP Reviews, photos, posts, hours, website URL
Who is beating us PT + Keyword Gap vs roofmaxx.com + GSC Pick next URL
New or improved pages WP + GSC URL Inspection At least 2 URLs/week unless blocked on copy approval
On-page cleanup On Page SEO Checker + your judgment Titles, H1, quote CTA
Site fixes Site Audit Monday crawl Batch of errors, recrawl
Get recommended Backlink Audit + outreach log Asks sent / links won
Easy quote Live site on a phone CTA still obvious
Numbers GA4 + GSC + Dispatch Short note to Norm

Monthly: run Roof Hub monthly. Export GSC + GA4 + GBP into the baseline folder. Compare Dispatch Roof Hub sales to GA4 leads. Call out the gap. Never hide it. Client slides use GSC and your SERP checks, not Semrush “traffic $.”

Do not do on the monthly clock. Google / Bing / PMax. Ad Critter display until marketing writes yes. Print / Aaron. Inventing qualified-lead counts to make GA4 match sales.

While you write

Definition of done. Day 30.