Digital Plumbing: The Technical Foundation Every Business Needs Before Marketing Can Work

Digital Plumbing is BlitzMetrics’ term for the technical infrastructure that must be in place before any marketing effort can succeed. Just as a house needs working pipes before you turn on the water, a business needs verified online profiles, connected analytics, proper tag management, and a website that actually converts before you spend a dollar on ads or content. It is the first stage of the Nine Triangles Framework and the prerequisite for everything else BlitzMetrics does.

Most businesses skip digital plumbing because it is invisible to customers and unglamorous to marketers. They jump straight to running ads or posting content without realizing their Google Business Profile is unverified, their website has no conversion tracking, their Facebook pixel is firing on the wrong pages, or their Google Analytics is counting their own team as traffic. Dennis Yu calls this trying to fill a bathtub with the drain open — you can pour unlimited budget into marketing, but if the plumbing is broken, the results leak out before you can measure them.

What Digital Plumbing Includes

Digital Plumbing is not one thing — it is a checklist of technical foundations that span every platform a business touches. The major categories are outlined below.

Google Business Profile

A verified, complete Google Business Profile is the single most important piece of digital plumbing for any local business. This means the business name, address, and phone number match exactly across every platform (NAP consistency). Categories are set correctly. Business hours are accurate. Photos are real and recent — not stock images. The profile is verified through Google’s process, and the owner has admin access. Without this foundation, the business is invisible in local search and Maps results, which is where most customers start their journey.

Website Technical Health

The website must load fast (under 3 seconds), work on mobile, use HTTPS, and have a clear conversion path. Digital plumbing on the website includes proper title tags and meta descriptions on every page, schema markup (especially LocalBusiness schema for home services), a working contact form that actually delivers notifications, click-to-call links that work on mobile, and a Google Tag Manager container installed so you can add tracking without editing code. Dennis Yu’s AI Business Audit checks all of these in a single pass.

Analytics and Tracking

Google Analytics 4 must be installed and configured with the correct property, filtering out internal traffic. Google Search Console must be verified and connected to GA4. The Facebook pixel (Meta pixel) must be installed on every page with standard events firing on key actions — page views, leads, purchases. Call tracking should be in place if phone calls are a primary conversion. All of this tracking feeds into the MAA (Metrics, Analysis, Action) framework so you can actually measure whether your marketing is working.

Social Profiles and Ownership

Every social profile the business uses must be claimed, branded, and under the business owner’s control. This means the Facebook Business Page has the correct admin structure (not run solely through a former employee’s personal account), the Instagram account is converted to a professional account and connected to the Facebook page, the YouTube channel has proper branding and is connected to the website, and the LinkedIn company page exists and matches the business entity. Too many businesses discover they have lost access to their own profiles because a former VA or agency held the credentials — digital plumbing prevents this.

Domain and Email

The business must own its domain, have access to its registrar account, and use professional email on that domain (not Gmail or Yahoo for customer-facing communication). DNS records should include proper SPF, DKIM, and DMARC entries to ensure deliverability. These details matter for E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) signals that Google uses to determine whether to trust and rank a website.

Why Digital Plumbing Comes First

In the Nine Triangles Framework, Digital Plumbing sits at the base because every other triangle depends on it. You cannot run a Content Factory if your website does not render properly or your analytics cannot measure the traffic the content generates. You cannot run Dollar a Day campaigns if your Facebook pixel is not installed or your conversion events are not configured. You cannot execute an SEO Tree strategy if your site has no schema markup and Google cannot understand your entity relationships.

The most common failure mode Dennis Yu sees with small businesses is spending thousands on ads with broken plumbing. They wonder why their Facebook ads do not convert, not realizing that their landing page loads in 8 seconds on mobile, their form does not send notifications, and their Google Analytics is double-counting sessions because the tag fires twice. Fix the plumbing first, and often the marketing starts working without any additional spend.

The Digital Plumbing Audit

BlitzMetrics uses a structured audit to assess the state of a business’s digital plumbing. The AI Business Audit automates much of this process, but the core checklist covers the following areas: Google Business Profile completeness and verification status, website speed and mobile usability scores, analytics installation and configuration accuracy, social profile ownership and branding consistency, domain health and email deliverability, conversion tracking implementation across all channels, and NAP consistency across directories and citations.

The SEO Audit process overlaps with digital plumbing in the technical health category but focuses more on content and linking — it is the next step after plumbing is in place. Both audits feed into the MAA loop that drives continuous improvement.

Real Examples of Digital Plumbing in Action

Every client engagement at BlitzMetrics starts with a digital plumbing assessment. Here are examples that show what broken plumbing looks like and how fixing it transforms results.

Capital City Roofing in Atlanta had a website with slow load times, no Google Business Profile verification, and misconfigured tracking. The plumbing fixes alone — before any content or ad work began — resulted in measurable improvement in organic search visibility.

Ibrahim Awad’s Personal Brand Build started with digital plumbing — setting up the website, connecting analytics, verifying the Google Business Profile, and establishing the social profiles that would receive the content produced by the Content Factory.

The AI Business Audit Process documents the exact checklist BlitzMetrics uses to evaluate digital plumbing across dozens of client websites simultaneously, using AI to scale what used to be a manual, time-consuming process.

Watch: Digital Plumbing in Practice

In this session from the BlitzMetrics channel, Dennis Yu walks through a complete digital plumbing assessment for a real business — covering trust-building, data measurement, and the technical foundations that must be in place before content and ads can work.

How Digital Plumbing Connects to Other BlitzMetrics Concepts

Digital Plumbing is one branch on the SEO Tree — the architecture that connects every BlitzMetrics concept to every other.

Nine Triangles Framework — Digital Plumbing is the foundation triangle. Every other triangle (content, ads, SEO, reputation) depends on plumbing being in place.

Content Factory — The Content Factory produces assets, but those assets need a technically sound website and properly connected analytics to measure their impact. Plumbing first, then production.

Dollar a Day — Running Dollar a Day campaigns requires a working Facebook pixel, conversion tracking, and a website that loads fast enough to convert the traffic you are paying for.

MAA (Metrics, Analysis, Action) — You cannot do metrics without measurement infrastructure. Digital Plumbing installs the instruments; MAA reads them.

Entity and Knowledge Graph — Schema markup, NAP consistency, and verified profiles are all plumbing tasks that directly influence whether Google recognizes your business as a trusted entity.

Website QA Audit — Once digital plumbing is installed, the website QA audit verifies that everything is actually working. The QA process checks every plumbing element documented here — GTM, GA4, Meta pixel, HTTPS, schema markup — in the context of a specific site before it goes live or after a major update. Digital Plumbing defines what needs to be in place; the website QA audit confirms it is in place.

Getting Started With Digital Plumbing

