← Back to work
TanStack StartPayload CMSReactPostgreSQLTailwind CSSTypeScriptPersonal Project

Marka Promosindo — A Souvenir Catalog That Runs Itself

A marketing site and product catalog for a Jakarta custom-souvenir business. I built the storefront and the CMS behind it, so the owner can update products, prices, and photos on their own instead of calling a developer every time.

Role

Product Designer & Full-Stack Developer

Timeline

2025–2026

Platform

Web (Desktop & Mobile)

Marka Promosindo homepage hero with a rotating stack of product photos

The Brief

Marka Promosindo makes custom-printed souvenirs and merchandise: tumblers, kipas, goodie bags, powerbanks, earphones, mostly for corporate events, weddings, and personal occasions. They already had a site, but it was static. Changing a price or adding a product meant editing code and redeploying, and for a catalog that turns over as often as theirs, that got in the way constantly.

The site had to do two things at once: make a small business look as trustworthy as a big one, and be something the owner could actually run. Products, hero images, and FAQs all needed to be editable by someone who doesn't write code, without the storefront getting slower or messier for it.

Visual Direction

Most souvenir vendors look cluttered and interchangeable. I wanted the opposite here: a catalog that reads more like a magazine than a marketplace. The brand's tagline set the tone, "Setiap Momen Layak Dikenang" (Every Moment Deserves to Be Remembered).

Warm palette
Ink (#1c1813) and brass (#b07a2b) on a cream (#faf9f7) background. Warmer than the usual cold black-and-gold luxury look.
Fraunces + Geist
Fraunces for headings, Geist for body. The serif carries the personality, the sans keeps everything readable.
Restrained motion
A tilted hero stack that rotates on its own, sections that fade in on scroll, and a marquee brand strip. All of it pauses under prefers-reduced-motion.
Holds up in print
The same palette carries into the PDF catalog, so the brand still works offline.

Key Pages

Homepage

Full Marka Promosindo homepage, from the hero down through categories, ordering steps, best-sellers, values, FAQ, and closing call to action

The homepage walks a visitor through the questions they'd ask anyway, roughly in order. Who is this (the hero, plus a few numbers: 30+ products, 5 categories, fully customizable). What do they make (a category grid). How do I order (three steps, "Pesan dalam 3 langkah"). What's popular (best-sellers). And can I trust them (values and an FAQ), before a final call to action.

Product Catalog

Marka Promosindo product catalog page with category filters, search, and a PDF export button

30 products across 5 categories, in a grid you can filter and search. The category chips carry live counts, search updates as you type, and all of it comes from the CMS. Two details I'm happy with: a quick-view modal with the gallery, price, and custom options, and an "Unduh katalog PDF" button that builds a branded, multi-page catalog right in the browser, which is handy when a sales rep needs to send the whole range over WhatsApp.

Marka Promosindo quick-view modal showing an image gallery, price, custom options, and a WhatsApp order button

Ordering over WhatsApp

Marka Promosindo contact page with WhatsApp and Instagram links next to an inquiry form

There's no checkout, because the business doesn't need one. Every "Pesan" button opens WhatsApp with the message already written out: product name, price, size, category. That's how buyers here actually order, and it drops the lead straight into the owner's chat.

Design and Engineering Decisions

A CMS the owner actually owns

The Payload CMS admin panel where the owner manages products, media, and FAQs

I set up Payload with collections for Products, FAQs, and Media, plus a Hero global. The owner adds a product, swaps a photo, or reworks an FAQ from the admin panel, and the live site picks it up. No redeploy, and no me in the loop.

Data fetched on the server

Route loaders in TanStack Start fetch from the CMS on the server, so pages arrive already filled in. That's better for SEO and first paint than shipping an empty shell and hydrating it in the browser.

Filters that live in the URL

Category and search are URL search params, validated where the route is defined. The upshot: filters are shareable, the back button behaves, and there are no surprises at runtime.

Performance and accessibility

Product images lazy-load, every animation checks prefers-reduced-motion, and uploads are optimized with Sharp and served from Vercel Blob.

Mobile laid out on its own

Marka Promosindo on a phone, with a stacked hero, drawer navigation, and full-width buttons

On mobile the hero stack drops away to keep the top of the page clean and the buttons in thumb reach, and the nav becomes a blur-backdrop drawer. I designed each breakpoint on its own rather than shrinking the desktop version to fit.

Tech Stack

TanStack Start
SSR storefront with server-side route loaders
React 19 + TypeScript
Component architecture, type-safe end to end
Payload CMS v3
Headless admin for Products, FAQs, Media, and a Hero global
PostgreSQL + Vercel Blob
Content store and Sharp-optimized media pipeline
Tailwind CSS v4
Utility styling with custom ink/brass design tokens
jsPDF + Sharp
In-browser PDF catalog; server-side image optimization

Outcome

The result is a real storefront with a CMS the owner keeps up to date without me: 30 products live, WhatsApp ordering, and a catalog they can export and send. It runs as two Vercel deployments, the storefront at marka-promosindo-website.vercel.app and the Payload admin (login-gated). Of everything in this portfolio, it's the project I owned the most of.

At BRI, design and development sit in separate teams. Marka was the opposite: I did the brand, the UI, the frontend, the backend and CMS, and the deployment, and handed over something the business can keep running on its own.