All Articles

Your General Contractor's Job-Site Photos Are Beautiful — And Completely Invisible to Google

A general contractor in Redondo Beach sends us his portfolio before we ever start a project together. Forty photos. Full kitchen gutted to studs, custom walnut cabinetry, a waterfall quartz island shot in good light with a wide lens. Genuinely better work than 80% of what ranks in Google Images for "kitchen remodel Redondo Beach." He types that exact phrase into Google. His photos don't show up. Page one, page three, page ten — nothing. A competitor with three grainy iPhone photos, one of them slightly blurry, sits in the top row of the image carousel.

The instinct is to blame the algorithm, or assume Google just prefers the other guy because of some review-count advantage. Neither is true. Google's image index doesn't grade craftsmanship. It can't. What it grades is the code wrapped around the photo — and on that GC's site, there was almost none.

The Photo Isn't the Product — The Metadata Around It Is

Here's what was actually happening on that site, and it's the same pattern on probably 70% of contractor sites in the South Bay: forty images uploaded through a WordPress gallery plugin, every file still named IMG_4821.HEIC or Photo-2024-11-03.jpg. Zero alt text. The gallery loaded through client-side JavaScript that fired after scroll, which means Googlebot's initial crawl never saw the images at all — it saw an empty div waiting for user interaction. The images themselves were hosted through the gallery plugin's own CDN, which had a robots.txt rule blocking crawlers by default. And every photo sat with zero surrounding text — no caption, no paragraph nearby saying what the room was, where it was, or what was done to it.

To a human, that page is a beautiful before/after story. To a crawler, it's a blank page with some file requests that got blocked.

This isn't a niche problem. It's the default output of every portfolio built on a drag-and-drop gallery plugin, and it's why so many contractor sites on general contractor rosters look stunning to a homeowner and rank nowhere for the searches that actually convert — "bathroom remodel Torrance," "ADU builder South Bay," "kitchen renovation before and after."

Why Pixels Alone Don't Get You Cited — By Google or by AI

The deeper mechanism matters here because it explains why this keeps happening even to contractors who've "done SEO." Google Images, and increasingly the multimodal models behind AI search — Google's AI Overviews, Perplexity, ChatGPT's browsing mode — don't primarily rank photos by analyzing pixels for quality. They can technically run object detection and rough scene classification, but that tells them "this is a kitchen." It doesn't tell them whose kitchen, where it is, when it was finished, what trade performed the work, or whether it's a real completed project versus a stock photo scraped from Pinterest. That contextual, ownable claim — "this is a 2024 kitchen remodel in Torrance completed by a licensed GC" — has to come from structured signals: the alt attribute, the filename, the caption text, the surrounding paragraph, and increasingly, schema markup that explicitly tags the image as an ImageObject with a location, a creator, and a date.

This is the same reason AI answer engines cite one contractor's project photos in a "best kitchen remodelers near me" response and ignore an objectively better one. The model isn't looking at the photo and judging the miter joints. It's pulling from whichever source gave it clean, structured, location-tagged evidence to quote. No metadata, no citation — regardless of how good the actual work was.

There's a second-order cost too. Unoptimized, unlabeled image files are almost always oversized — HEIC and PNG exports at 4-8MB apiece, forty of them on one gallery page — and that's a direct hit to Largest Contentful Paint. A slow LCP doesn't just cost you Google Images visibility; it drags your Core Web Vitals score down site-wide, which factors into your regular organic and map pack rankings too. The invisible-photos problem and the "why don't we rank in the map pack" problem are frequently the same broken foundation wearing two different symptoms.

What the Fixed Version Actually Looks Like

The architecture that solves this isn't complicated, but it has to be built deliberately — it never happens by accident inside a template.

Every image gets renamed before it touches the server: kitchen-remodel-torrance-walnut-cabinets-after.jpg, not IMG_4821. The alt text follows a formula — service, neighborhood, distinguishing detail — written as a real sentence a screen reader could use, not a keyword string: "Completed kitchen remodel in Torrance with custom walnut cabinetry and waterfall quartz island." Every before/after pair gets a real caption underneath it, two or three sentences of actual project copy: the scope, the timeline, the city. That surrounding text is what gives the image an anchor to rank against.

Underneath that, each project gets marked up with ImageObject schema — contentUrl, license, the contractor as creator, and critically, contentLocation with geo coordinates matching the service areas already declared on the Google Business Profile. That geo consistency is what lets Google connect "this photo" to "this business" to "this city" as one verified entity instead of three disconnected guesses. Images get submitted through a dedicated image sitemap in Search Console, not just left to be discovered incidentally inside the page sitemap.

On the technical delivery side, images are compressed to WebP or AVIF, held under roughly 100KB without visible quality loss, and served same-domain or through a CDN configuration that doesn't accidentally block crawlers. And the gallery itself gets built to render server-side — in a framework like Astro or Next.js, the images exist in the initial HTML response, not behind a JavaScript render that Googlebot has to wait on and might skip entirely. This is the same custom-build approach we use across every Torrance web design project, because the pattern repeats in every trade: the visual asset is only as valuable as the code infrastructure that makes it legible to a machine.

The Job Wasn't Invisible. The Proof of the Job Was.

The contractor in Redondo Beach didn't have a portfolio problem. He had a documentation problem — forty completed jobs sitting on his server as unlabeled data, indistinguishable to a crawler from stock photography or a competitor's stolen images. The work was real. The proof of the work, as far as Google and every AI model reading the web could tell, didn't exist.

That gap — between what you actually built and what the internet can verify you built — is where the next generation of local search competition is going to be won or lost, especially as more homeowners start asking ChatGPT or Google's AI Overview "who's a good contractor for X near me" instead of scrolling ten blue links. The contractors who win those citations won't necessarily have done better work. They'll have made their work legible to the systems doing the recommending.

If your project photos look better than your rank suggests, the fix isn't a new gallery plugin — it's rebuilding how those images are labeled, structured, and served. Worth a direct conversation before you shoot the next job.

Connect

Let's have a direct conversation.

No pitch deck. No discovery call theater. Just a real conversation about your practice.

Begin the conversation