If you are not sure where your plumbing stands, start with the AI Business Audit. It will identify the gaps in minutes. From there, fix the highest-impact items first: verify your Google Business Profile, install Google Tag Manager, set up GA4 with internal traffic filtered, install the Meta pixel with lead events, and make sure your website loads in under 3 seconds on mobile. These five tasks alone will put you ahead of most small businesses competing in your market. Once the plumbing is installed, run the website QA audit to verify everything is functioning correctly before launching or promoting the site.

For structured training on digital plumbing and the full BlitzMetrics framework, see the Marketing Mechanic series — particularly Episode 6 (The $20,000 Website Mistake Most Plumbers Make), which covers the most common plumbing failures Dennis Yu encounters in the field.

This is a definitive article, following the guidelines on how every major BlitzMetrics concept is documented and maintained. All supporting content — case studies, meta-articles, and related guides — links back here as the canonical reference.

Part of the Access Checklist — the nine accesses we capture before any content ships. See also why we rebuilt it in July 2026.


The skill files for this page

Every task on this page ships as a runnable skill file you can hand to an AI agent (our publishing standard). Expand any skill to copy its file, or download the whole Task Library pack. 18 skills:

add-click-to-call-links-for-mobile.skill.md — Make every displayed phone number a tap-to-dial tel: link on mobile, tracked as a conversion event.
START

---
name: add-click-to-call-links-for-mobile
description: Make every displayed phone number a tap-to-dial tel: link on mobile, tracked as a conversion event.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Add Click-to-Call Links for Mobile

**Use this when** phone numbers on the site are plain text, when mobile visitors must copy-paste to call, or when call clicks aren't being measured.

## Inputs
- Canonical NAP phone number (one number, one format)
- Website edit access (header, footer, contact page, service pages)
- GTM container installed (for click tracking)

## Steps
1. Find every place a phone number renders: header, hero, footer, contact page, service pages, and any sticky bars.
2. Wrap each one in a tel: link using the canonical number (tel:+1XXXXXXXXXX format works everywhere). The visible text keeps the human-readable format from the NAP record.
3. Make the header number an easy thumb target on mobile — large enough to tap, visible without scrolling.
4. Test on a real phone: tap each instance; the dialer must open pre-filled with the correct number. Also confirm desktop behavior isn't broken.
5. Track it: in GTM, add a click trigger on tel: links firing an event into GA4 (and Contact to the Meta pixel if installed). Phone taps are conversions — measure them.
6. If call tracking with dynamic number insertion is in play, confirm the DNI script swaps the tel: link too, not just the visible text.

## Definition of done (QA checklist)
- [ ] Every displayed phone number on tested templates is a working tel: link
- [ ] Tap on a real phone opens the dialer with the correct canonical number
- [ ] Click-to-call event fires in GA4 on tap (verified in DebugView/Realtime)
- [ ] Number format on screen still matches the NAP record
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A max-effort agent (Claude Fable 5 or a comparable OpenAI/Google model) finds every rendered number — not just the obvious ones — wraps each in a tel: link, and verifies on a real device and in GA4 DebugView, looping until the entire Definition of done passes, not 90% of instances.
It self-verifies each item against that checklist, keeps the canonical number and the inventory of tel: locations in memory so new templates get caught on later runs, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): ensure-nap-consistency-across-platforms → this → set-up-call-tracking-for-phone-conversions → create-clear-conversion-path
- Cross-links: /website-qa-audit (CTA destination checks) · /dad

END
add-schema-markup-person-localbusiness.skill.md — Implement Person or LocalBusiness JSON-LD with sameAs links to every verified profile, stitching the brand into one machine-readable entity.
START

---
name: add-schema-markup-person-localbusiness
description: Implement Person or LocalBusiness JSON-LD with sameAs links to every verified profile, stitching the brand into one machine-readable entity.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Add Schema Markup (Person/LocalBusiness)

**Use this when** the site has no structured data, schema that fails validation, or schema whose sameAs list doesn't match the live social profiles.

## Inputs
- Canonical NAP record and the live URLs of every verified profile (Facebook, Instagram, YouTube, LinkedIn, Google Maps listing)
- Real headshot (Person) or logo (LocalBusiness) hosted on the site
- Website admin access (theme header or SEO plugin such as Rank Math)

## Steps
1. Choose the type: Person for a personal brand site, LocalBusiness for a service business. A personal brand fronting a business can use both, linked (Person worksFor → LocalBusiness).
2. Build the JSON-LD. Person: name, url, image (real headshot), jobTitle, worksFor, sameAs. LocalBusiness: name, url, image/logo, telephone, address, sameAs. Name, address, and telephone must match the canonical NAP character-for-character.
3. Fill sameAs with every live, verified profile URL — Facebook, Instagram, YouTube, LinkedIn, and the Google Maps listing. No dead or unclaimed profiles.
4. Install the JSON-LD site-wide via the SEO plugin or theme header — at minimum on the homepage and About page.
5. Validate with Google's Rich Results Test and the Schema Markup Validator: zero errors, and warnings reviewed.
6. Click every sameAs URL from the rendered source to confirm each resolves to the right profile.
7. Re-run this skill whenever a profile URL changes — stale sameAs links break the entity graph.

## Definition of done (QA checklist)
- [ ] JSON-LD present in page source on the homepage (and About page)
- [ ] Validates with zero errors in Rich Results Test / Schema Markup Validator
- [ ] sameAs lists all live profiles; every URL resolves correctly
- [ ] Schema NAP matches GBP and website NAP exactly
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) builds the JSON-LD, runs both validators, clicks every sameAs URL, and loops on each error until the full Definition of done passes — zero validation errors, not 90% of the checklist.
Because stale sameAs links break the entity graph, it keeps the canonical NAP and the live profile-URL set in memory and re-verifies them on every later run, logging a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing (dedicated guide "How to Set Up Schema Markup for Personal Brand Site" is queued in Gaps & Tasks to Create — high priority)
- Related (run order): ensure-nap-consistency-across-platforms → claim-and-brand-facebook-page (and the other profile skills) → this
- Cross-links: /knowledge-panel (schema is the technical leg of a panel) · /personal-brand (Phase 1) · /entity-linking

END
claim-and-brand-facebook-page.skill.md — Put the Facebook business page under the owner's control with correct admin structure, real branding, and NAP that matches the canon.
START

---
name: claim-and-brand-facebook-page
description: Put the Facebook business page under the owner's control with correct admin structure, real branding, and NAP that matches the canon.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Claim and Brand Facebook Page

**Use this when** the Facebook page is unclaimed, controlled by an ex-employee or old agency, duplicated, unbranded, or showing stale business info.

## Inputs
- Business owner's personal Facebook profile (pages are controlled through real profiles/Business Manager)
- Canonical NAP record, real cover photo, and logo or owner headshot
- Client's Meta Business Manager (create one if none exists — it also owns the pixel and ad account)

