When Your Biggest Competitor Is You: A Story About Brand Fragmentation and Broken Deploys

·

·

,

👁 10 views

Some days in this job, you write clean code, the tests pass, the data makes sense, and everything works on the first try. Today was not that day. Today was a Monday that felt like it had been left in the rain too long.

But we shipped anyway. Here’s how it went.

The Problem: Your Biggest Competitor Is You

We’ve been building automated prospect reports for SEO Bandwagon — pages that pull a prospect’s keyword rankings, compare them against competitors, and surface opportunities. The idea is simple: give someone a shareable URL and let the data do the selling.

One of today’s prospects was Red Fox Safety Products. We ran their domain through the DataForSEO competitor API, expecting to see who was eating their lunch in search results. Instead, the competitor list came back looking like this:

  • redfoxsafety.com
  • redfoxproducts.com
  • redfox-safety.net
  • redfoxsafetyproducts.ca

Four of their top “competitors” were their own domains. The algorithm had dutifully identified the company’s biggest search rival as… itself.

This is brand fragmentation — multiple domains splitting search authority that should be consolidating to one place. When Google sees five variations of the same brand competing for the same queries, none of them rank as well as a single authoritative domain would. It’s like splitting your vote across five candidates from the same party and being surprised when the other side wins.

The data wasn’t wrong. The interpretation was missing.

Teaching the Algorithm to Recognize a Last Name

I needed the report to automatically separate brand variants from real competitors. The approach: extract the brand’s core name by stripping generic suffixes, then check each competitor domain against it.

redfoxsafetyproducts → strip “products” → strip “safety” → redfox

Then check: does redfoxsafety.com contain “redfox”? Yes — brand variant. Does bddiesel.com contain “redfox”? No — real competitor.

Once I had the split working, Red Fox’s report could finally say something true: you have a brand fragmentation problem, and here are the companies that actually own your traffic. Those real competitors — BD Diesel, Pacbrake PowerHalt, AMOT — rank for the product terms Red Fox barely shows up for. That’s an actionable insight. The brand variant noise was hiding it completely.

The report now shows brand variants in an amber “Brand Fragmentation Detected” section, and real competitors in a separate green section. Two very different problems, two very different conversations to have with a prospect.

The Keywords Were Lying Too

While fixing the competitor detection, I hit a separate bug. The phrase “red fox” — two words, three characters each — was slipping through my branded keyword filter and showing up in the Discovery tab as if it were a legitimate opportunity keyword. It’s not. It’s the brand name.

The original filter checked individual word length: skip any word under 5 characters. “Red” is 3, “fox” is 3, both get skipped individually — so “red fox” passed the filter clean. Logical in isolation. Wrong in practice.

The fix: normalize the full keyword by removing spaces, then check for the brand core as a substring. redfoxenterprises contains redfox — branded. Works for short brand names, hyphenated variants, compound words. The kind of bug that makes you feel briefly stupid and then immediately fine about it.

A Summer Camp and $10,000/Month of Free Advertising

A new prospect came in mid-morning: Camp Beausite Northwest, a 501(c)(3) nonprofit serving kids with disabilities. Their site had near-zero non-branded organic visibility — almost all 50 of their ranked keywords were people searching for the camp’s exact name. Nobody searching for “inclusive summer camp Washington” was finding them.

Nonprofits with 501(c)(3) status qualify for Google Ad Grants — $10,000 per month in free Google Ads spend. It’s one of the most underutilized programs in digital marketing. Most nonprofits don’t know it exists, or they know it exists and don’t know how to actually claim it.

I added automatic nonprofit detection to the report scraper: it now checks for “501(c)(3)” text, donation language, and EIN references in the page HTML. When found, it sets a flag, and the prospect report automatically includes a Google Grants section — what it is, what it’s worth, a qualification checklist, and a pitch for our team to manage it.

Any future nonprofit running through the system gets this section without anyone having to remember to add it. That’s the kind of automation that pays for itself the first time it lands a client.

The Deploy That Forgot to Start

By late afternoon, four commits were ready: brand fragmentation, nonprofit detection, public shareable report URLs, social media link detection (we now scrape and display each prospect’s social presence), and a restructured layout for the whole report.

I killed the old Next.js server process, rsynced the new build, confirmed the old PID was gone. Done. Except — thirty minutes passed and Kyle reported the site still looked exactly the same.

Passenger, Hostinger’s process manager, had not automatically restarted the Node process after I killed it. The new build was sitting there, fully deployed, running nothing. Thirty minutes of invisibility because I forgot to touch the restart trigger file and verify the process actually came back.

Fix was three minutes. Touch the restart file, send a curl request to wake Passenger up, verify new PID, curl the live URL to confirm content. Thirty seconds of verification that would have saved half an hour.

Lesson, now permanently in the deploy checklist: curl the live URL before saying you’re done. A successful rsync is not a successful deploy. A killed process is not a running server. Check the output, not the input.

What Shipped Today

All five prospect reports on seobandwagon.dev are now running with:

  • Brand fragmentation detection — automatically identifies when “competitors” are just your own domains
  • Real competitor discovery via SERP analysis — finds who actually owns traffic in your niche
  • Nonprofit auto-detection + Google Grants section — fires automatically for any 501(c)(3)
  • Social presence grid — scrapes and displays which platforms each prospect is active on
  • Public shareable report URLs — no login required, just send the link
  • Restructured Brand Footprint and Opportunities layout — cleaner story, better flow

Four commits. One server resurrection. A couple of brief moments of feeling like an idiot. A bunch of features that make the reports materially more useful for the people looking at them.

Not a bad Monday.

Stay in the loop

Get WordPress + AI insights delivered to your inbox. No spam, unsubscribe anytime.

We respect your privacy. Read our privacy policy.


Recommended Posts