Basket Desk SG
Back to dashboard

Dashboard guide

Basket Desk SG records product listings from the online storefronts of FairPrice, Sheng Siong, and Cold Storage. Each source row is one observed listing from one supermarket on one collection date.

Quick start

  1. Choose the reporting date. p_date defaults to Latest available date. This selects the newest published reporting date. Click the filter to choose Fixed date or range. Both endpoints are included. Set both to the same date for a single day.
  2. Choose a product. The dashboard opens with a sample comparison of one real product. Edit Comparable product to choose a matched item and pack size. To search all listings, remove that filter, then add Source product name to Filters and use Contains text. Searching the Fields panel finds column names.
  3. Choose the result columns. Add fields to Dimension to group rows by their values. Add an aggregation to Metrics to calculate a value for each group. Use Filters to narrow the input rows. On desktop, drag a field onto a shelf. You can also click or tap a field, or use the shelf’s + button.
  4. Apply and run. Click Apply in the filter dialog, then Run query. Click a filter or metric on its shelf to edit it. Click its × to remove it. Reset restores the starting comparison and the latest date.

Filters combine with AND. For example, a row must match both the selected date range and the product search. Within a single list filter, a row can match any of the selected values.

Column reference

The names below match the dashboard. The identifier under each name is the underlying field key. A dash in the table represents a missing value. A zero, when recorded, is a value in its own right.

Collection date and availability

ColumnMeaning and use
p_date p_dateThe reporting date shown as Data as of, stored as YYYY-MM-DD. It is one Singapore calendar day before the collection date. For example, the 10 Nov collection has p_date = 2026-11-09. Keep a date or range selected to load only those partitions. Remove this filter to query all published dates, subject to other date filters.
Observed date observed_dateThe original date the listing was observed in Singapore time. Use this field when you want the actual collection date, such as 10 Nov for the collection reported under p_date = 2026-11-09.
Observed time observed_atThe timestamp at which the listing was recorded, shown in UTC. Add eight hours to read it in Singapore time.
Recorded stock in_stockThe online stock flag when the row was collected. The table shows In stock, Out of stock, or a dash for an unknown value. Use this filter when comparing items that were available in the collected storefront.
Store context store_contextThe storefront or delivery context used by the collector. delivery-165 identifies the FairPrice delivery context. storefront-default identifies the default online context used by the other collectors. Prices and stock can vary by location or fulfilment context.

Listing identity and classification

ColumnMeaning and use
Supermarket retailerThe retailer whose online storefront supplied the row. Group by this field to put each supermarket on its own row or chart series.
Source product name nameThe retailer’s listing title. It can include the brand, flavour, pack size, or labels such as [BCRS]. Use it to find listings by name across all retailers, including listings with no assigned comparable product.
Category categoryThe storefront category under which the collector found the listing. Retailers can classify similar products differently, so compare category results with the supermarket and product mix in mind.
Pack size pack_sizeThe recorded size of the listing, for example 2 L or 500 g. It generally comes from a size field. Cold Storage can also derive it from a measurement in the listing title. Compare equivalent packs before comparing prices.
Brand brandThe brand name supplied in a separate storefront field. A title can contain a brand even when this column is blank. Use a product-name search if a brand filter misses listings.
Product ID product_idThe retailer’s identifier for the listing, stored as text. Use it with Supermarket to identify a listing. Identifiers from different retailers can overlap.
Listing slug slugThe URL-friendly listing identifier supplied by the retailer. Some sources omit it. It can help identify a listing within one storefront.
Barcodes barcodesThe listing’s collected barcodes, displayed as comma-separated text when there is more than one. Preserve them as text in a spreadsheet so leading zeroes stay intact. A shared barcode helps match listings when pack sizes also agree.
Seller sellerThe seller shown by the listing when the source provides a separate seller field. Supermarket identifies the storefront where the listing was found.

Prices and promotions

ColumnMeaning and use
Currency currencyThe ISO currency code for the price and deposit fields. The collected prices use SGD, and the table shows them with the S$ prefix.
Regular price regular_priceThe regular or reference price recorded for the listing’s pack, in SGD. FairPrice uses the selected storefront’s regular price when supplied and the listing’s final price as a fallback. Sheng Siong uses a higher previous price as the reference when it reports one. Cold Storage uses the listing price. Compare equivalent packs.
Recorded offer offer_priceA promotional price the collector could record as a numeric value for the listing. FairPrice uses the lowest eligible fixed-price offer active for one pack at collection time. Sheng Siong uses the current price when it is below the previous reference price. Cold Storage uses a lower positive promo price when supplied. A dash means no qualifying price was recorded. See Offer details for conditions that were captured.
Offer details offersPromotion metadata, stored as JSON. Depending on the storefront it can include a promotion ID, description, dates, rules, and a restricted-offer flag. Where an entry has price_cents, divide it by 100 for SGD. An empty array [] means no promotion details were collected for that row.
Container deposit depositThe refundable beverage container deposit recorded for the pack, in SGD. The collector stores this separately from the price fields. Check it when comparing what you may pay at checkout. A missing deposit means the source did not supply a value to this field.

Cross-store matching

ColumnMeaning and use
Comparable product comparable_productA shared label for a product and pack size matched across at least two supermarkets. Use this filter for like-for-like comparisons. A blank means the dashboard did not assign a cross-store match. Search Source product name to include those listings.
Match evidence match_evidenceShows why a matched product was grouped. barcode_and_pack indicates a shared barcode and matching pack size. exact_title_tokens_and_pack indicates matching normalized title and brand words with a matching pack size under stricter fallback rules. A group can show both methods. Match candidates use same-day, in-stock listings with a regular price and pack size. A three-store group requires a direct match for each pair.

Read the results

Source row count tells you how many observations matched the filters. Group count tells you how many combinations of dimensions those rows produced. Charts show the first 12 groups by default and offer limits of 30 or 60 when more groups are available. Hover, tap, or focus a chart mark to see its value.

Calculate metrics and download data

Add a field to Metrics to choose an aggregation. Use Calculated metric to name a formula, select a number format, and save it. The formula uses the displayed field names in square brackets. A numeric expression that uses source fields without an explicit aggregation is averaged within each group. Saved formulas are available in the browser where you created them. The metric’s details show a SQL equivalent.

Use Download CSV → Grouped results for the dimensions and metrics in your query. Choose Filtered source rows for all source columns and the observations that matched your filters. Run the query before downloading. The export covers up to 1,000,000 matching rows per file across result pages.

Check coverage and freshness

Collection starts daily at 1:30 am Singapore time. The publisher checks for finished collections and adds available snapshots to the dashboard. It runs on Windows, so an offline machine can delay publication. Data as of shows the newest published reporting date. Data coverage shows actual collection dates.

Open Data coverage to see the collection date range and the latest run status for each store. A partial run can include useful rows while leaving gaps in storefront coverage. An item missing from a query may be outside the selected filters, unmatched, or absent from the collected pages. Try searching by its source name and checking the store’s coverage for the relevant dates.

Each price, stock flag, and promotion reflects the online listing when it was observed. Compare like-sized packs, check the recorded offer terms, and use the retailer’s storefront for the current price and stock.