Two goals: make offers impossible to miss, and stop looking like a generic shop. Every mockup uses live Shajgoj products, prices, sale end dates and offers from today's APIs. The page walks through the app one tab at a time.
Applies to every screen
Used identically on cards, product pages, filters and the cart, so customers learn to spot them:
Home · Shop · Deals · Blog · Chat. Deals is the highlighted centre tab. Brands and Categories merge into Shop. Chat keeps its tab and unread dot. The account moves to the round avatar in the header, where the app already has a profile icon.
Serif headings (Fraunces) for English, Source Sans for body, Noto Sans Bengali for Bengali.
Directions → chosen design → banners
B's look with A's offer features.
Hero → Your offers → Ending soon → Shop by offer → The Deal Edit → Coupons → Routines → Biggest savings → From the blog.
The home page stays a page-builder page (/api/pages/app-index): an ordered list of widgets that marketing controls from admin, as today.
| Widget kind | Examples | Who fills it |
|---|---|---|
| Existing widgets, restyled | slider, banner grids, product rows, quick links, customer profile → "Your offers" | Admin, as today |
| New live widgets | Ending soon, Shop by offer, The Deal Edit, Coupons, Free delivery by brand, Routines | Admin sets placement, title and a few settings; the app fills them from live data |
If a page has no configuration, the app uses a built-in default order.
Every slider slide and image banner on today's home page is sold to brands. Measured from the live app-index page:
is_ad is always 0 and labels don't match images.Keep the header slider as the premium sold slot and a limited number of banner placements (one between each pair of live sections, no more than 6–8). Ask for less offer text inside banner images. Add sponsored product cards and sponsored brand positions as extra inventory, and move advertisers over as tracking proves the new formats.
Version 1 uses the real banners from today's home page. Open "Full length + slot labels" to see every sold slot outlined in orange and every live widget in green.
Several banner labels don't match the image (e.g. "Simple" on a Skin'O banner). For per-brand reporting to advertisers, the label must name the real advertiser; the app can then log impressions and taps per banner to analytics with no backend work.
| Element | Source | Backend |
|---|---|---|
| Page structure, banners | /api/pages/app-index page builder | Existing |
| Discount %, "You save ৳…" | Product search: price, sale_price | Existing |
| Stock, sold this week | Product search: stock, weekly_sales | Existing |
| Countdown on a product | Product search: sale_end_date | Existing |
| "Ending soon" list | Needs products ordered by sale_end_date; the index can't filter or sort on it today (tested) | Small backend |
| Your offers card | Cart free_delivery_offer, loyalty points, saved vouchers | Existing |
| Shop by offer, coupons | /api/available_offers | Existing |
| Buy 1 Get 1 | Existing buy-1-get-1 category (used by today's home tile) | Existing |
| Routines | Combo products, items in product_groups | Existing |
| Blog article | Blog API | Existing |
| Live widgets in admin | Register new widget types in the page builder | Small backend |
| Campaign hero text (B style) | Optional text fields on slider slides | Small backend |
New centre tab
Every live offer in one place, filterable by offer type.
A page-builder page (e.g. app-deals) using the same live widgets as Home, so marketing can reorder sections and sell banner slots here too: a new page of inventory. The filter row is fixed app UI. With no configuration, the app uses a default order.
| Sections and filters | Product search + /api/available_offers | Existing |
| Your vouchers | Saved vouchers API | Existing |
| Page layout | Page builder (new app-deals page) | Admin setup |
The live free-gift offer's gift item has 0 stock. The app should hide gift offers whose gift is out of stock.
No sales ending this week means no Ending soon panel, never an empty box.
If every offer section is empty, the page falls back to Biggest savings from sale products.
The coupons area invites collecting a coupon instead of an empty list.
The empty "Free gift" state is realistic today: the only live gift offer's item has 0 stock, so once out-of-stock gifts are hidden, this is what customers would see.
Browse → results → filters
Categories and Brands in one tab. Opens as a browsing screen, not a product list: Home and Deals already lead with products, Shop is for "I know what I need".
icon: "empty", img: null).Every tap on the Shop screen (sub-category, concern, brand) opens one shared results screen with that filter applied. Shown: Skin → Pigmentation.
A 2-column grid of savings-first cards that loads more as you scroll. Every few rows it inserts a sold banner slot (category and brand pages have banners today, labelled "Sponsored") or an "Ending soon in Pigmentation" strip, by fixed rules so it never becomes a wall of banners.
"Filters" opens a bottom sheet: sections on the left, options on the right.
The same results screen opened from a category (Skin › Face › Serums & Oils), with an inline free-delivery nudge for a brand in the list ("Himalaya: free delivery over ৳999").
| Menu tree, brands | /api/menu/get-menu, get-menu-brands | Existing |
| Results, filters, counts | Product search, facet counts | Existing |
| Filter sheet | Existing filter sheet logic, restyled | Existing |
| Concern | Existing "Shop By Concern" categories (category filter) | Existing |
| Free delivery, Buy 1 Get 1 filters | Existing "Free Delivery" and buy-1-get-1 categories | Existing |
| "On sale" filter | has_sale isn't filterable in the index today (tested) | Small backend (optional) |
| Sort by biggest saving | Saving amount in the search index | Small backend |
| Banner slots in results | Category/brand page designs | Existing |
Opened from Shop, search or a banner. Shown with Himalaya's real data.
| Products, stats, best sellers | Product search filtered by brand (weekly_sales, facets) | Existing |
| Brand offers | /api/available_offers (offers carry their brand) | Existing |
| Banners | Brand page design (page builder) | Existing |
| Logo, tagline | Not available today | Optional admin content |
From the search icon on any screen
| Suggestions, brand and category matches, product hits | khoj.shajgoj.com/suggestions (returns suggestions, brands, categories, hits) | Existing |
| Recent searches, recently viewed | Stored on the device | App only |
| Trending searches | Admin-curated list, or search analytics | Small backend (optional) |
Leads with the saving, and gathers every offer that applies.
| Price, stock, sales, end date | Product API | Existing |
| Offers on product | Product available_offers + coupons | Existing |
| Pairs well with | Recommendations (reco.shajgoj.com) | Existing |
Product photos are marketing graphics with prices baked in (e.g. "1099 TAKA"), which repeat the live price and go stale. Clean product photos for app use would fix it.
Opens with how much you're saving, then shows how to save more.
| Free-delivery progress | Cart free_delivery_offer | Existing |
| Savings total | Price − sale price per line | Existing |
| Coupons, vouchers | Existing cart and voucher APIs; points → voucher purchase as today | Existing |
One page, three clear steps: Bag → Details → Done.
| Payment methods | /api/available-gateways (cod, bkash, card, upay) | Existing |
| Address, order, totals | Existing checkout and cart APIs | Existing |
Opened from the header avatar
Everything the current profile screen has, reorganised around what people come here for.
| Profile, orders, wishlist | Existing user, order and wishlist APIs | Existing |
| Points, vouchers | Existing loyalty and voucher APIs | Existing |
| Stores | shajgoj-outlets | Existing |
/api/available_offers: coupons, 26 free-delivery offers, free gifts.has_sale filterable, for an "On sale" filter.