## Steps
1. Search Facebook for the business name. Identify the real page plus any duplicates or auto-generated unofficial pages; claim or merge/report duplicates so one page remains.
2. Fix control first: the owner's profile gets Full control of the page. Agencies and VAs get task-level access through Business Manager — never sole admin. Remove ex-employees.
3. Connect the page to the client's Business Manager (prerequisite for the pixel and Dollar a Day).
4. Set the page name and username/handle to match the business entity exactly, per the canonical NAP.
5. Brand it real: profile photo (logo, or headshot for personal brands), real cover photo from the business — no stock.
6. Complete the About section: canonical NAP, hours matching GBP, website link, and a first-person description of who the business serves.
7. Verify from a logged-out browser: correct name, photos, phone, address, and site link all render publicly.

## Definition of done (QA checklist)
- [ ] Exactly one page exists for the business; duplicates merged or reported
- [ ] Owner holds Full control; no ex-employee or unknown admins; agency on task access via Business Manager
- [ ] Page name and handle match the business entity; About shows canonical NAP + working site link
- [ ] Profile and cover photos are real brand assets, no stock
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) hunts duplicates until exactly one page remains, fixes control before cosmetics, and verifies everything from a logged-out browser — looping until the full Definition of done passes, not 90%.
It self-checks every line — admin roles, canonical NAP, real photos — against that checklist, stores the page URL and admin structure in memory for the sameAs and Business Manager runs that follow, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): ensure-nap-consistency-across-platforms → this → convert-instagram-to-professional-account → set-up-consistent-headshots-and-bios-across-profiles → add-schema-markup-person-localbusiness (add page URL to sameAs)
- Cross-links: /dad (Business Manager + page setup feeds campaigns) · /social-amplification (Stage 1)

END
configure-https-with-no-mixed-content.skill.md — Serve the entire site over HTTPS with zero mixed-content warnings so browsers, Google, and visitors trust every page.
START

---
name: configure-https-with-no-mixed-content
description: Serve the entire site over HTTPS with zero mixed-content warnings so browsers, Google, and visitors trust every page.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Configure HTTPS With No Mixed Content

**Use this when** any page shows "Not secure," a broken padlock, or console mixed-content warnings — or when HTTPS has never been verified end-to-end.

## Inputs
- Hosting control panel access (SSL certificate management)
- WordPress admin access
- List of key templates to test: homepage, contact page, a service page, a blog post

## Steps
1. Confirm a valid SSL certificate covers both the apex domain and www, and that it auto-renews at the host.
2. Force HTTPS site-wide: 301-redirect every https:// URL to https:// (host setting or server config). Test by loading the plain https:// version — it must redirect.
3. In WordPress, set both the WordPress Address and Site Address to https://.
4. Hunt mixed content: open each key template, check the browser console for mixed-content warnings, and search page source for hard-coded https:// references in images, scripts, stylesheets, and embeds.
5. Fix offenders at the source — update URLs in content and theme settings (a search-replace on https://yourdomain works for legacy content). Re-check third-party embeds.
6. Re-test all key templates: full padlock, no warnings, no console errors. Then confirm Google Search Console tracks the https property.

## Definition of done (QA checklist)
- [ ] Valid certificate on apex and www, auto-renewing
- [ ] https:// URLs 301-redirect to https:// (tested)
- [ ] Homepage, contact, service page, and a blog post all show the padlock with zero mixed-content console warnings
- [ ] No hard-coded https:// asset references remain in source on tested templates
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) sweeps template after template — load, read the console, fix the https:// reference, reload — and refuses to stop at "mostly green": it loops until every Definition-of-done item passes, not 90%.
It self-verifies against that checklist on all key templates, keeps the list of fixed offenders and tested templates in memory so later runs diff new content instead of re-auditing blind, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): ensure-proper-dns-records → this → ensure-site-loads-under-3-seconds-on-mobile
- Cross-links: /website-qa-audit (Layer 1 HTTPS check)

END
convert-instagram-to-professional-account.skill.md — Switch Instagram to a professional account connected to the Facebook page, with handle, bio, and photo matching the brand canon.
START

---
name: convert-instagram-to-professional-account
description: Switch Instagram to a professional account connected to the Facebook page, with handle, bio, and photo matching the brand canon.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Convert Instagram to Professional Account

**Use this when** the business's Instagram is still a personal account, isn't connected to the Facebook page, or carries an off-canon handle, bio, or photo.

## Inputs
- Login to the Instagram account (owner-held credentials)
- Claimed, branded Facebook page (run claim-and-brand-facebook-page first)
- Canonical headshot/logo and bio copy, plus the canonical NAP contact details

## Steps
1. In Instagram settings, switch the account type to Professional (Business for a company; Creator fits some personal brands). This unlocks insights, contact buttons, and ad eligibility.
2. Connect the account to the business's Facebook page during the professional setup (via the client's Business Manager / Meta Business Suite). Without this link, Dollar a Day can't run placements or use the account properly.
3. Set the username and display name to match the business entity as closely as the platform allows — same spelling as the canon.
4. Apply the canonical profile photo (same headshot or logo used everywhere) and write the bio in first person: who you help, where, with what proof. Add the website link.
5. Add contact options — the canonical email and phone from the NAP record.
6. Confirm in Business Manager/Business Suite that the IG account appears alongside the page, and verify the public profile from a logged-out view.
7. Add the Instagram URL to the schema sameAs list (sibling skill).

## Definition of done (QA checklist)
- [ ] Account shows as Professional with insights available
- [ ] Connected to the correct Facebook page under the client's Business Manager
- [ ] Handle, display name, photo, and bio match the brand canon; website link works
- [ ] Contact options show canonical email/phone
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) runs the conversion, the Business Manager connection, and the canon pass — handle, photo, bio, contacts — as one loop, re-checking the public profile logged-out until every Definition-of-done box passes, not 90%.
It pulls the canonical headshot and bio from memory of prior runs, records the IG URL for the schema sameAs step that follows, self-verifies against that checklist, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): claim-and-brand-facebook-page → this → set-up-youtube-channel-with-proper-branding → set-up-consistent-headshots-and-bios-across-profiles
- Cross-links: /dad (IG placements) · /personal-brand (Phase 1 social profiles)

END
create-clear-conversion-path.skill.md — Build one obvious, trackable path from landing to conversion (call, form, or booking) so visitors never wonder what to do next.
START

---
name: create-clear-conversion-path
description: Build one obvious, trackable path from landing to conversion (call, form, or booking) so visitors never wonder what to do next.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Create Clear Conversion Path

**Use this when** the site gets traffic but few leads, CTAs compete or dead-end, or a visitor landing on any page can't reach the conversion in two clicks.

## Inputs
- The primary conversion action, decided with the owner per GCT Goals: call, form, or booking — pick one as primary
- Website edit access
- Working contact form and click-to-call links (run those skills first)

