SEO Audit 4 June 2026

Island Expeditions

islandexpeditions.com
Dangriga, Belize & Canada
Drupal on Pantheon
Belize adventure tour operator, since 1987
481-post blog, 45 trip pages
54
out of 100
Grade C

Audit Summary

Island Expeditions has been running active travel and tours in Belize since 1987, and the content and authority foundations are genuinely strong. Trip pages run 2,000–2,800 words with full day-by-day itineraries and real pricing — deeper than the OTA listings they compete with. A 481-post blog covers snorkelling, kayaking, Maya ruins and Garifuna culture first-hand, and the brand carries real earned media (National Geographic, Outside, Lonely Planet, Globe and Mail). Infrastructure is sound: HTTP/2, ~65ms server response, correct homepage canonical, and all redirect paths resolving cleanly.

What is missing is the structured-data, freshness and technical-hygiene layer that Google and AI engines now use to identify and rank a tour operator. The XML sitemap broadcasts every one of its 829 URLs on the wrong domain (the Pantheon staging host, over http). There is zero structured data anywhere on the site. The 481-post blog has no author bylines, no publish dates, and section headings rendered as plain paragraphs. The result is a site that is doing the hard part — the content — while leaking the easy wins.

Most of the highest-impact fixes are config and template changes, not content work. A single day of work lifts the score by roughly twelve points; a focused month takes it from 54 to approximately 88.

Technical SEO72
Weight: 22%
Content Quality & E-E-A-T61
Weight: 23%
On-Page SEO (SXO)52
Weight: 20%
Schema / Structured Data3
Weight: 10%
Performance (CWV, lab)58
Weight: 10%
AI Search Readiness58
Weight: 10%
Images & Visual40
Weight: 5%
Sitemap & Architecture38
Supporting · rolls into Technical
Local SEO38
Supporting dimension
Content Architecture38
Supporting dimension
Backlinks / Authority~60
Indicative · free data only
Sitemap URLs on wrong domain
829 / 829
all on pantheonsite.io, http
JSON-LD schema blocks
0
across every page audited
Blog posts
481
no bylines, no dates
Server response (TTFB)
~65ms
cache hit, gzip on
Operating since
1987
unused authority signal
Specialist agents run
11
parallel, curl-verified
E-E-A-T Assessment
Experience, Expertise, Authoritativeness, Trustworthiness. Combined ~62/100.
Experience78 / 100

The strongest dimension. Trip pages carry genuine first-hand operator detail — day-by-day itineraries, real pricing and durations, original photography. The 481-post blog is written from inside Belize. This is the brand's biggest moat; it is simply not packaged in a form Google and AI engines can attribute.

Expertise52 / 100

All 481 blog posts byline to “Island Expeditions Company Limited”. No individual authors, guides, or staff bios appear anywhere. Google’s Quality Rater Guidelines require demonstrated expertise to attach to identifiable people, and AI engines will not credit claims to an unnamed entity.

Authoritativeness60 / 100

A real earned-media archive exists — National Geographic, Outside, Lonely Planet, Globe and Mail, Fodor’s, AFAR — referenced inside the blog but never declared in schema sameAs or surfaced as press credentials. The 40-year track record is under-stated rather than absent.

Trustworthiness65 / 100

No publish or modified dates appear on any post, so freshness cannot be assessed. The contact page renders a broken Google Maps error (“valid API key required”), phone format is inconsistent, and no Belize street address is published. A live “Brochure Request TEST” page is indexable.

Travel Search in 2026
Why structured data and AI surfacing now matter as much as traditional Google ranking

Current Foundations

The website loads correctly, returns valid HTTP 200 responses, ranks for its brand name, and resolves every redirect vector (http→https, non-www→www, staging→canonical) in a single hop. The homepage canonical tag is correct, the content is server-side rendered, and hosting on Pantheon delivers a ~65ms server response. Trip pages are deeper and more specific than the OTA listings they compete against. The raw materials are strong.

