Docs · Store & catalog
BUILD A STORE

Store & catalog

The store, categories, products, variants and delivery charges.

Catalog reads work anywhere, server or browser, with any key. They retry network failures on their own.

The store

js
const store = await dakio.store.get()
FieldWhat it is
name, description, logoUrl, faviconUrl, accentColorThe store's brand
contact{ phone, email, address, city, whatsapp }
social{ website, facebook, instagram }
announcementA running campaign's banner text, else the store's own announcement
campaignBanner{ text, campaignId } while a sale runs, else null
delivery{ insideDhaka, outsideDhaka } — the two delivery rates
tracking{ metaPixelId, gtmContainerId }
canonicalHostThe one address the store counts as on the web, for canonical links
currency, paymentMethods'BDT', ['COD']

Categories

js
const categories = await dakio.categories.list()
// [{ id, name, slug, parentId, productCount }]

A flat list. Build the tree from parentId. productCount counts published products directly in the category, not its children.

Products

js
const page = await dakio.products.list({
  category: 'shirts',   // id or slug; sub-categories are included
  search: 'oxford',     // name or SKU, any case
  sort: 'price_asc',    // newest · oldest · price_asc · price_desc · name_asc
  page: 1,
  limit: 24,            // up to 100
})
// { data: Product[], page, limit, total, totalPages }

const product = await dakio.products.get('oxford-shirt') // id or slug; null when not published

ids: ['…', '…'] fetches specific products, for a "recently viewed" row.

A product

FieldWhat it is
id, slug, name, skuIdentity. Link to /p/<slug>.
priceWhat checkout charges now, sale included
compareAtPrice, onSaleThe pre-sale price during a sale (else the merchant's higher compare-at price)
campaign{ id, name, percent } of the running sale, or null
imagesImage URLs, the first is the main photo
description, shortDescriptionSanitised HTML
contentTabs[{ key, title, html }] — Specifications, Size Guide, Shipping & Returns…
category{ id, name, slug } or null
attributes[{ name, values }] — the options a buyer picks, e.g. Size: S, M, L
variants[{ id, name, sku, attrs: [{ name, value }], price, compareAtPrice, stock, inStock }]
stock{ total, inStock }
isNew, createdAtisNew is true for 30 days after it’s added

A product with variants needs a variantId in the bag; checkout answers OPTION_REQUIRED otherwise. Find the variant whose attrs match the buyer's picks:

js
const pick = { Size: 'M', Color: 'Blue' }
const variant = product.variants.find(v => v.attrs.every(a => pick[a.name] === a.value))

Prices in description text are the merchant's own words; trust price.

Delivery

js
await dakio.shipping.get('Gazipur')   // { zone: 'outside_dhaka', charge: 120 }
await dakio.shipping.zones()          // both zones and their charges

Dhaka district pays the store's inside-Dhaka rate. Every other district, Gazipur and Narayanganj included, pays the outside rate. A quote applies the same rule, so what you show is what's charged.

Freshness

Prices, stock and sales change in Dakio at any time. In a server-rendered site, refresh catalog pages every minute or so, or instantly with a webhook (Next.js: createRevalidateRoute). The quote is always live, so checkout is never wrong even when a page is a minute old.

Something unclear or wrong? Tell us — or open an issue on GitHub.

CHECKOUT PAYMENTS · VERIFIED BY SSLCOMMERZ
Pay with Visa, Mastercard, bKash, Nagad, Rocket and 40+ methods — verified by SSLCommerzPay with Visa, Mastercard, bKash, Nagad, Rocket and 40+ methods — verified by SSLCommerz
© 2026 Dakio by Digidhaka Communication Limited. All rights reserved.
Trade License No. TRAD/DSCC/041467/2021 · Made for Bangladesh's entrepreneurs