## Steps
1. Define the one primary conversion (GCT: Goals before Content before Targeting). Everything else — newsletter, socials — is secondary and must look secondary.
2. Map the current paths: from the homepage and each major landing page, count the clicks to complete the conversion. Target: two clicks or fewer from anywhere.
3. Put one primary CTA above the fold on the homepage and every service page — specific verb, specific outcome ("Get a fence quote," not "Learn more").
4. Repeat the CTA at natural decision points down the page and in the header (button) so it's always one tap away on mobile.
5. Remove or demote competing CTAs and fix dead ends — every page must link onward toward the conversion, and every button must route to the right destination.
6. Confirm the conversion completes with a trackable end state (thank-you page/message firing GA4 + pixel events).
7. Walk the path on a phone as a cold visitor: land on a blog post, find your way to converting. If you hesitate anywhere, fix that step.

## Definition of done (QA checklist)
- [ ] One primary conversion defined and documented (GCT)
- [ ] Conversion reachable in ≤2 clicks from the homepage and every service page
- [ ] Primary CTA visible above the fold on home and service pages, on mobile
- [ ] Every CTA button routes to its correct destination; no dead ends on the path
- [ ] Conversion end state fires tracking events (GA4, pixel)
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) walks the path like a cold visitor from every entry page, fixes each dead end or hesitation, then walks it again — looping until the whole Definition of done passes (≤2 clicks, tracked end state), not 90%.
It self-verifies against that checklist on a phone-sized view, holds the chosen primary conversion and page map in memory so later runs protect the path instead of redesigning it, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): ensure-working-contact-form-delivers-notifications → add-click-to-call-links-for-mobile → this
- Cross-links: /website-qa-audit (Layer 2 CTA checks) · /nine-triangles (Funnel: Audience → Engagement → Conversion) · /dad

END
create-linkedin-page-matching-business-entity.skill.md — Set up a LinkedIn presence whose name and details exactly match the business entity, strengthening the entity graph Google reads.
START

---
name: create-linkedin-page-matching-business-entity
description: Set up a LinkedIn presence whose name and details exactly match the business entity, strengthening the entity graph Google reads.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Create LinkedIn Page Matching Business Entity

**Use this when** the business has no LinkedIn page, the page name doesn't match the legal/brand entity, or the page is orphaned under a departed employee's profile.

## Inputs
- Owner's LinkedIn profile (company pages are administered through personal profiles)
- Canonical NAP record, logo, real cover image, and canonical bio/description copy
- Website URL

## Steps
1. Search LinkedIn for existing pages with the business name. Claim or consolidate strays — one entity, one page (a second competing page is entity vandalism).
2. Create (or take over) the Company Page with the name spelled exactly like the business entity in the canonical NAP. For a pure personal brand, the person's profile serves the role — same canon rules apply.
3. Make the owner a super admin. Operators get admin roles under them; remove ex-employees.
4. Complete the profile: logo as page photo, real cover image, website URL, industry, location matching the canonical address, and a first-person About section describing who the business serves.
5. Have current team members set the page as their employer so the page accrues real affiliation signals.
6. Verify the public page from a logged-out browser: name, location, and site link all match canon.
7. Add the LinkedIn URL to the schema sameAs list and website footer (sibling skills).

## Definition of done (QA checklist)
- [ ] Page name matches the business entity name character-for-character
- [ ] Owner is super admin; no orphan or duplicate pages remain
- [ ] Location and contact details match the canonical NAP; website link works
- [ ] Logo and cover are real brand assets; About written in first person
- [ ] LinkedIn URL present in schema sameAs
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) consolidates stray pages down to exactly one, sets the name character-for-character to the canon, and re-verifies the public page from a logged-out browser — looping until every Definition-of-done item passes, not 90%.
It self-checks admin roles and NAP details against that checklist, keeps the page URL in memory for the schema sameAs and footer runs that follow, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): set-up-youtube-channel-with-proper-branding → this → set-up-consistent-headshots-and-bios-across-profiles → add-schema-markup-person-localbusiness
- Cross-links: /knowledge-panel (entity validation) · /personal-brand (Phase 1)

END
ensure-nap-consistency-across-platforms.skill.md — Make the business Name, Address, and Phone identical character-for-character across every platform so Google can trust the entity.
START

---
name: ensure-nap-consistency-across-platforms
description: Make the business Name, Address, and Phone identical character-for-character across every platform so Google can trust the entity.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Ensure NAP Consistency Across Platforms

**Use this when** the business name, address, or phone number appears in more than one variant anywhere online (suite vs. ste., LLC vs. no LLC, old phone numbers).

## Inputs
- Verified Google Business Profile (run verify-google-business-profile first)
- One canonical NAP record decided with the owner: exact name spelling, exact address format, one phone number in one format
- Login access to website, GBP, and all social profiles

## Steps
1. Write the canonical NAP with the owner and freeze it: one spelling of the name (with or without LLC — pick one), one address format (Suite vs. Ste — pick one), one phone format. Store it in the client record.
2. Inventory every surface that shows NAP: Google Business Profile, website footer, contact page, About page, schema markup, Facebook page, Instagram bio, YouTube About, LinkedIn page, email signatures, and any directory listings you control.
3. Compare each surface to the canon character-for-character. Log every mismatch — "St." vs "Street" is a mismatch.
4. Fix mismatches at the source, starting with GBP and the website (footer, contact page, and the JSON-LD schema must all match).
5. Update the social profiles next, then directories you can access.
6. Re-run the comparison after edits — platform review queues (GBP especially) can silently revert changes.

## Definition of done (QA checklist)
- [ ] Canonical NAP documented in the client record
- [ ] GBP, website footer, contact page, and schema markup show identical NAP, character-for-character
- [ ] Facebook, Instagram, YouTube, and LinkedIn show the same NAP (as much as each field allows)
- [ ] Zero known surfaces still showing an old phone number or name variant
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent, max-effort agent (Claude Fable 5 or a comparable OpenAI/Google model) runs this as a diff loop: inventory every NAP surface, fix mismatches, then re-crawl days later to catch GBP review-queue reverts — repeating until every Definition-of-done box passes, not 90%.
It self-verifies character-for-character against that checklist, holds the frozen canonical NAP and surface inventory in memory so each run diffs against canon instead of starting over, and logs a meta-article example every run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): verify-google-business-profile → this → add-schema-markup-person-localbusiness (schema NAP must match) → set-up-consistent-headshots-and-bios-across-profiles
- Cross-links: /website-qa-audit · /knowledge-panel (entity consistency is the foundation of a panel)

END
ensure-site-loads-under-3-seconds-on-mobile.skill.md — Get the website loading in under 3 seconds on a mobile device, because slow plumbing wastes every ad dollar and ranking the site earns.
START

---
name: ensure-site-loads-under-3-seconds-on-mobile
description: Get the website loading in under 3 seconds on a mobile device, because slow plumbing wastes every ad dollar and ranking the site earns.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Ensure Site Loads Under 3 Seconds on Mobile

