Skip to main content
All insights

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
if the sitemap reorder + noindex fixes from yesterday produce the expected re-balancing.
  • Tomorrow: the iOS App Store v1.1 submission goes in. A
raft of iOS fixes are queued (offline banner, detail-screen refetch, search response-shape mismatch).
Methodology: drawn from the week ending 2026-05-20 tender corpus. Tender data sourced from public procurement portals worldwide; see our methodology for the extraction pipeline.