String matching is not entity resolution. Ring, Noise, and Minimalist can be ordinary words or brands.
Registry
merchant_id: ring-au
approved_domains: [ring.com]
approved_names: [Ring]
market_paths: [/au/en/]
ambiguous_names: [Ring]
Match order
- normalize visible source URL
- match approved registrable domain
- verify market path when relevant
- match product URL/identifier
- use brand string only as weaker evidence
- route ambiguous names to review
A ring.com/au/en/products/... citation is stronger than answer text containing “ring doorbell.” A retailer source naming Ring is third-party evidence, not storefront citation.
Output
{"level":"domain_verified","merchant_id":"ring-au","source_url":"https://ring.com/au/en/products/battery-doorbell","confidence":1.0}
Never upgrade brand-only evidence to domain verified. Preserve redirects and provider proxy URLs separately.
Evidence contract
Every match records what was actually observed. The minimum record includes the answer text span, visible source URL, resolved destination, match rule, merchant registry version, market, timestamp, and provider run ID. That makes a later correction possible without replaying an unavailable response.
{
"observation_id": "obs_01J...",
"text_span": "Ring Battery Doorbell",
"visible_source_url": "https://provider.example/redirect/abc",
"resolved_url": "https://ring.com/au/en/products/battery-doorbell",
"match_rule": "approved_domain_and_market_path",
"evidence_level": "official_storefront_cited",
"registry_version": 12,
"review_state": "accepted"
}
Provider redirect URLs are evidence about what the interface exposed. The resolved URL is evidence about the destination. Store both; replacing one with the other destroys auditability.
Collision handling
Names such as Noise, Target, Ring, and Minimalist require context. Case-insensitive string equality can generate a candidate, but it cannot close the match. Stronger checks include a registered domain, product identifier, known category, market path, and nearby product language.
The matcher should return several states instead of forcing a boolean:
domain_verified: an approved merchant domain was resolved.product_verified: the destination also matches a known product identity.brand_only: the name appears without a verifiable merchant URL.third_party: another domain supports the brand or product claim.ambiguous: several entities remain possible.not_observed: no candidate survived normalization.
Redirect and canonical checks
Follow redirects with a bounded hop count. Reject non-HTTP destinations and record loops, timeouts, consent pages, and blocked responses as terminal states. After reaching HTML, compare the final URL with the page canonical. A citation resolving to a regional product page must not be rewritten to a global homepage merely because the global URL is in the registry.
Regression tests
Use fixtures containing the answer fragment and source list, then assert the exact evidence level and entity ID. Include negative fixtures where an ordinary word matches the brand name, where a retailer mentions the brand, and where a provider proxy cannot be resolved. A registry update must not retroactively mutate stored results; reclassification creates a new derived record linked to the old one.
The public report should show the evidence level in plain language and link to the cited destination. It should never turn a weak name match into “your store was recommended.” See the evidence-level reference for the user-facing labels.
Community discussion
Add to the article
Ask a technical question, share a storefront result, or challenge a conclusion with evidence.