**Use this when** the site feels slow on a phone, PageSpeed Insights mobile scores are poor, or before sending any Dollar a Day traffic to the site.

## Inputs
- Admin access to WordPress (plugins, theme, media) and hosting/CDN
- Baseline measurement: PageSpeed Insights mobile run for the homepage and the top landing page
- List of the highest-traffic pages (from GA4 if installed)

## Steps
1. Baseline first (MAA: Metrics before Action): run PageSpeed Insights on mobile for the homepage and top landing pages. Save scores and load times — this is your before evidence.
2. Fix images, the usual offender: compress, serve modern formats, size to display dimensions, lazy-load below-the-fold images. Hero images shot on a phone are often uploaded at full resolution — scale them.
3. Cut render-blocking weight: remove unused plugins and scripts, defer non-critical JavaScript, drop heavy page-builder modules that load site-wide.
4. Enable caching at the host and a CDN if available; verify caching is actually serving (check response headers).
5. Re-test on PageSpeed Insights and on a real phone over cellular — the lived experience is the test that matters.
6. Repeat steps 2–4 until mobile load is under 3 seconds, then record before/after numbers in the client record (Analysis → Action complete).

## Definition of done (QA checklist)
- [ ] Homepage and top landing page load in under 3 seconds on mobile (PageSpeed Insights + real-device check)
- [ ] No unused plugins or render-blocking scripts left from the audit
- [ ] Caching/CDN confirmed serving
- [ ] Before/after measurements recorded in the client record
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
This is a literal optimization loop, so run it on a max-effort agent (Claude Fable 5 or a comparable OpenAI/Google model): re-measure PageSpeed after every fix — images, scripts, caching — and keep cutting weight until mobile load is under 3 seconds and every Definition-of-done box passes, not 90%.
It self-verifies against that checklist with fresh measurements rather than assuming a fix worked, carries the before/after baselines in memory across runs so regressions stand out, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): configure-https-with-no-mixed-content → this → write-proper-title-tags-and-meta-descriptions
- Cross-links: /website-qa-audit (Layer 1 speed check) · /maa (measure → analyze → act) · /dad (never pay to send traffic to a slow page)

END
ensure-working-contact-form-delivers-notifications.skill.md — Prove the contact form actually submits and that notifications land in an inbox the owner reads — because a silent form is a lead funeral.
START

---
name: ensure-working-contact-form-delivers-notifications
description: Prove the contact form actually submits and that notifications land in an inbox the owner reads — because a silent form is a lead funeral.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Ensure Working Contact Form Delivers Notifications

**Use this when** taking over any site, after any form/plugin/email change, or whenever the owner says "we don't get many leads from the website."

## Inputs
- The live form URL(s) and access to the form plugin settings
- The correct destination inbox — confirmed with the owner as one they actually monitor
- Email deliverability basics in place (see configure-spf-dkim-dmarc-for-deliverability)

## Steps
1. Submit a real test through the live form on desktop and on a phone, using an obvious test marker in the message.
2. Confirm the notification arrives in the owner's monitored inbox within minutes. Check spam/junk. Check it didn't go to a dead VA, ex-employee, or agency address.
3. Fix the recipient list in the form settings if wrong. If notifications don't send at all, route form mail through authenticated SMTP (and verify SPF/DKIM cover the sender).
4. Confirm the visitor-facing success state: a thank-you message or thank-you page must appear — this is also the conversion-tracking hook.
5. Wire the submission into measurement: fire a form-submit event via GTM into GA4 (and Meta pixel Lead, if installed).
6. Re-test end-to-end after every fix: submit → notification received → thank-you shown → event recorded.
7. Put a quarterly form re-test on the maintenance calendar — forms break silently when plugins update.

## Definition of done (QA checklist)
- [ ] Test submission from mobile and desktop arrives in the owner's monitored inbox, not spam
- [ ] Thank-you message/page displays after submission
- [ ] Form-submit event visible in GA4 (and Lead in Meta Events Manager if pixel installed)
- [ ] No dead or wrong recipients left in form settings
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) re-runs the full chain — submit, notification received, thank-you shown, GA4 event — after every change, looping until all Definition-of-done boxes pass, not 90%; since forms break silently, it also owns the quarterly re-test.
It self-verifies with real test submissions against that checklist, keeps recipient/SMTP settings and past failure causes in memory so regressions are caught on sight, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): configure-spf-dkim-dmarc-for-deliverability → this → create-clear-conversion-path → set-up-ga4-with-internal-traffic-filtering
- Cross-links: /website-qa-audit (email opt-in / CTA checks) · /dad (conversion tracking prerequisite)

END
set-correct-business-categories.skill.md — Select the most accurate primary and secondary Google Business Profile categories so the listing ranks for the searches that actually drive revenue.
START

---
name: set-correct-business-categories
description: Select the most accurate primary and secondary Google Business Profile categories so the listing ranks for the searches that actually drive revenue.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Set Correct Business Categories

**Use this when** a GBP's primary category is generic ("Contractor" instead of "Fence contractor"), missing, or stuffed with aspirational categories the business doesn't serve.

## Inputs
- Verified GBP with edit access
- The business's money service — the one offering that drives most revenue (from GCT: Goals first)
- List of real secondary services the business actually delivers

## Steps
1. Name the money service with the owner. The primary category must match it, not the broadest label — primary category is the strongest ranking lever on the profile.
2. In GBP, search the category picker for the most specific category that matches the money service. Pick specific over general every time (e.g., "Fence contractor," not "Contractor").
3. Add secondary categories only for services the business genuinely sells today. No aspirational categories, no stuffing — irrelevant categories dilute relevance and invite suspensions.
4. Sanity-check against winners: search the money keyword in Google Maps for the service area and note the primary categories the top 3 listings use.
5. Save and re-check after a few days — category edits go through Google review and can be rejected or reverted.
6. Record primary + secondary categories in the client record so future audits can detect drift.

## Definition of done (QA checklist)
- [ ] Primary category is the most specific available match to the money service
- [ ] Every secondary category maps to a service the business actually delivers
- [ ] No generic, aspirational, or unrelated categories remain
- [ ] Edits survived Google's review (re-checked after a few days) and are documented
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
Category edits sit in Google review for days and can be silently rejected — a persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) submits, waits, re-checks, and resubmits until every Definition-of-done item passes, not 90%.
It self-verifies against that checklist, keeps the chosen primary/secondary categories and the top-3 competitor categories in memory so later runs detect drift instantly, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): verify-google-business-profile → ensure-nap-consistency-across-platforms → upload-real-photos-and-set-business-hours → this
- Cross-links: /nine-triangles (GCT: Goals decide the money service) · /website-qa-audit

END
set-up-call-tracking-for-phone-conversions.skill.md — Implement call tracking with dynamic number insertion so phone calls — often the real conversion for local businesses — get measured without breaking NAP.
START

