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.
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-intlfor 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.