EcommerceBilingualD2CCRM

MorningKicks — Bilingual D2C Ecommerce + CRM

An English + Egyptian-Arabic ecommerce platform with a built-in CRM, built on the same operating-system stack as my pest-control company. One operator. One codebase. Two markets.

MorningKicks — Bilingual D2C Ecommerce + CRM preview
Open live →

The Problem

Most ecommerce platforms assume English-first. Most CRMs assume a separate marketing stack from the storefront. Neither assumption survives contact with a brand that ships to North America and the MENA region from one stockroom, with one operator, and a customer base that flips between English and Arabic mid-conversation.

So I’m building the storefront-plus-CRM stack the way an operator actually needs it.

The Architecture

Same operating-system pattern as my pest-control build, retuned for ecommerce:

  • Next.js 16 storefront — server components, next-intl for bilingual routing, RTL/LTR layout switch at the page level (not the component level).
  • Drizzle ORM + Postgres — single schema. Customers, orders, conversations, refunds, returns all in the same database as the marketing CMS.
  • Auth.js v5 — customer login + admin login behind the same provider, with role-scoped sessions.
  • Built-in CRM — every storefront event (cart add, abandoned cart, post-purchase reply) lands as a CRM record. No Klaviyo, no separate Stripe-emails stack.
  • Tailwind v4 — design tokens are bilingual-aware (typography scales differ for Arabic).

The Bet

The brand is the product. The platform is the brand. If I run both ends of the operation, every UX decision — translation tone, return policy text, “thank you” email — lives in code I can change in an hour, not a vendor’s settings panel I can’t change at all.