What Has Changed in Travel Search

Three shifts in how travellers find tour operators shape the work recommended below.

First, online travel agencies (Viator, GetYourGuide, TripAdvisor, Expedia) dominate the commercial SERPs for terms like “Belize vacation packages” and “things to do in Belize” through structured product and review data. An operator competes there on schema and trust signals, not word count. Second, AI assistants (ChatGPT, Perplexity, Google AI Overviews) now answer “best snorkelling trip in Belize” or “Belize kayaking expedition” inline, and they require machine-readable structure — TouristTrip, Organization, semantic headings, named authors, dates — before they will recommend a specific company. Third, the entity behind the brand has to be unambiguous and consistent across the web for any of this to consolidate.

The recommended work falls into two tracks that share most of their underlying effort:

•  AI & entity readiness: Organization / TravelAgency, TouristTrip + Offer, BlogPosting and BreadcrumbList schema; an llms.txt file; AggregateRating populated from live TripAdvisor data; named authors and visible dates; semantic headings on the blog.

•  Google search hygiene: a sitemap regenerated on the canonical https://www domain; removal of /node duplicates and test pages; one H1 per page; HSTS and security headers; Core Web Vitals fixes; a topic-cluster pillar structure that funnels the 481 blog posts to bookable trips.

Fixing the sitemap domain and adding the Organization schema block are the two single highest-impact items — both are configuration changes measured in hours, not content projects.

AI Search Readiness
How ChatGPT, Perplexity and Google AI Overviews see the site today. Score 58/100.

The short version

The content is genuinely AI-citable — blog posts open with textbook 40–60-word direct answers ("April enjoys highs of 85°F/29°C and evening lows of 76°F/24°C"), and the brand entity is stated unambiguously ("Belize adventure travel operator since 1987"). But the HTML markup strips out every structural signal an AI extractor relies on — semantic headings, lists, dates, authors and structured data. AI engines can read the words but can’t isolate a clean, attributable passage or confirm the facts. This is a templating problem, not a content problem, which makes it highly recoverable. All AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended) are already allowed, so nothing is blocked — the content just isn’t served in a form they can use.

Citability12 / 25

Content is answer-shaped and direct, but section headings are plain <p> tags, so engines can’t isolate answer chunks to quote.

Structural Readability9 / 20

Trip pages have good IA (Overview / Itinerary / Dates / FAQ). Blog headings are non-semantic and the homepage carries three H1s.

Multi-Modal Content11 / 15

Strongest dimension — rich photo/video galleries, PDF itineraries, real itinerary tables. Images lack consistent alt context.

Authority & Brand14 / 20

"Since 1987" entity statement repeated; deep 481-post topical coverage. No author bylines/dates on posts; no Wikipedia/Wikidata entity.

Technical Accessibility12 / 20

Fully server-rendered (great for crawlers) and all AI bots allowed — but zero JSON-LD, the 404 serves a 30KB JS bundle, and the sitemap points to the Pantheon origin.

The biggest quick win: publish an llms.txt file

An llms.txt is a single plain-text file at the site root that gives AI assistants a curated, machine-readable summary of who the brand is, what it sells, and where the canonical pages live — so ChatGPT, Perplexity and Claude can ground an answer about “the best snorkelling trip in Belize” on the operator’s own facts in one fetch, instead of guessing from scattered third-party pages.

Right now islandexpeditions.com/llms.txt and /llms-full.txt both return 404 — and the 404 page itself serves a 30KB New Relic JavaScript bundle instead of a clean error, so a probing crawler gets noise. With a 45-trip catalog and a 481-post blog, a curated llms.txt is unusually high-leverage here. A starting template:

/llms.txt — starter template
# Island Expeditions
> Belize adventure travel operator since 1987. Small-group kayaking,
> snorkelling, stand-up paddleboarding, reef & atoll, and jungle/Maya
> expeditions, guided from Dangriga, Belize.

