2026-05-20DataMesh Consulting
20 May — Functional-report sweep: country counts, CPV dedup, sitemap priority
A scheduled QA-feedback day. Two waves of fixes from the latest functional test report — first the medium-severity items (country i18n, stale "65+ portals" claims, World Bank country tagging, source list dedup, /api → /v1 redirect), then the low-severity polish (sticky-header wrap on narrow widths, country card counts off by one, CPV chip duplication, insights typography). And one structural change: the sitemap.xml is now ordered hubs-first, tender-details-last so the most important URLs get crawled in every fetch cycle.
What the functional test report flagged
QA runs a structured functional test against the public portal every two weeks — a fixed checklist covering navigation, country pages, tender detail pages, search, footer/legal, performance budgets, and SEO surfaces. The 14-day cadence gives the engineering side enough runway to ship between runs without doing emergency triage on every regression.
This week's report came back with 9 items: 5 medium, 4 low. All landed in two PRs today.
Medium-severity items
Country i18n on cards
/[country] pages were showing English country names
hardcoded in card components, ignoring the user's
Accept-Language. Now resolved via the same countryName(code,
locale) helper used on the homepage. Visible improvement
for the ~30% of traffic coming from non-EN locales (DE, FR,
ES dominantly).
"65+ portals" claim was stale
The marketing copy in two places (footer + homepage hero) claimed "65+ portals continuously monitored." Per the most recent prod tender-quality audit (2026-05-15), we have ~141 sites total, ~121 active, but only ~23 producing >100 tenders each. "65+ portals" wasn't false but it wasn't meaningful either — most of those portals are near-empty (1–20 tenders, decayed feeds).
Copy rewritten to: "We continuously monitor public-tender portals across Europe, North America, Asia-Pacific, and multilaterals." No specific count. Easier to keep accurate and harder to over-promise.
World Bank country tagging
WB-tagged tenders were getting country: 'World' because the
WB site row uses that as its jurisdiction. But each WB
notice has an actual borrower country (Liberia, Mozambique,
Bangladesh, etc.) in the procurement-notice payload. The
country-backfill tool now reads the borrower country from
the WB notice and writes it to tender.countryCode,
falling back to the site default only if absent.
This is the same pattern we use for TED member-state distribution. Bringing WB in line with that pattern.
Source list deduplication
/sources was showing duplicate entries for portals that
had been merged in the consolidation script (2026-05-15).
The merge-duplicate-sites script deactivated the old rows
but didn't update the source-page builder, which was still
including isActive=false rows under "Recently retired."
That section is now hidden by default with a "Show retired
sources" toggle.
/api/ legacy redirect
A grab bag of older API URLs (mostly internal tools and a
few external integrations that hadn't been migrated) were
hitting /api/... and getting a hard 404. The current API
is mounted at /v1/. Added a redirect rule from /api/
to /v1/* with a 301, preserving query and path. Logs
this week show ~30 hits/day on the redirect — small but
real.
Low-severity polish
Sticky-header wrap on narrow viewports
The site header was wrapping into two lines below 380px viewport width (some older Android browsers and edge-case iPhone-mini configurations). The nav links now collapse into a hamburger below 480px instead of wrapping.
Country card counts off by one
Tender count on country cards on the homepage was off by
one because the COUNT query was including rows with
status=ARCHIVED. The card now scopes to status=ACTIVE
to match what's actually clickable from the card link.
CPV chip duplication on detail pages
If a tender had cpvCodes: ['72000000', '72200000', '72200000']
(duplicate at source), the detail page rendered three
chips. The render path now does a Set(cpvCodes)
dedup, so each chip appears once regardless of source
duplication.
Insights page typography
H2/H3 hierarchy on insights pages wasn't matching the rest of the editorial surfaces — too tight vertical rhythm, accent-blue links instead of accent-purple. Brought both in line with the brand tokens. Cosmetic.
Sitemap.xml — hubs first, details last
Independent of the functional report but landed in the
same window. The sitemap had been ordered alphabetically
by URL, which meant /about came before /tenders/[id]/...
came before /team. Google's crawl budget per sitemap is
finite — putting 5,000 tender-detail URLs ahead of the 12
hub pages meant the hubs sometimes didn't make it into
the crawl frontier on a given day.
New order:
1. Homepage + top-level hubs (/tenders, /sources,
/insights, /about, /team)
2. Country pages (~80 entries)
3. Sector pages (~50 entries)
4. Tender detail pages (~5,000 entries, paginated across
multiple sitemap files)
Combined with yesterday's lastmod hygiene fix, GSC's
crawl distribution should be noticeably more "hub-aware"
within a week.
What's next
- Watch GSC's coverage report over the next few days to see
- Tomorrow: the iOS App Store v1.1 submission goes in. A