Bednight Stories

Assessment · breesy.ai · 19 Aug 2026

Built to be found. Not built to be measured.

The parent site is materially more mature than its consumer sibling, fast, clean, properly schema'd, with real proprietary data behind it. The failures here are almost all failures of finishing, not of craft. But no advertising platform has ever received a conversion signal from this domain, and one image file exists across forty-seven pages.

47 pages crawled6 dimensions65 findings verified18 downgraded on review1 refuted
4
Critical
32
High
26
Medium
4
Low
10
Done right

What this site is today

A good B2B site with no instruments in the cockpit.

Forty-seven pages positioning Breesy as “the AI operating layer for restoration”, six products anchored by Breesy Voice, sold to four named buyer tiers, plus nine franchise-brand landing pages and a seventeen-article blog. Someone competent built this: 47/47 unique titles, descriptions and canonicals with no duplicates, 66 cleanly-parsing JSON-LD blocks, substantive long-form content at a median 1,441 words carrying proprietary 30,000-job benchmark data, a completed SOC 2 Type II, and three named, titled customers at recognizable franchise brands.

What it does not have is a measurement layer, a creative library, or more than one thing for a visitor to do. 187 of 199 CTAs point at the same 30-minute Calendly demo. /pricing contains zero dollar figures. And exactly one advertising signal has ever left this domain. GA4, configured bare. No Google Ads tag, no Meta pixel, no LinkedIn Insight, no Bing, on any of the 47 pages.

Priorities

The five that matter most

  1. There is no measurement layer, and it has a 30-day lead time

    The only hard gate on the list. No campaign can bid to conversions, no retargeting pool is filling, and audience not accrued before install cannot be recovered retroactively.

  2. There is no creative library, one real image file across 47 pages

    Social, paid, video and brand all draw from the same empty well. It is the longest lead-time item on the engagement and the least compressible: a screen-record can happen next week, a job-site shoot cannot.

  3. The conversion layer is one door, and part of it is visibly broken

    It caps the return on every dollar the other five workstreams generate. 94% of CTAs ask for the same sales call, and the highest-intent page renders a fake calendar with an internal build note still in it.

  4. The proof already exists and is not being used

    The cheapest differentiation available, already owned: three named operators, a 30,000-job dataset, SOC 2 Type II, trade press, a Westhill integration. None of it structured, sourced, or on the pages that sell.

  5. The entity does not resolve and the category language contradicts itself

    Ranks last only because it compounds slowly. Zero sameAs sitewide, no G2, a zero-review Capterra listing, a crowded Breesy/Breezy namespace, so none of the work above accrues cleanly to one recognizable name.

Two items sit outside that ranking because they are liability rather than upside and should not compete with growth work for budget. Legal: nine indexed pages built on third-party franchise marks, one using franchisee business names as testimonial bylines, plus a self-ranked competitor comparison claiming an evaluation it never documents. Accessibility: verified WCAG AA failures on 188 button instances, on gradient headline text across 26 pages, and on focus order sitewide. Real ADA demand-letter surface, and mostly one token value from passing.

Findings

The fix list

Thirty items, deduplicated across six independent audits and re-verified against the live site by a second pass instructed to refute them. Eighteen were downgraded in severity and one was thrown out entirely.

Fix this week10 items · mostly quick, but W2 starts a clock
W1CriticalA fake calendar with a developer placeholder is live on /pricing
Evidence

calendarHTML() renders clickable-styled date cells with a hover state and no click handler bound anywhere. The block ends with the hard-coded string “Times appear after you pick a day. Connect your Calendly link to enable live booking.” The mock is the default visible state, the real holder ships hidden and only swaps in if Calendly loads within 10 seconds. After timeout the decoy is never replaced. This is step 4 of a 5-step qualification flow.

Impact

The deepest, highest-intent point in the funnel is where the site looks least finished. Even on a fast load there is a visible flash of the decoy; on any Calendly failure the prospect clicks dead date pills under an internal build note.

Fix

Delete the mock. Render the holder visible from the start behind a neutral skeleton, initialise Calendly immediately, and after a 5s timeout swap in the real contact form markup that already works on /contact.