---
name: set-up-call-tracking-for-phone-conversions
description: Implement call tracking with dynamic number insertion so phone calls — often the real conversion for local businesses — get measured without breaking NAP.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Set Up Call Tracking for Phone Conversions

**Use this when** phone calls are a primary way this business wins customers and nobody can say how many calls the website or campaigns generate.

## Inputs
- Confirmation from the owner that calls are a primary conversion (GCT Goals — if calls don't matter, skip this task)
- Canonical NAP phone number and the line calls should forward to
- A call tracking platform with dynamic number insertion (DNI), plus GTM access for events

## Steps
1. Confirm the business case: if calls are a primary conversion method, track them; if not, stop here and rely on form tracking.
2. Provision a tracking number (local area code) in the call tracking platform, forwarding to the real business line. Test the forward with a live call before going further.
3. Use dynamic number insertion on the website: the DNI script swaps the displayed number (and tel: links) per visitor/source while the underlying canonical number stays the business's own. Never paste raw tracking numbers into GBP, citations, or schema — that breaks NAP consistency.
4. Install the DNI script via GTM on all pages and verify the swap happens on desktop and mobile, including the tel: links.
5. Wire measurement: send call events into GA4 (key event) and, if running ads, to the Meta pixel — calls from Dollar a Day traffic must be attributable.
6. Configure sensible call handling: business-hours routing, voicemail fallback, and recording only as permitted by local consent law.
7. Place a test call from the website number end-to-end: phone rings, call logs in the platform, event lands in GA4. Document numbers and routing in the client record.

## Definition of done (QA checklist)
- [ ] Test call via the website's displayed number rings through to the real line and logs in the platform
- [ ] DNI swaps displayed numbers and tel: links; canonical NAP number untouched on GBP, citations, schema
- [ ] Call event appears in GA4 as a key event (and in Meta Events Manager if ads run)
- [ ] Routing, hours, and consent-compliant recording settings documented
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A max-effort agent (Claude Fable 5 or a comparable OpenAI/Google model) tests the whole chain — DNI swap on desktop and mobile, live call forwarding, platform log, GA4 key event — and loops on any broken link until every Definition-of-done item passes, not 90%.
It self-verifies against that checklist that the canonical NAP number stayed untouched on GBP, citations, and schema — pulling that canon from memory of prior runs — and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): add-click-to-call-links-for-mobile → install-meta-pixel-with-standard-events → this
- Cross-links: ensure-nap-consistency-across-platforms (protect NAP while tracking) · /maa (calls are Metrics) · /dad (attribute calls to $1/day ad sets)

END
set-up-youtube-channel-with-proper-branding.skill.md — Create and brand a YouTube channel connected to the website, ready to host the one-minute videos the Content Factory produces.
START

---
name: set-up-youtube-channel-with-proper-branding
description: Create and brand a YouTube channel connected to the website, ready to host the one-minute videos the Content Factory produces.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Set Up YouTube Channel With Proper Branding

**Use this when** the business has no YouTube channel, an unbranded default channel, or a channel stranded in a personal account nobody controls.

## Inputs
- Business owner's Google account (use a Brand Account or grant the owner channel access — never a VA's personal channel)
- Canonical headshot/logo, a real banner image, and the canonical bio copy
- At least one real video to publish (a one-minute video or the WHY video)

## Steps
1. Create or claim the channel under the owner's Google account. If others must manage it, use a Brand Account / channel permissions rather than sharing passwords.
2. Set the channel name to match the business entity (or the person, for personal brands) and claim a handle as close to the canon as available.
3. Brand it: profile photo = the canonical headshot/logo; banner = a real photo of the business or person at work, not stock.
4. Write the channel description in first person with the core topics and service area, and add the canonical contact email.
5. Add the website link in the channel's links section so the channel points home.
6. Publish at least one real video — a one-minute video answering a customer question is the standard starter — so the channel isn't an empty shell.
7. Add the channel URL to the schema sameAs list and the website footer (sibling skills).

## Definition of done (QA checklist)
- [ ] Channel exists under owner-controlled access (no password-sharing, no VA-owned channel)
- [ ] Name/handle, photo, and banner match the brand canon; no stock imagery
- [ ] Description in first person; website link live on the channel
- [ ] At least one real video published; channel URL added to sameAs and footer
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) does not stop at a branded empty shell: it loops through access setup, canon branding, the website link, and a first real published video until the entire Definition of done passes, not 90%.
It self-verifies against that checklist from a logged-out view, carries the canon assets and channel URL in memory for the sameAs/footer siblings and future Content Factory uploads, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): convert-instagram-to-professional-account → this → create-linkedin-page-matching-business-entity
- Cross-links: /one-minute-video-guide (what to publish first) · /content-factory (videos flow here) · /dad (YouTube campaigns need a real channel)

END
upload-real-photos-and-set-business-hours.skill.md — Load the Google Business Profile with recent real photos (no stock) and make the posted hours match reality, including holidays.
START

---
name: upload-real-photos-and-set-business-hours
description: Load the Google Business Profile with recent real photos (no stock) and make the posted hours match reality, including holidays.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Upload Real Photos and Set Business Hours

**Use this when** a verified Google Business Profile has stock images, stale photos, an empty gallery, or hours that don't match when the business actually answers.

## Inputs
- Verified GBP with Manager or Owner access
- 10+ recent real photos from the owner's phone: owner headshot, team, storefront/vehicles, real jobs in progress, before/after shots
- The true operating hours, confirmed by the owner (including when phones are actually answered)

## Steps
1. Collect real photos only — phone-shot, recent, recognizably this business. Reject stock photography and AI-generated images on sight; they destroy trust and violate the no-stock rule.
2. Upload to the right GBP slots: logo, cover photo, then gallery photos across exterior, interior, team, and at-work categories.
3. Delete or flag outdated photos (old branding, ex-employees, previous location).
4. Set regular hours to match reality. If calls are answered beyond door hours, use the "more hours" options where applicable.
5. Add special hours for every upcoming holiday this quarter — wrong holiday hours generate the angriest reviews.
6. View the live listing on Google Maps from a phone: confirm photos render, the cover photo is the one you chose, and hours read correctly.
7. Set a recurring reminder to add fresh photos monthly — recency is a ranking and trust signal.

## Definition of done (QA checklist)
- [ ] 10 or more real photos live on the profile; zero stock or AI images
- [ ] Logo and cover photo set and rendering on the Maps listing
- [ ] Regular hours match confirmed reality; special hours set for upcoming holidays
- [ ] Outdated photos removed or flagged
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
This task never really ends — fresh photos monthly, special hours every holiday — which is exactly what a persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) is for: it uploads, confirms the live Maps rendering, and loops until every Definition-of-done box passes, not 90%.
It self-verifies against that checklist (photo count, zero stock, hours match reality), remembers in memory which photos and hours shipped on prior runs so each pass only adds what is new, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): verify-google-business-profile → ensure-nap-consistency-across-platforms → this → set-correct-business-categories
- Cross-links: /website-qa-audit (no-stock-images check) · /one-minute-video-guide (same phone-real-content principle)