## About
- Founded 1987; offices in Dangriga, Belize and Canada.
- Specialises in active, small-group, guided multi-day Belize trips.
- Featured in National Geographic, Outside, Lonely Planet, Globe and Mail.

## Trips
- Double Atoll Adventure: https://www.islandexpeditions.com/...
- Belize Barrier Reef & Coral Atolls: https://www.islandexpeditions.com/...
- Rainforest, Rivers & Ruins: https://www.islandexpeditions.com/...
  # ...link the full 45-trip catalog

## Travel resources
- Belize travel blog (481 articles): https://www.islandexpeditions.com/belize-vacations-blog
- Trip planning & packing: https://www.islandexpeditions.com/clients/planning-and-packing

## Contact
- Reservations: 1-800-667-1630
- https://www.islandexpeditions.com/connect-with-us/contact-us

Pair it with fixing the 404 handler so it returns a clean error rather than the JS bundle.

Make the blog extractable: real headings and lists Critical
This is the single highest-ROI AI change. In the sampled "Top 5 Reasons to Visit Belize in April" post, the sub-section titles ("Belize Weather in the Spring", "Easter in Belize") are wrapped in <p><br/>…</p> — the only real <h2>/<h3> on the page belong to the nav and footer. Content heading count is 0, and a "Top 5" article contains 0 <ol> elements. AI engines pull answers from heading-scoped passages and marked-up lists; with neither, the fact-dense content is invisible as a citable unit.
How to fix (one template change, propagates to all 481 posts)
Update the blog body template / WYSIWYG output so section titles render as <h2>/<h3> and "Top N" content uses <ol>/<ul>. No re-writing required — the words are already there.
Add the structured data AI engines read facts from Critical
With zero JSON-LD, the price, duration, itinerary, founding date and reviews all exist as prose but not as machine-readable facts. AI assistants reliably recommend a specific operator only when those facts are confirmable in structured form. The trip pages already have the cleanest information architecture on the site (Overview / Itinerary / Dates / FAQ) — they just need the schema layer on top.
How to fix (start sitewide, then per-template)
Add Organization / TravelAgency (foundingDate 1987, address, logo, sameAs) sitewide; TouristTrip + Offer + AggregateRating on trip pages; Article (author + datePublished/dateModified) on posts; FAQPage on the FAQ. Always use the https://www.islandexpeditions.com domain in schema, never the pantheonsite.io origin.
Expose authors and dates; fix the entity signals High
No blog post exposes a visible author byline or a publish/updated date, and the only semantic authorship signal AI engines can attach is the company name. Freshness and named expertise are heavily weighted in AI citation. Separately, the entity signals are leaky: og:type uses invalid values (travel on the homepage, Belize Vacations on the blog), og:url omits the trailing slash, and the sitemap fragments the entity across the pantheonsite.io host — so citations can attribute to the wrong domain.
How to fix
Render a visible byline + published/updated date in the post template and mirror them in Article schema. Correct og:type to valid values (website / article), fix og:url, and regenerate the sitemap on the canonical https://www domain so AI crawlers attribute citations to the right entity.
Critical & High Issues
Issues blocking or significantly impacting rankings and AI visibility. Tap to expand.
The XML sitemap broadcasts every URL on the wrong domain Critical
All 829 <loc> entries in sitemap.xml (plus 1,295 image entries) point to http://live-island-expeditions.pantheonsite.io — the Pantheon platform origin, over plain http — instead of https://www.islandexpeditions.com. Verified by curl: every single URL 301-redirects to the live domain. So 100% of the sitemap is redirecting, insecure, wrong-domain URLs.