W2CriticalNo tag layer at all, and it gates every paid dollar for 30 days
Evidence

47/47 pages load exactly one tag: GA4, configured bare. Zero occurrences sitewide of AW-, GTM-, fbq(, _linkedin_partner_id, Bing UET, TikTok, Clarity, Hotjar, Segment or PostHog. No cross-domain linker for calendly.com. No Consent Mode v2. Three inline generate_lead events exist and are sensibly named, the events are right, the destinations don't exist.

Impact

No campaign can bid to conversions. No retargeting pool exists or is filling on Meta, LinkedIn or Google, and LinkedIn needs 300 matched members before an audience activates at all. This is a lead-time problem, not a setup task.

Fix

GTM as the single tag layer; move GA4 into it. Add Meta Pixel + CAPI, LinkedIn Insight, Google Ads with Enhanced Conversions. One shared schema: demo_booked primary, contact_submitted, soft qualify_view. Add the Calendly linker, and include breesy-connect.com in the config now. Deploy at least 30 days before first spend.

W6CriticalThe homepage H1 claims a category the site never uses anywhere else
Evidence

The H1 reads “AI infrastructure to grow your revenue”, containing neither “restoration” nor “operating layer.” The title, og:title, meta description, footer, copyright line and homepage FAQ schema all say “the AI operating layer for restoration.” “Operating layer” appears 66 times across the 18 core pages; “AI infrastructure” appears exactly once, and that instance is the H1.

Impact

The highest-value brand real estate on the property leads with a phrase used nowhere else, in a category the company never otherwise claims. A visitor arriving from a SERP promising “the AI operating layer for restoration” lands on a headline that could belong to any vertical SaaS company.

Fix

Promote the category into the H1 and demote the revenue promise to the subhead, which already carries it. Retire “AI infrastructure” and “operating core” from brand-level copy.

W3HighClick IDs are captured nowhere, so paid can never optimize to pipeline
Evidence

/demo already forwards five UTM parameters to Calendly, prefills name and email, and fires generate_lead on calendly.event_scheduled, good work. But gclid, gbraid, wbraid, fbclid, msclkid, li_fat_id and document.referrer return 0 occurrences across all 47 pages. /pricing hard-codes its Calendly URL with zero UTM strings. /contact's form has 0 hidden inputs. The 5-step pricing quiz collects 18 possible answers and transmits none of them.

Impact

Bookings from the pricing flow arrive unattributed. Without click IDs reaching the booking record, platforms optimize toward form fills rather than pipeline.

Fix

Persist click IDs and referrer to first-party storage on landing, append to every Calendly URL and hidden form field, and pass the quiz answers through. Extend the pattern /demo already proves.

W5HighThe primary CTA fails contrast on 188 button instances
Evidence

A blue-to-violet gradient with white text on both primary button classes = 188 instances, measured at 2.84:1 and 3.01:1 against a 4.5:1 requirement. The same gradient fills headline text on 26 of 47 pages. Tab labels measure 1.66:1. Buttons compute to ~38px height, under the 44px target. The reduced-motion block damps rotation only, five spheres keep pulsing and smooth scroll is unguarded.

Impact

WCAG AA failure on the site's primary conversion element and on the emphasised half of most headlines. The identical gradient on the dark band measures 6.47:1, so this is one token value away from passing.

Fix

Darken the gradient stops to reach 4.76:1 / 5.20:1, it reads as the same brand. Switch gradient headline text on white to the existing deep brand token at 5.06:1. Bump button padding for a 44px target. Add a render-once guard and scroll-behavior:auto inside the reduced-motion block.

W7HighThe headline stats have no substantiation, and one label is broken
Evidence

The metrics block reads 100% / “answer rate”, 30%+ / “increase in lead capture”, 22%+ / “in total job volume”, the third label is missing the word “increase” its siblings carry. Across the 18 core pages: “average across” 0, “based on data from” 0, “n=” 0, “methodology” 0, “sample” 0, “median” 0, “results vary” 0. The three named testimonials sit in a separate band and none contains a number.

Impact

Unsourced round numbers read as marketing to an owner-operator and as a diligence flag to the PE buyer the site explicitly courts. The company owns real data and presents its headline claims in the one format that data cannot support.

Fix

Add the missing word. Merge the metrics band into the testimonial band so each number is spoken by a named person with a period attached. If 100% cannot be substantiated as an observed aggregate, reframe it as a service commitment, the honest version is stronger.

W9HighThe blog passes almost no authority into the pages that convert
Evidence

Counting only anchors inside prose: 14 editorial internal links across all 17 articles, pointing to only 3 destinations. Seven articles have zero. Zero article-to-article links. The nine franchise pages receive zero non-chrome inbound links. /integrations does not link to either of its own two integration announcements. Zero BreadcrumbList sitewide.

Impact

The blog holds all the buyer-language content and passes almost none of it forward. Link equity is spread near-perfectly evenly across 30 templated pages, so nothing signals that /pricing or /demo matters more than a ten-month-old post.

Fix

3–5 contextual links per article with varied natural anchors. Interlink the seven-article call-handling cluster. Link /integrations to its own announcements and back. Add breadcrumbs sitewide. Trim the nine franchise pages out of the global footer so they stop absorbing 46 sitewide links each.

W4HighDead indexed URLs and no real 404 page
Fix

301 /products/platform, /schedule-demo/demo, /blog/resources. Recover and republish the CX report. Ship a branded HTML 404 that preserves the 404 status and carries nav, analytics and recovery links. Add a lowercase-normalising redirect rule, and generate the sitemap from live routes so this cannot recur.

W8MediumThe logo is base64'd inline, 48% of homepage weight, and security headers are missing
Evidence

Three base64 data-URIs total 114,188 characters = 47.8% of the 238,956-byte homepage. The wordmark appears twice per page, rendered at ~41×30 CSS pixels, on all 47 pages, uncacheable. three.js loads from a CDN on 8 pages with no integrity hash, no crossorigin, no defer. The site returns only HSTS, no CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy or Permissions-Policy, while the sibling breesy-connect.com ships all five, tightly configured.

Impact

~81 KB of near-incompressible payload on every pageview for a logo that should be ~3 KB as SVG. The unpinned CDN script with no CSP behind it means a CDN compromise executes arbitrary code on the eight highest-value commercial pages. The header inversion versus the sibling is an optics problem in PE-side diligence.

Fix

Export one SVG and reference it by URL, cuts raw page weight ~45% for near-zero effort. Add integrity and crossorigin to the CDN tag today. Copy the four safe headers verbatim from the sibling's config; roll CSP report-only for a week first.

W10MediumThe entity doesn't resolve, and the name collides with three other companies
Evidence

sameAs appears 0 times in all 66 JSON-LD blocks, while the LinkedIn URL is hard-coded in every footer. 40 of 41 Organization nodes are orphans with no @id. No G2 profile; the Capterra listing states “Rated by 0 users”; no Crunchbase, no Wikidata. youtube.com/@Breesy is a New Zealand musician. A competitor sells the identical category under a homophone domain. @BreesyRestoration and @GetBreesy were verified available.

Impact

Searches for the company resolve to three unrelated businesses. Nothing machine-readable binds breesy.ai to its own LinkedIn page or its trade coverage, which is what AI assistants use to decide whether a company is real.

Fix

Add a sameAs array. LinkedIn, Capterra, future G2, Crunchbase, trade coverage, and breesy-connect.com. Replace the orphan nodes with @id references. Claim G2 and Capterra, and register the full handle set in one session before someone else does.

Fix this month12 items · conversion, content and the accessibility pass
M1HighBuild an offer ladder, 94% of CTAs ask for the same sales call
Detail

187 of 199 CTAs point at one 30-minute Calendly demo. No price, no lead magnet, no email list, and exactly one <form> on the entire site. A demo-only offer against cold traffic produces very high cost per lead. Needs at minimum one top-funnel magnet, the 30,000-job benchmark data is the obvious candidate, plus a /demo fallback when Calendly fails.

M7HighFinish the accessibility pass
Detail

Beyond W5: a keyboard-focusable phantom drawer on all 47 pages, no <main>, no skip link, ten unlabeled canvases, and broken focus order sitewide. Accessibility was clearly considered then left half-finished, a reduced-motion block exists, the canvases opt out correctly, and the WebGL loop has a pause guard. This is real ADA demand-letter surface and mostly token-level work.

M6HighEvery share renders a blank white card
Detail

Per-page OG images do not exist, so every LinkedIn and social share of an article renders blank. Article template needs share affordances. This is a prerequisite for the social workstream doing anything useful.

M8HighContent stopped 98 days ago, and LinkedIn announces things the site never mentions
Detail

17 of 17 articles have never once been updated. LinkedIn is announcing integrations and partnerships that exist nowhere on breesy.ai, so social currently has nothing to link to. Restart at 2–4 pieces/month plus a quarterly refresh cycle that actually re-stamps dateModified; refreshing existing articles that already carry schema will outperform net-new for the first two months.

M3 · M11HighSegment pages are thin below the fold, and titles use the wrong category noun
Detail

The four-segment cut (independent / multi-location / franchisor / private equity) is exactly right for this market and the top third of each page is well written, only the execution below the fold is thin. Separately, titles and H1s need a vocabulary pass to match the frozen category noun from W6.

M4 · M10HighNine franchise-brand pages and one competitor comparison need counsel before promotion
Detail

Nine indexed pages are built on third-party franchise marks, and one uses franchisee business names as testimonial bylines. A separate comparison article ranks the company against competitors while claiming an evaluation it never documents. The disclaimers are correctly drafted and appear in all nine meta descriptions, placement is the problem, not the drafting. Route both to counsel before either gets promoted or given paid distribution. This is a flag, not legal advice.

M2 · M5 · M9 · M12MediumSchema build-out, named humans, integration pages, and a landing-page template
Detail

M2: the two-block product-page schema pattern is correct but was never backfilled to the commercial pages. M5: no named authors and no leadership on /about, articles cannot carry Person authorship until you tell us who. M9: build the 5–6 integration pages. M12: general pages carry 17 header + 31 footer links and no message match, so paid clicks leak, needs a dedicated landing template plus real static assets.

Strategic8 items · several are owner decisions, not tickets
S4Gates 3Commission the founding creative library
Why it's first

There is exactly one referenced image file on the entire site. Every post graphic, thumbnail and ad creative must exist before a content calendar can run or an ad platform will accept a campaign. This gates social, paid and video simultaneously, and it is the least compressible item on the engagement, a screen recording can happen next week, job-site footage cannot. The highest-leverage single asset is a 60–90 second demo using real Breesy Voice call audio, because a buyer wants to hear the AI answer a call before booking.

S3 · S5HighThere is no master brand asset to extend from, and the order is not negotiable
Detail

No vector logo, no favicon set, no web manifest, no chosen display typeface (the display and body tokens are the identical stack), no usage rules, and an off-palette blue driving the booking flow on all 47 pages. Connect's brand work cannot begin until this is done, because an endorsed-brand system needs a parent identity to endorse from. Recommended architecture: endorsed brand. Starting the sibling first guarantees rework.

S8CriticalNo third-party review corpus, long lead time
Detail

No G2 profile and a zero-review Capterra listing. For B2B SaaS, review sites are the dominant citation source when an AI assistant is asked to recommend software in a category, and competitors already populate the Property Restoration category. Reviews cannot be manufactured quickly, which is why this starts now rather than later.

S1 · S2 · S6 · S7HighFour owner decisions: price, data, the phone question, and product naming
Detail

S1: publish a price anchor. /pricing currently has none, which also blocks Offer schema. S2: make the 30,000-job dataset a named, recurring brand asset, it is the strongest content asset available and no competitor can replicate it, but publishing needs written permission. S6: decide the phone question publicly. Voice answers calls for contractors while Connect removes them for homeowners, and neither site says so. S7: six products with non-obvious names and no clear primary reads as feature sprawl.

Credit where due

What makes this engagement cheaper than it looks

For the engagement

What each workstream actually weighs

Six workstreams across two properties. Splits are the share of each workstream expected to sit on breesy.ai, based on 47 URLs, 6 products, 4 segments, 9 franchise pages and 17 articles here versus a small consumer intake property on the sibling.

SEO75 / 25

Not a rebuild, a build-out. The technical foundation is sound, so this is schema completion, internal linking, entity resolution, the franchise-page decision and a content restart. The AEO/GEO half is where the largest upside sits: the site already ranks #1 for at least one target commercial query and contributes nothing extractable when it gets there.

Needs first Search Console access, plus owner decisions on the franchise pages and price disclosure. Otherwise unblocked, this can start day one.

UI / UX60 / 40

Accessibility remediation is the non-negotiable core, then the conversion layer, then performance. Component-level work on a shared design system, so a single fix propagates across all 47 pages, high leverage per hour.

Settle at kickoff Repository access and a deploy path. Every fix here is a source-code change. Without repo access this workstream becomes a spec-writing exercise handed to a developer, which roughly doubles its cost and halves its speed.

Social80 / 20

Effectively a founding build. One channel exists. LinkedIn at 272 followers, and it is the only social URL in the entire codebase. Needs handle claiming across five platforms in one session, a real cadence, founder-led posting, and YouTube as the second channel.

Three hard prerequisites The creative library. A credential inventory from you. And the content-to-site fix. LinkedIn currently announces things that exist nowhere on the site, so social amplifies into a dead end.

Brand70 / 30

Nominally 70/30, but the sequencing matters more than the split. There is no master asset to extend from, no vector logo, no display typeface, no usage rules.

Order is fixed Connect's 30% cannot begin until the parent's 70% is done. Do not let sibling brand work start before breesy.ai has a vector logo and a display typeface.

Paid ads65 / 35

Fully blocked today, with the longest dependency chain on the engagement: tagging → click-ID capture → an offer ladder → landing pages → creative → consent mode → ad account inventory.

Month 2 at the earliest And note the sibling has zero analytics, not even GA4, so proportionally its measurement build is larger than this one despite being a smaller site. Budget tagging across both properties. The binding constraint is creative, not tagging.

Content / video85 / 15

The most lopsided workstream. Restart publishing, backfill the missing announcements, build category hubs and integration pages, and stand up video from zero.

Needs first Named humans for bylines, written permission to publish the 30,000-job data, customer participation and franchise consent for video, counsel sign-off on the comparison article, and the creative library.

Three items sit on the critical path for multiple workstreams and should be scheduled first regardless of which workstream nominally owns them. Tagging gates paid entirely and makes everything else measurable. Creative production gates social, paid and video simultaneously, longest lead time, least compressible. Repo access gates every UI/UX fix and most SEO fixes; without it, half this list converts from execution into specification.

Before scoping

What only you can answer

01
Access

Do we get repository access and a deploy path, or does everything route through your developer? This changes the cost and timeline of roughly half the list.

02
Ad accounts

Which already exist. Google Ads, Meta Business Manager, LinkedIn Campaign Manager, and who owns them?

03
Handles

Do you control youtube.com/@BreesyAI? It carries a branded avatar and the title “Breesy AI” but was created in 2007 with one video. If it is not yours, @BreesyRestoration and @GetBreesy are available today, claim them this week regardless.

04
Data rights

Can the 30,000-job dataset be published? It is the strongest content asset available and needs written confirmation.

05
People

Who are the named authors, and who appears on /about? Articles cannot carry author schema until this is answered.

06
Customers

Will Bowen, Panster and LaPointe appear on video? The relationships exist, but video needs scheduling and franchise-brand consent.

07
Price

Will you publish a price anchor? This determines whether /pricing can carry Offer schema and changes the entire paid strategy.

Next
The Connect audit
33 verified findings on the consumer property, prioritized into a build order.
All documents
Bednight Stories · breesy.ai assessment Every claim verified against the live site