END
verify-domain-ownership-and-registrar-access.skill.md — Confirm the business actually owns its domain and can log into the registrar — the single point of failure under everything else in digital plumbing.
START

---
name: verify-domain-ownership-and-registrar-access
description: Confirm the business actually owns its domain and can log into the registrar — the single point of failure under everything else in digital plumbing.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Verify Domain Ownership and Registrar Access

**Use this when** onboarding any client, when nobody remembers where the domain is registered, or when a past webmaster "handled all that."

## Inputs
- The domain name(s) in use
- The business owner present (recovery may require their identity/email/payment history)
- WHOIS lookup access (any public WHOIS tool)

## Steps
1. Run a WHOIS lookup: identify the registrar, creation/expiry dates, and registrant (often privacy-masked — the registrar is the key fact).
2. Ask the owner to log into that registrar while you watch. If they can't, find who can: old webmaster, ex-agency, a defunct email. This is the moment to recover control, not during an outage.
3. If a third party holds the domain, transfer it: initiate a registrar account change or domain transfer into an account owned by the business, with the owner's email on file.
4. Harden the account: owner's current email as primary contact, two-factor authentication on, domain transfer lock on, auto-renew on with a valid payment method.
5. Check expiry: renew now if less than 6 months out. An expired domain takes the website, email, and every profile link down with it.
6. Confirm DNS management access from this account (or document where DNS is delegated) — sibling skills depend on it.
7. Record registrar, account holder, expiry date, and nameservers in the client record.

## Definition of done (QA checklist)
- [ ] Owner can personally log into the registrar account holding the domain
- [ ] Registrant/account belongs to the business, not a vendor or ex-employee
- [ ] 2FA on, transfer lock on, auto-renew on with valid payment; expiry >6 months out
- [ ] DNS management location confirmed and documented with nameservers
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) treats this as the single point of failure it is: it works recovery or transfer to the end — not "emailed the old webmaster, waiting" — and loops until every Definition-of-done item passes, not 90%.
It self-verifies 2FA, transfer lock, auto-renew, and expiry against that checklist, writes registrar, nameservers, and expiry date to memory so every later DNS, email, and GSC run builds on confirmed access, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): this → ensure-proper-dns-records → set-up-professional-email-on-domain → configure-spf-dkim-dmarc-for-deliverability
- Cross-links: /personal-brand (Phase 1: register the name domain) · verify-google-search-console-and-connect-to-ga4 (DNS TXT verification needs this access)

END
verify-google-business-profile.skill.md — Complete Google's verification of the Google Business Profile and put admin control in the business owner's own hands, so the profile can rank in Maps and anchor the entity.
START

---
name: verify-google-business-profile
description: Complete Google's verification of the Google Business Profile and put admin control in the business owner's own hands, so the profile can rank in Maps and anchor the entity.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: complete
---

# Verify Google Business Profile

**Use this when** a business (or personal brand with a physical/service presence) has no verified Google Business Profile, or nobody knows which account controls it.

## Inputs
- Business owner's own Google account (never verify under an agency or VA account)
- Canonical NAP record: exact business Name, Address, Phone
- Ability to receive Google's verification (video walkthrough, postcard, phone, or email — whatever Google offers this listing)

## Steps
1. Search the exact business name on Google and Google Maps. Find the existing profile, including any unclaimed or duplicate listings.
2. If a profile exists, start "Claim this business" / "Own this business?" from the listing. If none exists, create one in the Google Business Profile manager with the canonical NAP.
3. Sign in as the business owner — the owner's Google account must end up as Primary owner. Agencies and VAs get added later as Managers, never as Primary owner.
4. Complete whichever verification method Google offers (video verification is most common now: film the storefront/vehicle/equipment and proof of business as prompted). Follow it to the end — a half-verified profile is invisible.
5. Once verified, audit Profile access: remove ex-employees and unknown accounts, demote agencies to Manager.
6. Confirm the profile data matches the canonical NAP character-for-character (this feeds the NAP consistency task).
7. Record the managing Google account and verification date in the client record.

## Definition of done (QA checklist)
- [ ] Profile shows as Verified in the Google Business Profile dashboard (no pending banner)
- [ ] Business owner's own Google account is Primary owner; access list contains no strangers
- [ ] Listing appears on Google Maps when searching the exact business name
- [ ] NAP on the profile matches the canonical NAP record exactly
- [ ] Managing account + verification date documented in the client record
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- The /digital-plumbing hub links the library's real GBP verification examples (Requirement 3). Example needed here — run the Meta-Article Prompt after the next real run.

## Run on a persistent agent (Fable 5)
Google's verification can stretch across days and methods, and a half-verified profile is invisible — a persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) follows it to the end, re-checking status and access until every Definition-of-done item passes, not 90%.
It self-verifies owner, access list, and NAP against that checklist, writes the managing account and verification date to memory so every downstream GBP run builds on confirmed control, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): ensure-nap-consistency-across-platforms → upload-real-photos-and-set-business-hours → set-correct-business-categories
- Cross-links: /website-qa-audit (Layer 3 re-checks GBP verification) · /personal-brand (Phase 1) · /dad (verified plumbing is a prerequisite)

END
verify-google-search-console-and-connect-to-ga4.skill.md — Verify Search Console ownership of the domain and link it to GA4 so search queries, impressions, and clicks flow into one measurement view.
START

---
name: verify-google-search-console-and-connect-to-ga4
description: Verify Search Console ownership of the domain and link it to GA4 so search queries, impressions, and clicks flow into one measurement view.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: active
gated_by: client-access-checklist (rows 1 and 3 — this task IS row 1)
---

# Verify Google Search Console and Connect to GA4

**Use this when** nobody can see what the site ranks for, GSC is unverified or stuck in an old webmaster's account, or GA4 shows no Search Console data.

> **This task is a gate, not a nice-to-have.** No content ships to a property that hasn't cleared it.
> On 2026-06-14 we published 16 articles to a client site that had no GSC property. Six of them were
> never indexed and nobody knew for six weeks. See `Access-Checklist/RCA-2026-07-27-anthonyhilb-gsc.md`.
> Before running this task, check `Access-Checklist/ACCESS-REGISTER.json` and run
> `python3 Access-Checklist/access_audit.py --domain <domain>` — we often already hold access nobody remembered.

## Inputs
- Business owner's Google account (property ownership stays with the client)
- DNS access at the registrar/DNS host (for domain verification — see verify-domain-ownership-and-registrar-access)
- GA4 property with Editor access (run set-up-ga4-with-internal-traffic-filtering first)

