CoolFace
Datasetpublic

CanlahAI/singapore-commerce-index

Singapore Commerce Index Who in Singapore pays to be found on search, who sells on Shopify, and how 166 industry labels collapse into 16 buying situations. Canlah Research · Singapore · Captured 2026-09-01 → 2026-09-03 · Segmented 2026-09-09 · CC BY 4.0 TL;DR Two registers built from live Singapore search captures and Shopify's own public store records, graded by what kind of proof each row actually has, plus a segmentation that rolls all 166 industry labels into… See the full description on the dataset page: https://huggingface.co/datasets/CanlahAI/singapore-commerce-index.

sourceHugging Facecc-by-4.0updated 13d agoView on Hugging Face
0likes53downloads
Dataset Card

Singapore Commerce Index

Who in Singapore pays to be found on search, who sells on Shopify, and how 166 industry labels collapse into 16 buying situations.

Canlah Research · Singapore · Captured 2026-09-01 → 2026-09-03 · Segmented 2026-09-09 · CC BY 4.0


TL;DR

Two registers built from live Singapore search captures and Shopify's own public store records, graded by what kind of proof each row actually has, plus a segmentation that rolls all 166 industry labels into 16 buying situations with no orphans and no duplicates.

  • 3,308 companies in the search-spend register. 748 ad captures on live SG SERPs — of which only 555 are Singapore-verified; 107 are foreign entities or global portals of multinationals.
  • 1,026 Shopify stores, Singapore-registered per Shopify's own /meta.json record, in a market of roughly 17,220. Only 3.9% were caught buying Google Ads.
  • 16 segments over 166 labels, each label in exactly one, verified programmatically.

The headline finding is uncomfortable and is the reason this is published: *only 1,341 of 4,009 companies (33%) have an observed search-investment signal at all.* The rest are inferred from organic ranking, which is a much weaker claim, and the dataset labels which is which per row rather than blending them into one number.

Read this before quoting any number

  • Tier A is the only payment-shaped evidence. A captured ad impression (A), a Google Ads conversion tag in the page source (B), a verified agency case-study mention (C) and an organic ranking (D) are four different things. Column tier says which. Do not sum them.
  • All ad counts are floors. Captures came from a datacenter IP that sees roughly two ad slots per query, and tags loaded via GTM are invisible to a static fetch.
  • `748` is captures, not Singapore advertisers. Use sg_entity to filter. An adversarial audit found multinationals' global .com portals being counted as local companies in 16.7% of a sample; that was fixed across the whole set, and the correction is why these two numbers differ.
  • The Shopify universe figure (~17,220) is a third-party crawler's attribution, not a census. Published estimates for this market disagree by more than 2×.
  • The segmentation is a taxonomy, not a ranking. rank is the order segments were proposed in. Nothing here says a segment is attractive.

Files

FileRowsWhat it is
data/search_spend_companies.csv3,308One row per company, with its evidence tier and what was observed
data/search_spend_by_industry.csv145Industry aggregates for the above
data/shopify_merchants.csv1,026SG-registered Shopify stores, classified from their own product data
data/shopify_by_industry.csv39Industry aggregates for the above
data/segments.csv16The segments, their size and observed-signal count
data/industry_to_segment.csv166Every industry label and the one segment it belongs to

Method, in short

  • Captured, not surveyed. Every ad impression comes from a live Singapore Google result (gl=sg), saved raw. Every Shopify store is confirmed against Shopify's public /meta.json store record — HTML fingerprinting alone let 37 false positives through, so the store record is the judge, not a heuristic.
  • Industry classification for Shopify stores comes from each store's own /products.json product_type and vendor fields; a hand audit put the error rate at ~9%.
  • Audited adversarially. Samples went to reviewers instructed to refute. When they found a systematic error, it was fixed across the whole set and disclosed rather than patched in the sample.
  • Segmentation was produced by four independent roll-ups from different angles (buying trigger, deal economics, search-demand structure, competitive state), scored by three judges including one auditing the arithmetic against the file, then recomputed from the source rows.

What was deliberately removed

This dataset is a subset of a working register, and the omissions are decisions, not gaps:

  • All contact data. The working register holds business emails, WhatsApp numbers, phone numbers and the names of real people. None of it is here, and none of it will be. Two residual contact strings that had survived inside free-text fields (an email inside a store's own meta description, a phone inside an ad headline captured as a company name) were redacted before publication.
  • Vendor relationships. The working register names which SEO/SEM agency serves which company, inferred largely from those agencies' own published case studies. Aggregate counts appear in search_spend_by_industry.csv; no agency is named, because a supplier's client book is not ours to publish.
  • Our own commercial judgements. Which segments we consider worth pursuing, at what price, with what reach — none of that is here. It says nothing about the companies and everything about us.

Known limits

  • One capture window (2026-09-01 → 09-03). A register is a snapshot; it becomes a measure the second time it runs.
  • Tier D (organic-only, 1,742 rows) is inferred investment. It is the largest tier and the weakest evidence in the file.
  • No company size, revenue or headcount data exists in this dataset.
  • notes and description are free text of mixed provenance, including text the companies published about themselves. Treat as descriptive, not as measured fields.

Citation

See CITATION.cff. Corrections are welcome and will be published in ERRATUM.md rather than quietly patched: <hello@canlah.ai>