This doubles crawl cost on forced redirects, broadcasts the staging host as the canonical intent (directly contradicting the correct canonical tag on the pages themselves), splits the domain’s authority across two hosts, and wastes the otherwise-good lastmod dates. It also means earned links seeded via the sitemap leak equity to a host that isn’t even in the web graph.
How to fix (about one hour)
Set the canonical base URL in Pantheon settings.php (or the Simple XML Sitemap base-URL override) to https://www.islandexpeditions.com, regenerate, confirm every <loc> uses the canonical https://www domain, and resubmit in Google Search Console.
Zero structured data anywhere on the site Critical
Curl-confirmed: 0 JSON-LD blocks on the homepage, blog posts, trip category and detail pages, and the contact page. The only markup present is two Drupal-default typeof="foaf:Image" RDFa attributes, which carry no SEO value. This is a greenfield — every high-value type is missing.

For a tour operator the gaps that matter most are Organization / TravelAgency (brand entity, logo, sameAs, contactPoint — the foundation everything else references), TouristTrip + Offer on the 45 trip pages, BreadcrumbList on the deep URL hierarchy, BlogPosting across 481 posts, and AggregateRating from the real TripAdvisor reviews. This single category scores 3/100 and is the largest gap in the audit.
How to fix (start in hours, full rollout over a week)
Add an Organization / TravelAgency JSON-LD block to the global template today (name, logo, foundingDate 1987, Dangriga + Canada address, social sameAs). Then add TouristTrip + Offer + AggregateRating to trip pages and BlogPosting to posts once dates/authors are surfaced. Always use the https://www.islandexpeditions.com domain in schema URLs — never the pantheonsite.io origin. Ready-to-paste blocks are in the schema sub-report.
Index bloat: raw Drupal nodes and live test pages in the sitemap Critical
The sitemap advertises 52 raw /node/N URLs plus 7 /node-XXX-reviews pages. Verified: /node/501, /node/712 and /node/738 return 200, index,follow, and self-canonicalize to the ugly /node path rather than their clean alias — so each one competes with its own aliased page. The sitemap also lists test/dev stubs: /belize-vacations-blog/test, /test-contact-page, /test-brochure-request (a live “Brochure Request TEST” node), /trip-search, /vs, and /covid-test-requirements.
How to fix (a couple of hours)
Canonical every node to its alias, noindex or unpublish the test/utility nodes, and exclude /node/* and the test stubs from sitemap generation. This drops the sitemap to ~770 clean URLs and removes the duplication.
Trip pages are the wrong shape for the SERPs they target High
Island Expeditions wins the queries its pages are actually shaped for — the homepage ranks around #3 for “Belize adventure tours” and a content page #2 for “Belize kayaking trips.” But the homepage <title> leads with “Belize Travel & Vacation Packages,” a term whose SERP is ~90% OTA, airline and resort results (Expedia, Kayak, Southwest, Marriott) where the site does not appear — wasted title real estate. Meanwhile “things to do in Belize” is a 100% listicle SERP that 481 blog posts could win, and the site is absent. Trip pages also carry no page-level trust: reviews and ratings live in the global header/footer, not in the trip body.
How to fix (title in minutes; pillar over weeks)
Re-anchor the homepage title on operator intent (“Belize Adventure Tours & Kayaking Expeditions”) and demote “vacation packages” to body copy. Add 2–3 trip-specific reviews and the “since 1987” proof above the fold on each trip page. Build a “Best Things to Do in Belize” pillar that links down to bookable trips.
19MB autoplay hero with no poster, and mobile horizontal scroll High
The desktop above-the-fold is a 19.4MB autoplaying hero video with no poster — the fold sits dark until it buffers, and the real H1 (“Belize Adventure Experts Since 1987”) renders at y=1120px, below the fold. Separately, the homepage has a +140px horizontal-scroll overflow on mobile, caused by an unstyled 500px fixed-width form table with an embedded reCAPTCHA — a Google mobile-usability “content wider than screen” defect. Image hygiene compounds it: 34 images, 0 lazy-loaded, 13 missing width/height (layout shift), no srcset, no WebP.
How to fix (quick wins in minutes each)
Add a poster to the hero video (reuse the existing hero JPG) and overlay the H1 + value prop on the desktop hero. Add one CSS rule (table{width:100%} + max-width:100% on inputs/reCAPTCHA) to kill the mobile overflow. Enable loading="lazy" sitewide and set image dimensions.
481 blog posts with no author, no date, and non-semantic headings High
The blog is the brand’s largest content asset and its biggest wasted opportunity. Every post bylines to the company (no named authors), none expose a publish or modified date, and section headings are rendered as plain <p> tags rather than <h2>/<h3> — with “Top N” posts using no <ol> lists. The substance is genuinely citation-grade (direct answer openers, specific stats like “April highs 85°F/29°C”), but the HTML strips out exactly the structural signals Google freshness ranking and AI extractors rely on.
How to fix (template change, one pass over the blog)
Surface the Drupal publish/modified dates and add named staff bylines in the template (this also unblocks BlogPosting schema). Convert section headings to <h2>/<h3> and “Top N” bodies to <ol> — the single biggest AI-citability lift available.
Local signals wasted: no Belize NAP, broken map, unused TripAdvisor equity High
For a destination operator, local value is in entity clarity and review prominence rather than map-pack proximity — and those are being left on the table. There is no Belize office address published anywhere on the site (the only address is a Canadian PO Box), the /contact page renders the public Google Maps error string (“a valid API key is required”), and the single TripAdvisor link is a header icon pointing to the Glover’s Reef basecamp hotel listing rather than the operator. No Viator presence, no review widget, no aggregateRating. Three overlapping contact URLs (/contact, /connect-with-us, /connect-with-us/contact-us) split the signal.
How to fix (a day, mostly content + config)
Publish a real visitable NAP (prioritise Belize), repair or remove the broken map embed, consolidate to one canonical contact page, standardise phone format with a clickable tel: link, and add an operator-level TripAdvisor/Viator review widget backed by aggregateRating schema.
481 posts, no pillar pages, widespread orphaning High
High blog volume with almost none of the structure that converts volume to rankings. There are no pillar pages; older posts have zero in-body internal links (blog→blog or blog→trip); the only trip links are global nav, not contextual. Six-plus posts split “snorkelling Belize” intent (cannibalisation), and ~31% of the blog is low-value noise — ~48 press name-drop posts, 41 dated airline announcements, duplicate -0 slugs, and a test post. The biggest clusters — Snorkelling/Reef (~96), Trip-Planning (~56), Kayak/SUP (~53, where the brand essentially owns “SUP Belize”), Maya/Jungle/Caves (~50) — are all unwired.
How to fix (phased over a month)
Build 4–5 pillar pages and wire spoke→pillar→trip internal links; consolidate cannibalising snorkelling posts into one pillar and 301 the weakest; retrofit blog→trip links into the top ~30 informational posts; noindex the press name-drop and dated-flight posts.
No HSTS or security headers; render-blocking head with duplicate reCAPTCHA High
On a lead-generation and booking site there is no Strict-Transport-Security header (nor CSP, Referrer-Policy or Permissions-Policy). Performance is dragged down by the front-end delivery: 9 render-blocking stylesheets and 8 head scripts with zero defer, the reCAPTCHA script loaded twice, Bootstrap JS in the head, zero resource hints, and a heavy third-party footprint (GTM, Facebook Pixel, CrazyEgg, New Relic, Salesforce). Estimated mobile CWV (lab): LCP ~3.5–4.5s, INP ~150–250ms, CLS ~0.15–0.25.
How to fix (half a day)
Add Strict-Transport-Security: max-age=31536000; includeSubDomains; preload. Add defer to head scripts, delete the duplicate reCAPTCHA include, move Bootstrap JS to the body end, and preload the LCP hero with fetchpriority="high" as WebP.
Action Plan
Three sprints, ordered by impact-per-effort. Tap a checkbox to mark progress.
1
Sprint 1 — One day. Config & template wins
Highest impact-per-effort. No content writing — these are settings and template changes that fix the biggest equity leaks at once.
Flip the sitemap base URL to https://www and regenerate
One Pantheon / Simple-Sitemap config change fixes all 829 broken URLs and stops the authority leak. Resubmit in GSC.
1 hrCritical impact
Add Organization / TravelAgency JSON-LD to the global template
Name, logo, foundingDate 1987, Dangriga + Canada address, social sameAs. The foundation every other schema type references.
2 hrsCritical impact
Exclude /node/* and test pages; canonical nodes to aliases
Drops the sitemap to ~770 clean URLs and removes the index bloat. Noindex the “Brochure Request TEST” node.
2 hrsHigh impact
Hero poster + lazy-load + robots.txt Sitemap line
Add a video poster, enable loading="lazy" sitewide (one theme setting), and add the missing Sitemap: directive to robots.txt.
1 hrMedium impact
2
Sprint 2 — Week one. Schema, freshness & mobile
The structured-data and trust layer that drives the largest visibility gains for a tour operator.
Surface publish dates + named author bylines across the blog
Template change. Unblocks BlogPosting schema and freshness signals on all 481 posts.
1 dayHigh impact
Add TouristTrip + Offer + AggregateRating + BreadcrumbList to trip pages
Price/duration already exist in prose; pull real TripAdvisor ratings. The most commercially relevant schema for the brand.
1–2 daysHigh impact
Re-anchor homepage title; one H1 per page; semantic blog headings
Lead the title with “Belize Adventure Tours”; demote extra H1s; convert blog <p> headings to <h2>/<h3> and Top-N to <ol>.
1 dayHigh impact
Fix mobile overflow, performance head, and add HSTS
CSS rule to kill the +140px scroll; defer scripts + dedupe reCAPTCHA + preload hero; add HSTS and security headers.
1 dayMedium impact
3
Sprint 3 — Month one. Architecture & depth
Turns a strong but unwired content library into a ranking system, and tidies the long tail.
Build 4–5 topic-cluster pillars + wire internal links
Snorkelling, Kayak/SUP, Trip-Planning, Maya/Jungle, and a “Things to Do in Belize” pillar — each funnelling spoke posts to bookable trips.
2–3 wksHigh impact
Local fixes + unique meta descriptions
Publish Belize NAP, repair the map, consolidate contact URLs; write unique meta descriptions for the 45 trip pages and the blog.
3–4 daysMedium impact
Consolidate thin content; image hygiene; publish llms.txt
Merge the 98 duplicate essential-info guides to 4–6 pages; WebP + srcset + dimensions sitewide; ship a clean /llms.txt and fix the 404 page.
3–4 daysMedium impact
Reclaim earned-media links; clean the blog long tail
Email Outside / Lonely Planet / Globe and Mail to confirm and repoint links; noindex the press name-drop and dated-flight posts.
OngoingCompounding
Today
54
Grade C
After Sprint 1
66
+12
After Sprint 2
78
+24
After Sprint 3
88
+34

Summary

Island Expeditions has spent nearly four decades building exactly what modern travel search rewards: deep first-hand trip content, a 481-post library, real press authority, and competent hosting. The fundamentals are intact. What is missing is the machine-readable layer — structured data, a correct sitemap, named authors, visible dates, semantic headings — that Google and AI engines now use to identify and rank a tour operator.

Because the content already exists, this is a packaging problem, not a writing one — which makes the score unusually recoverable. Sprint 1 alone, a single day of configuration and template work, lifts the score by roughly twelve points. Sprint 2 adds the schema and freshness that drive the largest visibility gains. By the end of Sprint 3 the site is in genuine shape to compete with the OTAs for high-intent Belize travel searches it currently cedes.