Marn
Marketing site rebuild for a Saudi POS platform — bilingual AR/EN, block-driven CMS, migrated off WordPress.
- Year
- 2025
- Client
- Marn
- Role
- Frontend engineer
- Timeline
- 8 weeks from kickoff to launch
Overview
Marn is a Saudi point-of-sale platform for restaurants, cafes, and retail. Its existing marketing site ran on WordPress with WPML for Arabic, and the page-by-page structure had drifted into inconsistent layouts that were slow to render and hard to keep in sync across two languages. The rebuild moves the whole site onto Next.js and Payload CMS — one block library composes every page, content is Arabic-first with an AI-assisted English mirror, and the marketing team edits everything (solutions, integrations, the marketplace, the blog) without touching code.
Goals
Marn’s marketing site had grown on WordPress, with WPML carrying the Arabic translations. Over time the pages drifted apart — each one assembled by hand — so layouts were inconsistent, the Arabic and English versions fell out of sync, and the plugin stack made the site slow to render and awkward to extend.
The brief was to rebuild it on a single content model: Arabic-first, fast, and editable end to end by the marketing team. Every page type — solutions, integrations, the marketplace, the blog — had to come out of one shared system rather than a folder of bespoke templates.
Approach
I mapped the IA down to a handful of repeating patterns and built the site as a block-based layout builder in Payload: around twenty blocks (hero, features, pricing, FAQ, logos, testimonials, marketplace, forms, and more) that compose every page. The ten solution pages all run on one template, distinguished only by an accent color, an illustration, and CMS copy — Cashier in blue, Analytics in purple, and so on.
Content is Arabic-first. A Payload translator plugin uses the AI SDK with Google Gemini to draft the English mirror from the Arabic source, so editors review a translation instead of writing one twice, and next-intl flips the whole layout between RTL and LTR per locale. Integrations, customers, testimonials, and logos live in their own collections, the marketplace is a filterable directory backed by those records, and the contact forms run through the form-builder plugin. On top of that form-builder I wrote a custom plugin that integrates HubSpot: it pulls form definitions straight from HubSpot and renders them with the site’s own components rather than HubSpot’s embed — so the forms inherit the design system and RTL behaviour — then posts submissions back to HubSpot to create contacts while persisting the same data to Payload. The forms also save as the visitor types, so a half-finished entry is kept and restored when they come back instead of starting over. The site ships to Cloudflare Workers via OpenNext, with media in R2.
Result
The site now runs entirely off Payload — no WordPress, no WPML — with one block library behind every page and both languages maintained from a single source. The marketing team publishes solution pages, marketplace apps, integrations, and posts on their own, and the Arabic and English versions stay in step because one is drafted from the other rather than maintained separately.
Desktop
Home — full-bleed hero over an in-store photo, with the primary contact CTA.
Pages & sections
Site tour
Ecosystem overview
A three-column split — Sales, Operations, Management — each linking out to its underlying solution pages. The product UI thumbnails are real Arabic-language screenshots from the app.
Business segments
An accordion that reframes the same product for restaurants, cafes, and other businesses without duplicating pages.
Why Marn
A photo-led card row — "with you wherever you sell", "knows your challenges", "scales with your business" — closing on a dark contact card.
Capability cards
Feature blocks pairing copy with product screenshots — order channels, payments, ZATCA compliance, inventory, and reporting.
Compliance and data
ZATCA e-invoicing, real-time inventory, and analytics surfaced as a three-up with in-app screenshots.
Integrations grid
An animated tile grid of partner apps — STC Pay, Order, Foodics, and others — pulled from the Integrations collection so the team can rotate them without a deploy.
Footer and lead form
A form-builder contact form above a mega-footer that doubles as the sitemap, with the language switcher and Saudi regulatory marks.
Mobile
Under the hood
Technical details
Stack
- Next.js 15 (App Router)
Server components for the marketing pages, with Payload's content fetched at the edge per locale.
- TypeScript
Types generated from the Payload schema flow straight through to the block renderers.
- Payload CMS 3
The whole site is a block-based layout builder — pages, solutions, integrations, posts, and the marketplace are all editable documents.
- PostgreSQL
Payload's database, holding the bilingual content tree and the collection relationships between solutions, integrations, and categories.
- Cloudflare (OpenNext + R2)
Deployed to Cloudflare Workers via OpenNext, with media stored in R2 and served through Payload's media endpoint.
- next-intl
Arabic-first routing with a full English mirror. Layout flips to RTL for /ar and LTR for /en.
- AI SDK (Google Gemini)
A Payload translator plugin drafts the English mirror from the Arabic source so editors review rather than retype.
- HubSpot (custom Payload plugin)
A plugin I built on top of the form-builder that pulls form definitions from HubSpot and renders them in the site's design system instead of as an embed; submissions create HubSpot contacts and are persisted back to Payload.
- Tailwind CSS v4
Design tokens for the brand palette and the per-module accent colors used across the solution pages.
- Motion
Restrained reveals on section entry and the integrations logo grid.
Features
- Bilingual Arabic/English with full RTL support and locale-aware routing
- Arabic-first content with an AI-drafted English mirror editors review in Payload
- Block-based layout builder — every page composed from a shared set of ~20 blocks
- 10 solution pages (Cashier, PaySync, Kiosk, Order Station, Products, Inventory, Analytics, Branches, Customers, Accounting) on one template
- Per-module accent colors carried through hero illustrations and section cards
- Marketplace with search and category/ecosystem/sort filtering
- Integrations, testimonials, customers, and logos managed as Payload collections
- Form builder powering the contact and lead-capture forms
- Custom Payload plugin extending the form-builder to pull HubSpot form definitions and render them in the site's design system
- Form submissions sync to HubSpot as contacts while persisting to Payload
- In-progress form entries auto-saved so visitors resume where they left off
- Draft preview and live preview for content editors
- SEO, redirects, nested-docs, and search plugins wired into the CMS
- Migrated off WordPress + WPML onto a single content model
See it live
Open marn.byvalence.com in a new tab.