## Steps
1. In Search Console under the owner's Google account, add a Domain property for the root domain (covers http/https, www/non-www, and subdomains in one property).
2. Verify via the DNS TXT record GSC provides: add it at the DNS host, wait for propagation, click Verify.
3. Audit users: owner's account holds Owner; operators added as Full users; ex-webmasters and unknown accounts removed.
4. Submit the XML sitemap (from the sitemap skill) and confirm Success status.
5. Link to GA4: in GA4 Admin → Product links → Search Console links, connect the GSC property to the GA4 property and select the web data stream.
6. In GA4, confirm the Search Console reports appear (publish the Search Console collection from the Library if hidden) and queries begin flowing — allow up to 48 hours for first data.
7. Record the verification method and property details in the client record so access never gets lost again.

## Definition of done (QA checklist)
- [ ] Domain property verified in GSC via DNS TXT, owned by the client's account
- [ ] User list audited — no stale or unknown accounts with access
- [ ] Sitemap submitted with Success status
- [ ] GSC↔GA4 link live; Search Console reports visible in GA4 with query data (within 48h)
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)

**anthonyhilb.com — the cost of skipping this task (July 2026).** We published 16 how-to guides on
June 14 to a client site we publish to but do not host. Because our GSC coverage audit took its
denominator from the hosting fleet, the site could not appear as a gap; because the client-facing
"needs your login" list was written from memory rather than from a checklist, Search Console was
never requested. Five weekly reports read "flat, content needs more time." On July 27 a direct index
check found **6 of the 16 guides had never been indexed** — including the three most commercial
topics. The same probe found no GA4 and no GTM either: 16 articles shipped into a property with zero
measurement. The fleet-wide sweep that followed found 127 more properties in the same condition,
50 of them on our own hosting.

**What the fix looked like:** build the audit denominator from work (`build_access_register.py`
merges credentials + hosting fleet + client rosters + client project folders → 265 properties, 160
of them previously invisible), probe each one from public HTML (`access_audit.py`), and run it
weekly (`access-coverage-audit`). Full write-up:
`Access-Checklist/RCA-2026-07-27-anthonyhilb-gsc.md`.

**The transferable lesson:** an audit is only as honest as its denominator. Ours reported "92 sites
not in GSC" with total confidence while being structurally incapable of seeing the site that broke.

## Run on a persistent agent (Fable 5)
DNS propagation and the up-to-48-hour wait for first query data make this a long-horizon task: a persistent agent (Claude Fable 5 or a comparable OpenAI/Google model) verifies, links, then returns to confirm data actually flows, looping until the entire Definition of done passes, not 90%.
It self-verifies each item — TXT live, users audited, GSC-GA4 link active — against that checklist, persists the verification method and property details in memory so access never gets lost between runs, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): create-xml-sitemap-and-reference-in-robots-txt → set-up-ga4-with-internal-traffic-filtering → this
- Cross-links: /website-qa-audit · /maa (GSC impressions/clicks are core Metrics) · /seo-tree (rankings prove the tree is working)

END
write-proper-title-tags-and-meta-descriptions.skill.md — Give every indexable page a unique title tag under 60 characters and meta description under 160 characters, each carrying its focus keyword.
START

---
name: write-proper-title-tags-and-meta-descriptions
description: Give every indexable page a unique title tag under 60 characters and meta description under 160 characters, each carrying its focus keyword.
category: Digital Plumbing
stage: —
definitive_article: /digital-plumbing
status: needs-work
---

# Write Proper Title Tags and Meta Descriptions

**Use this when** pages have missing, duplicate, truncated, or keyword-less titles and meta descriptions — or after launching any new page.

## Inputs
- Crawl or page list of all indexable pages (Rank Math's list or a site crawl)
- Focus keyword per page (from the page's GCT: what searcher is this page for?)
- Access to the SEO plugin (Rank Math) to edit titles and metas

## Steps
1. Inventory every indexable page and its current title and meta description. Flag missing, duplicate, over-length, and keyword-less entries.
2. For each page, confirm the focus keyword — the real phrase its target searcher uses. One page, one keyword family (no two pages competing for the same term; that's content vandalism).
3. Write the title: under 60 characters, focus keyword near the front, brand at the end if it fits. Describe what the page actually delivers — no clickbait, no AI-fluff phrasing.
4. Write the meta description: under 160 characters, focus keyword included naturally, plus a concrete reason to click (outcome, proof, or offer). Active voice.
5. Enter both in Rank Math per page and confirm no template is overriding them.
6. QA pass: every title and meta unique site-wide; spot-check a Google result (site:yourdomain) to see how they render in the SERP.

## Definition of done (QA checklist)
- [ ] Every indexable page has a title under 60 characters containing its focus keyword
- [ ] Every indexable page has a meta description under 160 characters containing its focus keyword
- [ ] Zero duplicate titles or metas site-wide
- [ ] No truncation on spot-checked SERP renderings
- [ ] Linked back to the definitive article and relevant siblings
- [ ] Complies with Blog Posting Guidelines (if it publishes content)

## Example(s)
- Example needed — run the Meta-Article Prompt after first real run.

## Run on a persistent agent (Fable 5)
A long-horizon agent (Claude Fable 5 or a comparable OpenAI/Google model) works the full page inventory, not a sample: write, check length and keyword, re-crawl for duplicates, and loop until every indexable page passes the entire Definition of done, not 90% of pages.
It self-verifies the 60/160 limits and site-wide uniqueness against that checklist programmatically, stores the page-to-keyword map in memory so new pages slot into the same canon on later runs, and logs a meta-article example each run so the library compounds.
See `boil-the-ocean.md` for the full operating principles.

## Definitive article & links
- Hub: /digital-plumbing
- Related (run order): this → ensure-robots-meta-not-blocking-indexing → create-xml-sitemap-and-reference-in-robots-txt
- Cross-links: /blog-posting-guidelines (title/meta rules live here) · /website-qa-audit (Layer 2 title/meta checks) · /seo-tree (one page per concept)

END
Dennis Yu
Dennis Yu
Dennis Yu is the CEO of Local Service Spotlight, a platform that amplifies the reputations of contractors and local service businesses using the Content Factory process. He is a former search engine engineer who has spent a billion dollars on Google and Facebook ads for Nike, Quiznos, Ashley Furniture, Red Bull, State Farm, and other brands. Dennis has achieved 25% of his goal of creating a million digital marketing jobs by partnering with universities, professional organizations, and agencies. Through Local Service Spotlight, he teaches the Dollar a Day strategy and Content Factory training to help local service businesses enhance their existing local reputation and make the phone ring. Dennis coaches young adult agency owners serving plumbers, AC technicians, landscapers, roofers, electricians, and believes there should be a standard in measuring local marketing efforts, much like doctors and plumbers must be certified. He has appeared on 353 podcasts with 619 credited episodes — see the full list of his podcast appearances.