// page 1 of 4
Summary and action plan
What is wrong, what to fix first, and the order of work before and after the switch.
// executive summary
Executive summary
5
Critical
25
High
37
Medium
24
Low
91 findings in total. Part F turns them into a developer action plan. Part G lists every change page by page, with the reason. Part H covers the engineering findings. Part I adds third-party search data.
About this report
The report has 9 parts (A to I):
- Part A: Legacy site, https://marketplacesuitesusvi.com/ (WordPress on WP Engine hosting, with the Yoast SEO plugin and the Lodgix booking plugin).
- Part B: New site, https://marketplace-suites-site.netlify.app/ (static HTML (fixed web pages) on Netlify, with a Netlify Function (small server code) at
/api/ldxthat returns Lodgix availability). - Part C: Migration check, which compares the 2 sites side by side.
- Part D: Method and limits.
- Part E: Content review against Google's documentation (all 91 pages, both sites).
- Part F: Action plan, the order of work for the developer.
- Part G: Change register, every change page by page.
- Part H: Engineering findings, defects in the new site's code and booking flow, with exact fixes.
- Part I: Search visibility, third-party search data for the legacy site: modelled traffic (estimated visits), rankings, backlinks (links from other sites), the Google Business Profile, a crawl (a scan of the site's pages) and AI answers.
Parts A and B are not complete on their own, because Part B cites Part A finding IDs. When a problem exists on both sites, it is sometimes listed in both parts. For example, content was copied across. Some of these items are marked "Same on new site" or "Inherited from the legacy site".
Severity key: Critical = blocks launch, loses traffic or damages trust. High = clear ranking, speed or conversion cost (the cost in bookings or form submissions). Medium = worth doing this batch. Low = clean-up. The items that block the launch are the 5 groups in Part B.1; they include some High and Medium findings, not only Critical ones.
Terms used in this report:
- Legacy site: the live WordPress site at marketplacesuitesusvi.com.
- New site: the static site on Netlify, at marketplace-suites-site.netlify.app for now.
- Rebuilt pages: the 14 new-site pages that use the new templates (home,
/suites/and the 12 suite pages). - Snapshot pages: the other 77 new-site pages. They are copies of the WordPress HTML and still load the WordPress code.
- The switch: the DNS change (the domain address settings) that moves marketplacesuitesusvi.com to the new site (also called cut-over).
- PageSpeed: Google's PageSpeed Insights lab test (mobile unless stated). LCP is how long the main content takes to appear. CLS measures layout shift, meaning how much page content moves while it loads.
- OTA: an online travel agency, such as Expedia or Hotels.com.
- CONFIRMED: reproduced in a live test. LIKELY: the evidence points this way, but one part could not be tested.
- Finding IDs: A-nn is a finding about the legacy site (Part A). N-nn is a finding about the new site (Part B). C-nn is a content finding (Part E, not Part C). H-nn is an engineering finding (Part H). G-nn is a Google guideline number from the checklist in Part E. G.1 to G.6 are the tables in Part G.
- SEO batch: the content and search work that is not code work (Part E, the Google Business Profile and OTA listings), done after the launch.
The report has four pages. The developer action plan is Part F on this page, the change register, page by page, is Part G, the engineering findings are Part H, and the third-party search data is Part I. Finding IDs link back to the evidence.
Bottom line
The new site is not ready to launch. The URL work is done well: 91 of 93 legacy sitemap URLs return 200 (page found) on the new site. Their titles and canonical tags carry over. The other 2 return 301 (permanent redirect) to /suites/. All 159 legacy page image paths still load, but 11 image files listed only in the legacy sitemap return 404 (N-7). The old short links that end in ?p=ID (on 75 of 93 legacy pages) return the home page with 200 instead of redirecting. But 5 groups of items block launch (Part B.1). Only 14 of the 91 new pages use the new templates. The tracking would report false leads (plain page loads counted as submissions). Real bookings made on the Lodgix page cannot be counted from the current evidence. And 3 legal or approval items (N-32, N-51, N-52) sit outside the code. Items 0 to 4 and steps 1 to 3 of item 5 must be done before the switch. Step 4 of item 5 is the switch, and steps 5 to 8 run after it. The biggest job is item 1 of the action plan: moving the last 77 pages onto the new templates.
91 findings: 5 Critical, 25 High, 37 Medium, 24 Low.
| Part | Critical | High | Medium | Low | Total |
|---|---|---|---|---|---|
| A: Legacy site | 2 | 4 | 11 | 8 | 25 |
| B: New site | 3 | 14 | 26 | 16 | 59 |
| E: Content | 0 | 7 | 0 | 0 | 7 |
Nine of the 25 Part A findings (A-1, A-2, A-5, A-7, A-8, A-18, A-19, A-24 and A-25) also exist on the new site, because content and tracking were copied across. Fix them on the new site. The legacy copy goes away at the switch, so only the urgent ones in item 0 are also fixed on the legacy site now.
What is at stake
1. Leads, bookings and the booking path.
- Opening
/thank-you/fires a GA4 (Google Analytics 4)form_submissionconversion, and the page is in the sitemap, so search visits and reloads fire it (A-2, N-3). - The contact form posts to /thank-you/, so the event counts real submissions and plain loads alike. The site's own form script never records a submission, because the served forms lack the
data-netlifyattribute it looks for (N-33). - The "Book now" click sends no separate date, night or total data; the dates are only inside the web address (URL) of the Lodgix link (N-6).
- Guests can lose bookings: when a stay is shorter than the minimum, all 3 room-type cards on /suites/ say "Booked" for a 4-night stay from 30 Dec 2026. Yet 7 suites are open for a 5-night stay from the same date (N-34).
- Guests go to a Lodgix booking page titled "Vacation VI - Online Booking" (N-53).
2. Legal, approval and trust items.
- Only suite 12 describes its accessible features. The ADA (US disability law) lodging rule asks hotels to describe them in enough detail for a guest to judge (N-51). Legal review needed.
- On both sites, the headline price ("$195 / night and up" on the new site) leaves out a cleaning fee, a processing fee and damage insurance. The FTC (US Federal Trade Commission) fee rule lets a business leave out only government charges, shipping charges and optional extras. It is not confirmed whether these three fees are mandatory (N-52). Legal review needed.
- The new site changed policy text. The balance on the cancellation policy page is now due 60 days before arrival, not 30. The FAQ now says housekeeping "can be arranged on request". The legacy site says it is not provided (N-32). The owner must approve.
- A link on
/marketplace/now points to chelseadrugstoreredhook.com, which redirects to kebaya4d.org (A-1, N-2). A blog post lists a wrong phone number, 1-800-627-6610 (C-1). - Tracking cookies are set before visitors agree, and the privacy policy does not name the tools in use (N-55, N-44).
3. The migration itself.
- 77 of 91 pages are snapshot pages that still load jQuery and Bootstrap (website code libraries), the Lodgix plugin and the old theme. They bring little or no speed gain. In one PageSpeed mobile run, the 77 snapshot pages score a median (the middle score) of 64 on the new site, against 67 on the legacy site. In that run, 34 of 77 score higher on the new site (N-1).
- At the switch, the 2 Netlify addresses must redirect to the real domain (N-10, N-41). The DNS records and the old short links each need a step in the switch checklist (N-48, N-49). Form delivery has its own step before that checklist (N-20).
- What already works, and where gaps remain:
- URLs, titles and canonical tags (the preferred address of a page) match on all 91 shared pages.
- Of 131 historic URLs (old page addresses from the Wayback Machine), 109 load, 11 redirect and 11 return 404. 10 of those 11 also return 404 on the legacy site.
- All 159 legacy image paths in the img src of the legacy pages load on the new site. The Search Console (Google's search data tool) verification token is the same on both sites. The legacy sitemap lists 86 image files, and 11 of them return 404 on the new site (N-7).
- Outside minimum-stay dates (N-34, H-5), the suite pages matched the availability API (the feed of Lodgix availability data) on open or booked status.
4. Search and AI visibility.
- The content was copied as it was, so its problems came too. Against Google's own documentation, 1 of 91 pages can stay as it is; 66 need work, 15 should merge and 9 should be removed or redirected (Part E).
- The main content gaps (C-2 to C-7): no blog post names an author with a bio or link (C-4), some pages have factual errors, contradictions or claims with no source. Several posts are out of date. At least 8 of 12 suite pages on the new site (suites 1, 2, 3, 4, 5, 7, 8 and 10 among them) share About text that is 96 to 100 percent similar to another suite's.
- Brand search: the official home page is the first organic (unpaid) result for "marketplace suites st john". The site is not in the top 20 for 5 hotel searches that do not name it, such as "hotels in cruz bay st john" (N-54, Part I).
- In bursts of 6 requests, the legacy site returned HTTP 429 (too many requests) to the AI crawlers GPTBot and ClaudeBot (bots that read pages for AI tools) on 3 to 6 of 6 requests each, although robots.txt (the crawl rules file) allows both. The count varies between bursts. The new site returned 200 to all 9 crawlers tested (A-23, LIKELY).
5. Speed.
- Real users on the legacy site get acceptable speed (LCP of 1.8 s on phones, from real visits). Lab tests are much slower (A-3).
- In lab tests, the new templates are much faster than the legacy site: suite pages score a median of 74.5 against 54 on mobile, and the home page 86 against 59 in one PageSpeed mobile run.
What to do, in order
- First (item 0): remove the link that redirects to another domain, stop the false conversion, fix the phone number, and send the policy changes to the owner.
- Before the switch (items 1 to 4 and steps 1 to 3 of item 5):
- Move the 77 snapshot pages onto the new templates.
- Fix the dead outbound links (links to other sites that no longer load).
- Clean up the tracking tags and measure bookings. Fix the form script and the "Booked" label.
- Take the ADA and fee items to legal review. Get a booking page that carries the Marketplace Suites name.
- Confirm form delivery. Then run steps 1 to 3 of the switch checklist (item 5).
- Right after the switch (items 6 to 9): fonts and CSS (style files), images, cache headers (settings for how long files are kept), and making the availability API more secure.
- Within 30 days (items 10 to 16): structured data (code that labels page facts for search engines), the daily data rebuild, sitemap and taxonomy (the category structure), security headers, small fixes, accessibility and data consistency, an About page, consent, and the review-markup decision.
- For the SEO batch: the content work in Part E, the Google Business Profile, and OTA listing consistency.
- Needs a decision or access from the owner: approve the changed policy text (N-32); legal review of the accessibility and fee wording (N-51, N-52); confirm the correct rates and check-out time, which differ between pages (N-52, Part I.6); give access to Search Console and GA4 (Part I.9); decide whether to keep the
/llm-info/page (Part I.10).
Part G, after Part E, lists every change page by page: the page, what is there now, the exact change and the reason. It covers all 91 page verdicts, 489 content findings, 29 dead or unsafe links (28 on the new site), 34 titles, 13 descriptions and the image fixes. Part H covers the engineering work: booking measurement, out-of-date prices, booking widget defects and the migration of the snapshot pages.
What could not be checked
- Search Console and GA4 data are not in the evidence for this report, so brand search data, index coverage (which pages Google lists) and real conversions are not shown.
- Form delivery: no live form was submitted, so nothing reached the business inbox.
- Cookie behaviour from the EU, screen reader testing, and the content of kebaya4d.org, which did not load in a live fetch (a direct page request) or in Chromium (a web browser).
Fix first
The 6 findings that cost the most if they ship as they are.
| # | ID | Fix | Severity | Applies to |
|---|---|---|---|---|
| 1 | A-1 | Remove the Chelsea Drugstore link that redirects to an unrelated domain | Critical | Both sites |
| 2 | A-2 | Stop the /thank-you/ page-view conversion | Critical | Both sites |
| 3 | C-1 | Correct the wrong phone number in the hurricane post | High | Both sites |
| 4 | N-32 | Get the owner's approval for the changed policy text | High | New site |
| 5 | N-51 | Legal review: ADA room descriptions and the FTC fee rule (N-52) | High | Both sites |
| 6 | N-1 | Move the 77 WordPress snapshot pages onto real templates | Critical | New site |
Scope and evidence
- 184 pages crawled on 2 sites (93 legacy, 91 new), 131 historic URLs replayed, PageSpeed tests on both sites, and third-party search data for the legacy domain.
- 14 of 91 new pages use the new templates. The other 77 are WordPress snapshots with the old code still loading.
- The findings reflect the live sites at the time of the audit (Part D).
// part f
Part F: Action plan
Audience: the developer building https://marketplace-suites-site.netlify.app/ (the new site, hosted on Netlify)
Source: the full report. IDs that start with "A-" are in Part A (legacy site). IDs that start with "N-" are in Part B (new site). IDs that start with "C-" are in Part E.
Each item except items 13, 14, 15, 15b and 16 has a "Done when" check, and most of these checks can be run against the deployed site. Items are in priority order. A conversion is a counted goal, such as a form submit or a booking.
Do now (both sites)
0. Fix the redirecting link, the false conversions, the wrong phone number and the policy text
Fixes A-1, A-2, N-2, N-3, C-1, N-32
- On
/marketplace/(legacy and new), remove the Chelsea Drugstore "WEBSITE" link tochelseadrugstoreredhook.com. That domain now returns a 301 (a permanent redirect) tokebaya4d.org. Visitors who click the link land on that site. - On
/thank-you/(legacy and new): add<meta name="robots" content="noindex">and remove the URL from the sitemap, so search engines do not index the page. -
Move the
form_submissionconversion from the/thank-you/page view to the form submit event, or fire it only when a one-time token from the form is present, so only real submissions count. -
Fix the phone number on
/10-travel-tips-for-the-u-s-virgin-islands-during-hurricane-season/: "1-800-627-6610" must be "1-800-727-6610" (Part E, C-1), so readers do not call a wrong number. - Send the owner the policy changes in N-32 (balance due 30 or 60 days before arrival, housekeeping on request, the storm summary line on the suite pages) and publish only the approved wording. The new site changed this policy text, and only the owner can approve it.

/marketplace/. Its WEBSITE button leads to chelseadrugstoreredhook.com, which now redirects to kebaya4d.org.Done when:
curl -s <site>/marketplace/ | grep -c chelseadrugstoreredhookreturns 0 on both sites.- A search of every page for
627-6610returns 0 matches. - The owner has approved the policy text in writing.
/thank-you/hasnoindexand is not in the sitemap.- In Google Tag Manager (GTM) Preview, a direct load of
/thank-you/fires no conversion, and a real form submit fires exactly 1 conversion.
Before the switch
1. Move the 77 snapshot pages onto the new templates
Fixes N-1
These pages still load old WordPress code, so they gain little speed. Build 3 templates on the same components as the home and suite pages:
- Post (42 posts): title, date, author, featured image, body HTML, related posts, booking button.
- Archive (
/blog/,/category/*, pagination): post cards with the post title as the link text (not "READ MORE"), and decorative icons withalt=""(N-16, accessibility). - Page (
/contact-us/,/faq/,/inquiry/,/cancellation-policy/,/privacy-policy/,/terms-of-use/,/things-to-do/,/marketplace/*, beach pages and others).
Give every template the mobile booking bar ("Check dates") that stays on screen while the page scrolls, so phone visitors can find a booking button (N-35). Use a visible underline for body links, so links stand out without relying on colour (N-40).
Keep the post body HTML. Remove every /wp-includes/*, /wp-content/plugins/* and /wp-content/themes/* script and stylesheet, Font Awesome from cdnjs, and /js/legacy-fixes.js. Fix the heading-level skips (N-28) in the templates.
Done when:
grep -rlE "wp-includes|wp-content/plugins|wp-content/themes|legacy-fixes" dist --include=*.htmlreturns nothing.- the PageSpeed mobile score (Google's speed test) is 80 or higher (median of 3 runs) for
/best-beaches-on-st-john/,/blog/,/contact-us/and/things-to-do/(in one PageSpeed mobile run per page on the new site: /best-beaches-on-st-john/ 41, /blog/ 46, /contact-us/ 60, /things-to-do/ 58; scores vary by run). - Title, H1 (the main heading), canonical (the preferred address), meta description (the page summary) and JSON-LD types (structured data) on every page match the values recorded in Part C.
- 0 images with
alt="Generic placeholder image"and 0 "READ MORE" links.
2. Fix the outbound links (links to other sites), so visitors do not reach dead or unsafe sites
Fixes N-9
Remove or replace the 28 dead or unsafe links listed in Part G, G.3 (21 at 404, 2 dead domains, 5 that redirect to other domains or fail on SSL). Spot-check the 44 links that returned 403 or 429 (the site blocked automated checks) by hand. Add rel="nofollow" (tells search engines not to follow the link) or remove links to local businesses whose domains have lapsed.
Done when: a link check of every outbound link shows 0 links at 404, 0 DNS failures (domains that no longer resolve) and 0 of the 5 redirecting or SSL-failing links. (travel.usnews.com did not respond: one request timed out and one connection was reset. www.viferry.com returned HTTP 200 with a for-sale parking page in all 5 requests in one test. Open them by hand.)
3. Clean up the tracking tags so booking clicks are measured
- Add
AW-456147901to GTM, because the GTM container has no Google Ads tag. Then remove the directgtag/js?id=AW-456147901loader (the direct script that loads the tag). - In GTM
GTM-TH793K7, delete the 6 Universal Analytics (UA) tags (5 event tags and 1 page view tag), because Google stopped processing Universal Analytics in 2023. - Delete the
gtm4wpdataLayer text (the page data that tags read). Push a real one, so booking clicks carry their nights and total:page_type, and on suite pagessuite_id,check_in,nightsandtotal. - Add a Consent Mode v2 default (Google's setting for visitor cookie consent) before GTM loads.
- Do not push
begin_checkout(a checkout event) from the site. The Lodgix booking page (Lodgix is the booking system) already loads the Google Ads tag, so it may record bookings. - In Google Analytics 4 (GA4), add
lodgix.comto cross-domain linking (one visit counted across both sites). Ask Lodgix how to fire a conversion on the booking confirmation.
Done when: in GTM Preview, 1 Ads tag and 1 GA4 config fire per page, there are 0 requests to analytics.js, a consent default is set before any tag fires, and a test "Book now" click after picking dates shows book_now_click in GTM Preview with the suite ID.
3b. Fix the form conversion script and the "Booked" label
- In
/js/marketplace-suites.js(line 97), detect Netlify forms by the hiddeninput[name="form-name"], not bydata-netlify, which Netlify removes from the served HTML, so the script never records a submission. - On
/suites/, show the real reason a suite is unavailable ("5 night minimum stay required", "Cannot arrive on [date]") on the card, not "Booked". The reason is already in the API answer (the data the page gets from the booking system), so guests see why a stay is blocked.
Done when: a test submit (owner-approved) stores the form name and fires exactly 1 conversion (a plain load of /thank-you/ fires none); and a 4-night New Year search shows the minimum-stay reason on the cards.
3c. Legal review: accessible rooms and all-in prices, which US rules cover
Fixes N-51, N-52 · Legal review needed.
- With the owner, name suite 12 as the accessible suite on
/suites/and on the booking path. Complete the description of suite 12: door widths, bed height, grab bars, shower seat and communication features. State on the other 11 suite pages that they do not describe accessible features. Add the same facts to the Lodgix and OTA (online travel agency) listings. - With the owner and Lodgix, confirm which fees are mandatory (Cleaning Fee, Processing Fee, Damage Insurance). Then show an all-in price (one total with every mandatory fee) wherever a price appears: "from" prices on the home page,
/suites/and suite pages. Government charges may stay separate.


Done when: every suite page states its accessibility features (or that it is not an accessible room), and no displayed price leaves out a mandatory non-government fee.
3d. Brand the booking page so guests see Marketplace Suites, not a shared "Vacation VI" page
Fixes N-53
Ask Lodgix for a Marketplace Suites-only booking page (its own property group, or a booking widget filtered to the 12 suites) with its own title and logo. Point every "Book now" link at it. Confirm in Google Ads which conversion actions fire on the booking page.

lodgix.com/6283/: 3 logos, and a calendar shared with The Hills, villas and snorkel-gear rentals.Done when: the page a "Book now" link opens has a <title> and og:title (the title shown when the link is shared) that say Marketplace Suites, and shows only the 12 suites.
4. Check that form messages reach the owner
Fixes N-20
Confirm in the Netlify dashboard that the contact, inquiry and suite-deals forms are detected and that notifications go to the owner. Confirm in HubSpot (a third-party tool on the site) whether newsletter sign-ups go to a list. If they do, connect Netlify Forms to HubSpot or use the HubSpot form embed (HubSpot's form code for the page).
Done when: 1 owner-approved test submission per form arrives in the right inbox or list.
5. Switch checklist: point the domain to the new site, so old links keep working
Fixes N-10, N-21 to N-24, N-31
- Before the switch, save a full crawl (a scan of every page and its status) of the legacy site as the baseline (the before picture for step 8).
- Add to
_redirects(the Netlify redirect file):https://marketplace-suites-site.netlify.app/* https://marketplacesuitesusvi.com/:splat 301!https://main--marketplace-suites-site.netlify.app/* https://marketplacesuitesusvi.com/:splat 301!(N-41)- 301 redirects for the 9 pages marked "Remove or redirect" and the 15 marked "Merge" in Part E.2, after the SEO agency confirms them with Google Search Console data (search traffic records).
/*/index.html /:splat/ 301/property-tags/* /suites/ 301/comments/feed/ /feed/ 301
- Change internal links to
/blogand/marketplaceso that they end in/, which avoids an extra redirect. - Point DNS (the domain address settings) for the apex (the domain without
www) andwwwto Netlify (N-48). At the DNS host (likely GoDaddy), change the apex A record (an address record) from104.196.63.107to75.2.60.5, and change thewwwCNAME (an alias record) frommarketplacevi.wpengine.comto<site-name>.netlify.app. Set the apex as the primary domain in Netlify, so thatwwwreturns 301 to the apex, as the legacy site does. Note the old values so you can roll back (undo the change). The records have a TTL (how long other servers keep a record) of 3,600 seconds. Lower it to 300 seconds a day before the switch, so a rollback takes effect quickly.- Add the 75 short-link redirects listed in Part G, G.6 (N-49) to
_redirects, above any catch-all rule (a rule that matches every address), and test 3 of them on a deploy preview (a test copy of the site), so old short links reach their pages. - Email security (N-48, rules against fake mail from this domain): confirm whether HubSpot sends the newsletter from this domain. If nothing sends mail from it, add
v=spf1 -all(no sender allowed), a DMARCp=rejectrecord (rejects mail that fails the checks) and a null MX (no mail received). If HubSpot sends from it, set up HubSpot's SPF (the list of allowed senders) and DKIM (mail signatures) records instead.
- Add the 75 short-link redirects listed in Part G, G.6 (N-49) to
- Keep the legacy site up (unlinked) for 30 days as a rollback.
- After the switch, check that this sitemap address returns the new sitemap, then submit it in Search Console:
https://marketplacesuitesusvi.com/sitemap-index.xml(the legacy site names its filesitemap_index.xml). Run URL Inspection (a Search Console tool) on the home page,/suites/, 1 suite page and 1 post. - Verify the site in Bing Webmaster Tools and add an IndexNow key (a code that tells search engines when pages change). Submit the sitemap there too.
- 48 hours after the switch, crawl again and compare with the baseline. Re-run the Wayback redirect test (old page addresses from the Wayback Machine, a web archive) against the live domain.
Done when: all sitemap URLs return 200 (page found) on the live domain, the 131 historic URLs (old page addresses) give the same results as in the migration check (Part C), and the Netlify host returns 301 for every path.
Right after the switch
6. Fix render-blocking fonts and CSS
Fixes N-4
- Self-host (serve from this site, not from Google) Montserrat (400, 500, 600, 700) and Noto Serif (400, 700) as subset WOFF2 (a compact font file format). Preload (load early) Montserrat 400 and 700. Remove the
fonts.googleapis.comrequests. - Inline the critical CSS (the styles needed for the first screen, written into the page) for the header and hero (the large top section). Load the rest of
site.cssso that it does not delay the first screen. - Load HubSpot only after the visitor first clicks, scrolls or taps, or when the browser is idle.
Done when: Lighthouse "Eliminate render-blocking resources" reports no issue on the home page, and PageSpeed mobile LCP (the time until the main content appears) for / is under 2.5 s.
7. Image pipeline
Fixes N-7
- Serve images through the Netlify Image CDN (content delivery network for images) or convert to AVIF and WebP (modern, smaller image formats) when the site is built, with
srcsetandsizes(image versions for different screen sizes). Addpictures.lodgix.comto the[images] remote_imageslist so that Lodgix photos are saved on the site too. - Re-save photos stored as PNG in a photo format such as JPEG, so the files are smaller.
- Add
widthandheightto every<img>tag (the image code). Useloading="lazy"(load later) for images below the first screen. - Keep every original
/wp-content/uploads/...URL live.
Done when: no image over 200 KB is sent to a 390 px viewport, Lighthouse "Properly size images" and "Serve images in next-gen formats" report no issues, and all 417 legacy /wp-content/uploads/ URLs (159 in img src, 258 only in srcset) still return 200, and the 11 image URLs that only the legacy sitemap lists (N-7) return 200 or a 301.
8. Cache headers
Fixes N-8
Add a content hash to CSS and JS filenames. In _headers:
/css/*
Cache-Control: public, max-age=31536000, immutable
/js/*
Cache-Control: public, max-age=31536000, immutable
Done when: curl -sI <site>/css/<hashed>.css shows immutable, and HTML still shows max-age=0.
9. Harden /api/ldx
Fixes N-12
- Validate
from,toandguests. Return 400 with a JSON object for bad input and 502 when Lodgix fails. - Cache (store for reuse) each
from|to|guestsanswer for 60 to 120 seconds. - Add a simple rate limit for each IP address.
Done when: reversed dates return 400, guests=-5 returns 400, from=garbage returns 400, a valid range returns 200, and a second identical request within 60 s is served from the cache.
Next 30 days
10. One Hotel entity in JSON-LD
Fixes N-13
- Merge
OrganizationandHotelinto 1 node (one JSON-LD data block),@id: https://marketplacesuitesusvi.com/#hotel, withgeo,priceRange,checkinTime,checkoutTime,amenityFeatureand a real photo. AddsameAslinks to the same business on Google Business Profile, Tripadvisor, Facebook and Instagram. - Link each
VacationRental(one suite's data) to the hotel withcontainedInPlace, and addgeo. Use the full-size Lodgix photos, not the_previewcopies. - Remove the
SearchActionthat points to/?s=. - Replace the author name in the Article JSON-LD with a real person or the business.
Done when: the Schema.org validator and Google's Rich Results Test show 0 errors on /, /suites/suite-9-marketplace/ and 1 post, and every page uses the same #hotel @id.
11. Daily rebuild from Lodgix data
Fixes N-11
Trigger a Netlify build hook (a web address that starts a new site build) once a day to refresh review counts, ratings, minimum rates and photos.
Done when: a new review in Lodgix shows on the site and in aggregateRating within 24 hours.
12. Sitemap (the page list for search engines), category pages, internal links and social previews
- 301
/category/level-1/,/category/level-2/,/category/level-3/and/category/uncategorized/to/blog/. Remove them and/thank-you/from the sitemap. - Add
lastmod(the last-changed date) from each page's real modified date. Add<image:image>entries (image listings in the sitemap) for suite photos. - Add related-post links so that
/top-things-to-do-in-st-john-us-virgin-islands/and/st-john-shines-in-autumn/get links from other pages (they have none now), and every post has at least 3 links from other pages. - Add a default 1200 x 630
og:image(the picture shown when a page is shared) in the base layout (the shared page template). - Fix the sitemap line in the new site's
robots.txtso that it works at the switch (it points tositemap-index.xmlon marketplacesuitesusvi.com, which returns 404 until then). Decide about/llm-info/(keep with correct facts, or remove). Merge the twoBreadcrumbListblocks (the page path data) on each suite page into one. Restore thereviewlist in the suite markup. AddsameAslinks to Google Business Profile and Tripadvisor on the Hotel and Organization nodes. SetaddressRegion(the region field of the address) toVI. - Keep the URL, title and month-by-month sections of
/when-is-the-best-time-to-visit-us-virgin-islands/. Third-party data gives this page about 57% of the estimated search visits in the top 100 keyword rows (Part I.2). Give every merged or removed URL a 301 to its closest page, and re-check the 4 pages in Part I.3 after the switch.
Done when: the sitemap has 86 URLs (91 minus the 5 removed above; it drops further as each merge or removal in Part G.1 ships), each with lastmod; a link check finds 0 orphan pages (pages with no links from other pages) and no post with fewer than 3 links from other pages; every page has og:image.
13. Security headers
Fixes N-19
Add Referrer-Policy: strict-origin-when-cross-origin. Add a Content-Security-Policy-Report-Only header (it reports breaches without blocking anything) that allows GTM (Google Tag Manager), Google Ads, HubSpot, Lodgix, YouTube and Netlify Forms. Enforce it after 2 weeks with no violations.
14. Small fixes
- Use the plain HubSpot embed (the code that places HubSpot on the page), with no
?integration=WordPress. /faq/video: useyoutube-nocookie.comwith a placeholder that loads the video on click.- Add a 180 x 180 PNG
apple-touch-icon(the icon for iPhone and iPad home screens) and a web app manifest.
15. Data consistency and accessibility
- Generate every review count and the "Read all N reviews" link from 1 value, so the numbers on a suite page match.
- Extend the built-in rate table past 2026, or load the "from" price from Lodgix in the daily rebuild.
- Make the "Book now" control truly disabled when a suite is booked, so that the Enter key cannot open the booking page (
aria-disabledplus nohref, or a<button disabled>). - Make the date picker usable with a keyboard. Make the skip link (the link that jumps past the menu) move keyboard focus to
#main. - Output
articleSectionas text, not an object.
15b. About page and contact email
Add an /about/ page (owners, history, the building in The Marketplace, photos) and a visible contact email in the footer and on /contact-us/. Link the About page from the footer.
15c. Consent and cookies
Fixes N-55
Consent Mode v2 defaults go in with item 3, step 4. Make sure the HubSpot cookie banner shows for the regions that need it, and delete the Universal Analytics tag (the old Google Analytics tag) that sets _gat_UA-185349894-1.
Done when: a fresh page load from an EU location (or through a VPN) sets no analytics or ads cookies before consent, and _gat_UA- is not set anywhere.
16. Decide whether to keep the review markup
Fixes N-38
Google's review snippet guidelines appear to make the suite aggregateRating (star-rating data built from guest reviews, many from Airbnb) not eligible to show stars in Google results. Decide with the SEO agency whether to keep it. Keep the visible reviews either way.
Optional
- llms.txt (N-30): a short summary of the business and links to the main pages. Effort looks low. Google's changelog (June 15, 2026) says these files "aren't needed for Google Search".
- Availability calendar on suite pages: the legacy site showed an availability calendar, and the new suite pages have a date picker, so this is optional. A small month view from
/api/ldxis one option to test. This is a choice about the visitor's experience, not an SEO fix.
Left for the SEO batch (not dev)
- Title and description lengths and the 4 titles that repeat the brand (N-29).
- The content work in Part E: fact corrections (C-2), stale content (C-3), real authors and bios (C-4), first-hand detail (C-5), merges for overlapping posts (C-6), and unique text for each suite page (C-7).
- Update the privacy policy (N-44), with legal review.
- Fix citations (business listings on other sites) and make the naming consistent on OTA listings (N-56). The Google Business Profile is covered in Part I.
- The official site's home page is the first organic (unpaid) result for the search "marketplace suites st john", but the site is absent from the top 20 for 5 hotel searches (N-54, Part I). Check the brand search data (searches for the business name) in Search Console.
- Add 1 review summary for the whole hotel (N-56). Check OTA listing titles for out-of-date promotional text (N-59).
- Remove the claim "first and only suites" (N-57) unless the owner can support it. Keep the Shutterstock licences (the rights to use the photos) on file (N-58).