Headline numbers
- 3,175 URLs crawled: 2,859 answered 200, 315 answered 404, 1 looped through more than ten redirects
- 293 of the 315 missing pages were found through the sitemap, not a link; the sitemap lists 2,721 URLs
- 1,024 indexable pages have no internal link pointing at them, 323 of them coupon pages
- 202 crawled URLs redirect; 181 take two or more hops and 179 of those start with a trailing-slash hop before a second move
- 489 pages share a title with another page; 325 are coupons titled with the venue name, nine of them "The Lido Restaurant"
- 1,918 of 2,600 HTML pages have no H1 and 253 have more than one
- 2,253 of 2,600 meta descriptions run past 160 characters; 13 pages have none
- 95,474 image references, 1,349 without alt text on 168 pages, 166 of them under /blog/
- 24 pages took over 3 seconds to respond, the slowest 14.3 seconds
Visit Bristol is the city's official tourism site, run by a destination marketing organisation and fed by a listings database: every attraction, hotel, restaurant, event and offer is a record that becomes a page. That is a common shape for tourism, property and directory sites, and it produces a particular set of crawl problems that have nothing to do with the writing. We crawled it on 29 October 2026 at the pace its robots.txt asked for, two seconds between requests, one at a time, which is why the crawl took 108 minutes for 3,175 URLs. This one is close to the whole site: the crawler stopped at link depth 5 with six URLs left over, so the numbers below are not a sample.
The crawl
3,175 URLs fetched. 2,859 answered 200, 315 answered 404 and one URL (a Go Ape listing) sent the crawler round more than ten redirects before it gave up. The sitemap lists 2,721 URLs, 71 of the crawled URLs were RSS feeds, and 301 pages carry noindex. No server errors and no timeouts, though 24 pages took longer than three seconds to answer.
Five things the visitbristol.co.uk technical SEO audit noticed
1. 315 pages not found, and the sitemap sent us to most of them
What it is: 315 URLs answered 404. 226 are venue listings and 74 are events, which is what expired records look like on a database-driven site: the business closed or the event passed, the page was removed, and the record kept its place in the feeds. The crawler reached 22 of them by following a link from another page. The other 293 it found only because the sitemap listed them. Why it matters: a sitemap is a site's own statement of which pages to index, so every dead URL in it is a wasted request and a small signal that the file is not maintained. Fix: regenerate the sitemap from live records only, and return 410 Gone for events that have passed. The HTTP status issue page and broken link checker cover the single-URL version of this check.
2. 1,024 pages that nothing links to
What it is: 1,024 indexable pages received zero internal links from any other crawled page. They were found through the sitemap. 323 are coupon pages, 99 are listings and most of the rest are events. Why it matters: a page with no inbound links gets no internal ranking signal and is only as discoverable as the sitemap makes it, so a coupon or an event can sit indexed and unseen. Because the crawl reached nearly every URL on the site, the usual caveat (links from pages we did not crawl) is small here. Fix: a "current offers" block on each venue listing, and event pages linked from the venue that hosts them. The orphan page checker runs this check against a sitemap for one site.
3. Redirect chains that all start the same way
What it is: 202 crawled URLs redirect and 181 of them take two or more hops. 179 of the 181 begin with the same hop: the URL without a trailing slash 301s to the URL with one, which then 301s to the page's new home under /listing/ or /plan-your-visit/. 34 chains run to three hops or more, and 345 pages still link to a redirecting URL. One chain, the visitor survey linked from the home page, leaves the site through a bit.ly short link to a SurveyMonkey form. Why it matters: every hop is a round trip for the visitor and a spent request for the crawler, and search engines follow only a few. Fix: one rule that redirects the old path straight to the final URL, slash or no slash, then update the 345 internal links. The redirect checker shows the hop list for any single URL.
4. 325 coupon pages titled like the venue, and 1,918 pages with no H1
What it is: 489 pages share their title with at least one other page. 325 of them are coupon pages, each titled with the venue's name, so "The Lido Restaurant" is the title of nine pages: eight offers and the listing itself. The other 164 are listing-shell pairs such as a blog category and the tag page that mirrors it. Separately, 1,918 of the 2,600 HTML pages have no H1 at all (listings, events and coupons share the template) and 253 have more than one. Why it matters: Google picks one page per title and suppresses the rest, so the offers compete with the listing they are meant to promote; and a page with no H1 leaves the crawler and the reader to infer what it is about. Fix: title coupons as "[Offer] at [Venue]" and put the venue name in the H1 of every record template. The title tag checker runs the title check on one URL.
5. One arrow icon without alt text, 1,349 times
What it is: the crawled pages reference 95,474 images, 34 per page on average and 200 on the busiest. 1,349 of those references have no alt attribute, spread over 168 pages, and 166 of the 168 are under /blog/. The evidence names the culprit: an arrow icon (arrow_right_black.svg) that appears ten times on every blog listing page with no alt or an empty alt. Why it matters: a decorative icon should carry alt="" so screen readers skip it; with no attribute at all it is read out as the file name. One template edit clears 1,349 findings. The image alt text checker runs the same check on a single page.
Also seen and left alone: 2,253 of 2,600 meta descriptions over 160 characters (the listing summary is pasted into the tag whole) and 13 pages with none; 116 pages sharing a meta description; 273 titles over 60 characters; 1,975 near-duplicate pairs, mostly empty search-result and category shells that are 89% the same page; 261 pages under 200 words; and no Content-Security-Policy or X-Frame-Options header on any page.
What we'd fix first
- Rebuild the sitemap from live records so the 293 dead URLs drop out, and return 410 for past events rather than 404.
- Replace the two-hop redirect pattern with one rule to the final URL and update the 345 internal links that still point at old paths, starting with the home page's visitor survey link.
- Retitle the 325 coupon pages as "[Offer] at [Venue]", add the venue name as the H1 on the record templates, and give the blog's arrow icon an empty alt.
Three template changes and one feed rebuild. On a database-driven site almost every finding is a template, which is why 23,143 findings here is a shorter to-do list than it sounds.