Go home
2025

Marn

Marketing site rebuild for a Saudi POS platform — bilingual AR/EN, block-driven CMS, migrated off WordPress.

Marn home page hero
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

Marn home page hero on desktop

Home — full-bleed hero over an in-store photo, with the primary contact CTA.

Marn Cashier System solution page on desktop
Cashier solution page — the shared solution template with a blue module accent and product illustration.
Marn Analytics solution page on desktop
Analytics solution page — same template, purple accent, swapped illustration and copy.
Marn marketplace on desktop
Marketplace — searchable app directory with category, ecosystem, and sort filters.

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.

Marn ecosystem section with Sales, Operations, and Management columns

Business segments

An accordion that reframes the same product for restaurants, cafes, and other businesses without duplicating pages.

Marn business segments accordion

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.

Marn "Designed for Your Success" card row

Capability cards

Feature blocks pairing copy with product screenshots — order channels, payments, ZATCA compliance, inventory, and reporting.

Marn capability cards for orders and payments

Compliance and data

ZATCA e-invoicing, real-time inventory, and analytics surfaced as a three-up with in-app screenshots.

Marn ZATCA, inventory, and analytics cards

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.

Marn integrations logo grid

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.

Marn contact form and mega-footer

Mobile

Marn home page on mobile
Marn Cashier solution page on mobile
Marn marketplace on 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.

Visit marn.byvalence.com  →