Picture this: you're running a routine Screaming Frog crawl for a client site audit. Everything looks normal until you spot a pattern that makes you pause. Hundreds of URLs like /categories/=59487a4cd1758e7669102174 are showing up in your crawl data. They're blocked by robots.txt, yet they still have active inlinks pointing to them from across the site.
Your first instinct might be panic. Are these link equity leaks? Is crawl budget being wasted on junk pages? Is something broken in the site's internal linking structure?
Take a breath. We've seen this exact scenario trip up smart auditors more times than we can count, and it's almost always a false alarm. It happens because of how content management systems (CMS) work under the hood, not because something is broken on the site.
These auto-generated URLs are a normal byproduct of how modern CMS platforms manage database records behind editable slugs. Every page you edit, every category you rename, and every product you update has a permanent internal identifier that never changes, even when the visible URL does.
Here's the good news: Google has confirmed these links carry zero ranking impact. But that doesn't mean you should ignore them in your reporting. You still need to know how to filter this noise out so real issues don't get buried under thousands of harmless system artifacts.
This post gets into why these URLs exist, how different CMS platforms handle them, and how to clean up your audits so you're reporting on what actually matters.
- Why CMS Platforms Inject Database IDs Into Your URLs
- How Different CMS Platforms Handle Internal Database Identifiers
- Cleaning Up Audit Reports and Protecting SEO During CMS Migrations
Why CMS Platforms Inject Database IDs Into Your URLs
To understand why these odd URL strings show up, we need to look at how a CMS stores and organizes content behind the scenes.
The Screaming Frog Discovery That Sparked the Question
This exact scenario played out on Reddit, where a technical SEO shared audit findings after noticing strange URL patterns on a Squarespace site. The URLs followed a format like /categories/=[long alphanumeric hash], and they were showing up as blocked by robots.txt in the crawl report.
What made this stand out was that these URLs still appeared to have active inlinks in the raw HTML. To someone running a link equity audit, that looks like a red flag. If a page is receiving internal links but is blocked from crawling, doesn't that waste potential ranking power? Shouldn't those links point somewhere crawlable instead?
The thread picked up traction fast, with other SEOs chiming in with similar findings across different platforms. Some had seen the same pattern on WordPress sites. Others had spotted it on Shopify stores. The common thread was confusion about whether this was hurting site performance in search results.
John Mueller's Verdict: No Ranking or Crawl Budget Impact
When a question like this gets enough attention, it eventually lands in front of someone at Google who can clear things up. That's what happened here. John Mueller weighed in with a direct answer: these URLs don't affect crawl budget, and they don't dilute or waste link equity.
The technical reason is fairly simple. Google doesn't crawl pages blocked by robots.txt. If Googlebot can't crawl a URL, it also can't pass PageRank or link authority through it in any way that affects the destination page's ranking signals. The link might sit in the raw HTML, but since the target URL is fenced off by robots.txt, it acts more like a dead end in the crawl graph than a leak.
That means the structural authority of your site stays right where it should, on your user-facing pages. The internal links pointing to these hashed URLs are just artifacts of how the CMS builds its navigation and internal architecture. They're not siphoning ranking power away from your real content.
For auditors, that's a relief. You don't need to burn hours trying to "fix" these links or worry they're quietly hurting a client's rankings. They're cosmetic noise in a crawl report, nothing more.
Database Normalization: How Slugs Stay Editable Without Breaking Links
So why does the CMS create these hashed identifiers in the first place? It comes down to a database design principle called normalization.
Every piece of content on your site, whether it's a blog post, a product, or a category page, gets stored as a record in a database. That record needs a permanent way to be identified so the system can find it, update it, and link it to other records like tags, categories, or related products.
If the CMS relied only on the human-readable slug (the editable part of the URL, like /blog/best-running-shoes) to identify that record, you'd run into trouble fast. The moment someone renames the slug to /blog/top-running-shoes-2026, every internal reference to the old slug would break unless the system manually updated every link across the site.
Instead, CMS platforms assign a permanent database ID, often a long hash or numeric string, that never changes no matter how many times you edit the title or slug. Internal systems, like the category filtering tool or the related-posts widget, reference this permanent ID behind the scenes. The human-readable slug is just a friendly wrapper shown to visitors and search engines.
This is why these raw IDs sometimes surface in navigation menus, filter systems, or category groupings, especially when a platform hasn't fully hidden them from the rendered HTML. It's not a bug. It's the database doing exactly what it's meant to do: keep internal relationships stable while giving editors freedom to change URLs without breaking anything.
How Different CMS Platforms Handle Internal Database Identifiers
The Reddit thread centered on Squarespace, but this is far from a platform-specific quirk. Nearly every major CMS and ecommerce platform uses some version of this identifier system. Once you recognize the pattern, you'll spot it on almost any client site you audit.
Squarespace, WordPress, Shopify, and Wix Compared
Each platform handles internal IDs a little differently, but the underlying logic is the same.
WordPress
WordPress exposes its internal identifiers in several visible places. Every post and page has a post_id, and every category or tag has a term_id. You can often see these values in the block editor's metadata panel, in REST API endpoints (like /wp-json/wp/v2/posts/123), and even in the body class attribute of the rendered HTML, which might include something like postid-123 or category-45. None of this is hidden or accidental. WordPress developers rely on it constantly for theme and plugin work.
Shopify
Shopify uses a similar hash-based routing system for products and collections. Behind every product URL sits a unique product ID and variant ID that Shopify's system uses to manage inventory, pricing, and checkout logic. These IDs sometimes turn up in liquid template code or in tracking parameters appended during the shopping flow.
Wix
As for Wix, it follows a comparable pattern, particularly with its dynamic pages and collection-based content. Long alphanumeric strings often appear in the backend data structure for repeater items and dynamic list pages, even when the visible URL looks clean.
Squarespace
As mentioned in the Reddit example, Squarespace uses these hashed IDs specifically in its category and tag filtering system. When you create a new category, the platform generates a permanent ID that the filtering system references internally, even as the display name and slug stay fully editable.
If you're auditing sites across multiple platforms, expect to run into this pattern again and again. It's a basic characteristic of how modern CMS databases are built, not a fluke tied to one product.
Using "?format=json-pretty" to Inspect Raw System Data
If you want to see this system-level data in action on a Squarespace site, there's a simple trick. Add ?format=json-pretty to the end of a Squarespace URL and you'll get the raw JSON structure that powers the rendered page.
That JSON output shows the actual data nodes the CMS is working with, including the permanent IDs assigned to categories, tags, and content blocks. It's a good way to confirm these hashed strings are exactly what they appear to be: structural values used for internal organization, not secret pages meant to be indexed.
This kind of inspection comes in handy during audits when a client asks why these strange URLs exist. Instead of a vague answer, you can pull up the raw system data and show them how the platform organizes content behind the scenes.
Other platforms offer similar views. WordPress has its REST API, which you can query directly in a browser. Shopify has various theme debugging tools. Getting comfortable poking at this raw data helps you diagnose issues faster and speak with more confidence when explaining technical quirks to clients.
How Googlebot's Rendering Service Processes These Links
Here's the part that should put any remaining worry to rest. Google's Web Rendering Service renders pages much like a browser would, and in doing so it flattens a lot of the structural noise that doesn't matter for indexing.
When Googlebot runs into these internal ID-based URLs, a couple of things happen. First, if the URL is blocked by robots.txt, Google respects that and doesn't crawl or render the page at all. Second, even when such URLs aren't blocked, Google's systems tend to recognize low-value, system-generated URLs and push them down the crawl queue in favor of more valuable content pages.
You can check exactly how Google treats a specific URL using the URL Inspection Tool in Google Search Console. Run one of these hashed URLs through it, and you'll usually see it's excluded from the index, often with a note explaining it's blocked by robots.txt or flagged as duplicate or low-value.
That gives you a concrete way to check Mueller's statement instead of just taking it on faith. If a client wants proof, running a handful of these URLs through the inspection tool and pointing at the "excluded" status is a quick way to close the conversation.
Cleaning Up Audit Reports and Protecting SEO During CMS Migrations
Knowing these URLs are harmless is one thing. Keeping them from cluttering your audit reports is another. Let's look at how to configure your tools properly, then shift to where CMS-related SEO risk actually lives: migrations, plugin bloat, and template-level mistakes that quietly tank your rankings while everyone's busy worrying about query strings.
Screaming Frog Regex Exclusions for Injected URLs
If you're running Screaming Frog and these WordPress or Elementor-style parameters keep showing up in your crawl, the fix is a simple regex exclusion. Go to Configuration > Exclude and add patterns that match the junk without touching real URLs.
A few patterns worth adding:
.*\?p=[0-9]+.*
.*\?elementor.*
.*\?fbclid=.*
.*\?ver=[0-9.]+.*
Test each pattern against a handful of live URLs before you run the full crawl — regex exclusions are easy to get wrong, and an overly broad pattern can accidentally exclude pages you actually need to audit. Screaming Frog has a built-in test feature in the exclude configuration window; use it every time.
If you manage multiple client sites with different CMS setups, save these exclusion lists as a preset configuration file. That way you're not rebuilding your regex from scratch every time you start a new crawl.
Managing Query Parameter for Cleaner Client Reports
Crawl exclusions solve the problem on your end, but query parameters can still leak into Google Search Console, Google Analytics, and log file reports — which means they can still leak into what your clients see.
A few practical steps:
- In GSC: Use the URL parameter tool (where available) or filter query strings out of your Coverage and Performance reports before exporting.
- In GA4: Set up a filter or use path-based regex in your exploration reports to strip query strings, so
/blog-post/and/blog-post/?ver=123aren't reported as two different pages. - In your report templates: Add a short note explaining that parameterized URLs are expected CMS behavior, not indexing errors. This preempts the "why are there 200 duplicate URLs" question before it's even asked.
The goal isn't to hide data — it's to present it in a way that reflects what's actually happening on the site, rather than what a raw export makes it look like.
The Real SEO Risks During CMS Migrations
Here's the part that deserves more attention than query strings ever will: most SEO damage from a CMS doesn't come from injected parameters — it comes from what happens during and after a migration.
A few of the usual culprits:
- Broken or missing redirects. Moving from one CMS to another (or even one theme to another) often changes URL structures. Without a complete redirect map, you lose link equity and rankings on every URL that isn't mapped.
- Plugin bloat. Each new plugin adds scripts, styles, and sometimes its own query parameters or crawlable endpoints. Left unchecked, this slows down page speed and adds crawl bloat that has nothing to do with real content.
- Template-level canonical mistakes. A single bad canonical tag baked into a theme template can propagate across thousands of pages before anyone notices — often invisible until a rankings drop forces a technical audit.
- Lost structured data. Migrations frequently strip out schema markup that isn't part of the new theme's default templates, quietly killing rich results that took months to earn.
None of these show up as a scary query string in your crawl report. They show up weeks later as a traffic graph that's quietly sloping downward. If you're going through a CMS or platform migration, budget real time for a pre-launch and post-launch technical audit — that's where the actual risk lives, not in a ?p=123 URL sitting harmlessly in your crawl data.







