// 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.

Prepared by
Winston Digital Marketing
Legacy site
marketplacesuitesusvi.com (WordPress on WP Engine)
New site
marketplace-suites-site.netlify.app (static, Netlify)

// 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/ldx that 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_submission conversion, 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-netlify attribute 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

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. For the SEO batch: the content work in Part E, the Google Business Profile, and OTA listing consistency.
  6. 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.

#IDFixSeverityApplies to
1A-1Remove the Chelsea Drugstore link that redirects to an unrelated domainCriticalBoth sites
2A-2Stop the /thank-you/ page-view conversionCriticalBoth sites
3C-1Correct the wrong phone number in the hurricane postHighBoth sites
4N-32Get the owner's approval for the changed policy textHighNew site
5N-51Legal review: ADA room descriptions and the FTC fee rule (N-52)HighBoth sites
6N-1Move the 77 WordPress snapshot pages onto real templatesCriticalNew 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)

Fixes A-1, A-2, N-2, N-3, C-1, N-32

  1. On /marketplace/ (legacy and new), remove the Chelsea Drugstore "WEBSITE" link to chelseadrugstoreredhook.com. That domain now returns a 301 (a permanent redirect) to kebaya4d.org. Visitors who click the link land on that site.
  2. 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.
  3. Move the form_submission conversion 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.

  4. 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.

  5. 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.
Chelsea Drugstore card on /marketplace/ with WEBSITE, FB and CALL buttons
Figure: the Chelsea Drugstore card on /marketplace/. Its WEBSITE button leads to chelseadrugstoreredhook.com, which now redirects to kebaya4d.org.

Done when:

  • curl -s <site>/marketplace/ | grep -c chelseadrugstoreredhook returns 0 on both sites.
  • A search of every page for 627-6610 returns 0 matches.
  • The owner has approved the policy text in writing.
  • /thank-you/ has noindex and 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 with alt="" (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=*.html returns 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.

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

Fixes N-5, N-6

  1. Add AW-456147901 to GTM, because the GTM container has no Google Ads tag. Then remove the direct gtag/js?id=AW-456147901 loader (the direct script that loads the tag).
  2. 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.
  3. Delete the gtm4wp dataLayer text (the page data that tags read). Push a real one, so booking clicks carry their nights and total: page_type, and on suite pages suite_id, check_in, nights and total.
  4. Add a Consent Mode v2 default (Google's setting for visitor cookie consent) before GTM loads.
  5. 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.
  6. In Google Analytics 4 (GA4), add lodgix.com to 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

Fixes N-33, N-34

  • In /js/marketplace-suites.js (line 97), detect Netlify forms by the hidden input[name="form-name"], not by data-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.

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.
Suite 12 page text stating ADA compliance, an ADA compliant refrigerator, wider openings, transfer shower, elevator and parking
Figure: suite 12 is the only suite page that describes accessibility. No door widths, bed height, grab bars or communication features.
Suite 9 price panel: 195 dollars a night and up, then 4 nights 1,028 dollars, discount, cleaning fee 95 dollars, processing fee 56.54 dollars, damage insurance 45 dollars, taxes 121.10 dollars, total 1,191.43 dollars
Figure: suite 9, 10 to 14 December 2026. The headline says $195 / night and up; the total adds a cleaning fee, a processing fee and damage insurance before tax.

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.

The Lodgix booking page with Vacation VI, The Hills and Marketplace Suites logos and a calendar of several businesses' rentals
Figure: 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.

Fixes N-10, N-21 to N-24, N-31

  1. 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).
  2. 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
  3. Change internal links to /blog and /marketplace so that they end in /, which avoids an extra redirect.
  4. Point DNS (the domain address settings) for the apex (the domain without www) and www to Netlify (N-48). At the DNS host (likely GoDaddy), change the apex A record (an address record) from 104.196.63.107 to 75.2.60.5, and change the www CNAME (an alias record) from marketplacevi.wpengine.com to <site-name>.netlify.app. Set the apex as the primary domain in Netlify, so that www returns 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 DMARC p=reject record (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.
  5. Keep the legacy site up (unlinked) for 30 days as a rollback.
  6. 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 file sitemap_index.xml). Run URL Inspection (a Search Console tool) on the home page, /suites/, 1 suite page and 1 post.
  7. 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.
  8. 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.com requests.
  • 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.css so 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 srcset and sizes (image versions for different screen sizes). Add pictures.lodgix.com to the [images] remote_images list 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 width and height to every <img> tag (the image code). Use loading="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, to and guests. Return 400 with a JSON object for bad input and 502 when Lodgix fails.
  • Cache (store for reuse) each from|to|guests answer 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 Organization and Hotel into 1 node (one JSON-LD data block), @id: https://marketplacesuitesusvi.com/#hotel, with geo, priceRange, checkinTime, checkoutTime, amenityFeature and a real photo. Add sameAs links to the same business on Google Business Profile, Tripadvisor, Facebook and Instagram.
  • Link each VacationRental (one suite's data) to the hotel with containedInPlace, and add geo. Use the full-size Lodgix photos, not the _preview copies.
  • Remove the SearchAction that 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.

Fixes N-14, N-15, N-17, N-18

  • 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.txt so that it works at the switch (it points to sitemap-index.xml on marketplacesuitesusvi.com, which returns 404 until then). Decide about /llm-info/ (keep with correct facts, or remove). Merge the two BreadcrumbList blocks (the page path data) on each suite page into one. Restore the review list in the suite markup. Add sameAs links to Google Business Profile and Tripadvisor on the Hotel and Organization nodes. Set addressRegion (the region field of the address) to VI.
  • 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

Fixes N-25 to N-27

  • Use the plain HubSpot embed (the code that places HubSpot on the page), with no ?integration=WordPress.
  • /faq/ video: use youtube-nocookie.com with 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

Fixes N-36, N-37, N-39, N-43

  • 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-disabled plus no href, 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 articleSection as text, not an object.

15b. About page and contact email

Fixes N-50, A-24

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.

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/ldx is 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).