

Software / Internal Platform
Industry: Marketing Agency Technology

397
TypeScript/TSX files shipped
In short
Arcetis built a single Next.js 15 platform for a digital marketing agency partner that combines its public website, an auth-gated admin CMS, an internal client and lead tracker, and a Stripe-powered digital-asset storefront with secure, expiring download links, all in one codebase. It is a real, actively operated production system, not a prototype, evidenced by live content updates, phone number changes, and WhatsApp integration shipped straight to production. The platform totals roughly 397 TypeScript/TSX files and 34,000 lines of code, covering content management, sales pipeline tracking, lead capture, e-commerce, and multi-industry campaign funnels.
A digital marketing agency partner needed more than a marketing website, it needed a way to run its actual business online. Before this platform existed, the agency partner's team was managing its own client relationships, inbound leads, and a growing catalog of sellable digital design assets across a patchwork of disconnected tools, none of which talked to the public site visitors actually used. Arcetis was brought in to design and build a single Next.js platform that could serve as the agency partner's public storefront, its internal operations hub, and its sales pipeline tracker at once. The result folds a content-managed marketing site, a lightweight CRM, a lead-capture inbox, a real e-commerce store for digital files, and reusable industry-specific campaign funnels into one authenticated, role-gated application backed by a single Postgres database, giving the agency partner one system instead of five.
The agency partner's day-to-day reality was familiar to many small, fast-moving digital marketing shops: the public website was maintained separately from the systems used to run the business behind it. Updating a service description, adding a new team member, or reordering the portfolio meant either editing code directly or waiting on a developer, because there was no content management layer built for the agency partner's own team to use. Meanwhile, tracking clients, who was a prospect, who was active, who had paused or churned, what their contract dates were, what they'd said in a testimonial, lived in whatever spreadsheet or notes app was handiest, disconnected from the site that generated the leads in the first place. Contact-form submissions had nowhere structured to land; someone had to manually check an inbox and remember to follow up, with no record of the visitor's IP, user agent, or prior notes attached to the inquiry. On top of running its own operations, the agency partner had also started selling digital design assets directly, PSD, AI, SVG, PDF, Sketch, and Figma/XD files, which meant it needed genuine e-commerce infrastructure: real checkout, real order records, and a way to deliver paid digital files securely rather than just emailing a link that could be forwarded indefinitely. And because the agency partner's own growth model depends on pitching prospective clients in specific industries, it needed repeatable, on-brand landing pages it could stand up quickly for verticals like restaurants and watersports operators, rather than building each campaign page from scratch. None of these needs were independent, the same team, the same brand, and often the same underlying data connected all of it. The challenge for Arcetis was to design one coherent platform, not four separate tools bolted together, that could handle content management, internal operations, digital commerce, and campaign infrastructure under a single authentication and data model, without over-building a system so complex that the agency partner's own small team couldn't operate it day to day.
Arcetis served as the sole design and development partner for the platform, responsible for architecture, implementation, and production deployment from the ground up. Arcetis designed the Postgres schema spanning company content, team members, services, pricing tiers, portfolio entries, clients, inquiries, orders, and download tokens, and built it out using Drizzle ORM with versioned drizzle-kit migrations. Arcetis implemented authentication and role-based access control with better-auth, wired up Stripe checkout and webhook handling for the digital-asset store, built the expiring, rate-limited download-token system, and integrated Upstash Redis, Resend, and UploadThing for rate limiting, transactional email, and file delivery respectively. Arcetis also built the drag-and-drop admin dashboard, the internal client tracker, the lead-capture pipeline, and the reusable landing-page component libraries for the agency partner's industry-vertical funnels, and diagnosed and resolved the Hostinger-specific production deployment issues that got the platform live.
Arcetis built an auth-gated admin dashboard giving the agency partner's team direct control over its own public website, company information, team member profiles, quick facts, FAQs, services and service features, pricing tiers, and portfolio entries, without touching code. Every content type supports drag-and-drop reordering and an active/inactive toggle, so the team can resequence what visitors see or temporarily hide an item without deleting it. This turned the marketing site from a developer-dependent asset into a self-service tool the agency partner's own staff maintains.
A lightweight CRM built directly into the platform tracks every client relationship through a status pipeline, prospect, active, former, or paused, alongside primary contact details, contract start and end dates, testimonials, ratings, and internal notes. Rather than adopting a separate CRM product, the agency partner's team manages its actual client roster inside the same system that runs its website, keeping relationship history, contract terms, and the testimonials later reused in the portfolio all in one place.
Every contact-form submission on the public site is captured into a structured inquiries table, name, email, phone, message, IP address, user agent, and space for internal follow-up notes, instead of arriving as an unstructured email. This gives the agency partner's staff a durable, searchable record of every inbound lead, with the metadata needed to prioritize and follow up systematically rather than relying on memory or a shared inbox.
Arcetis built a genuine e-commerce store for the agency partner's digital design assets, PSD, AI, SVG, PDF, Sketch, and Figma/XD files, powered by Stripe checkout with full order and order-item records. Purchased files are delivered through an expiring, rate-limited download-token system rather than static links: tokens enforce a maximum download count, can be revoked, and support a dedicated redownload endpoint, making this a real digital-delivery system rather than a simple cart bolted onto a marketing site.
To support the agency partner's own client-acquisition pitching, Arcetis built dedicated marketing landing-page funnels for at least two industry verticals, restaurant offers and watersports booking, each backed by its own reusable component library covering countdown offers, pricing sections, testimonials, and what-you-get sections. These give the agency partner ready-made, on-brand campaign infrastructure it can stand up quickly when pitching prospective clients in a given industry, rather than building each pitch page from scratch.
The platform is a single Next.js 15 application built on the App Router, using Turbopack for local development, React 19, and TypeScript throughout. Styling runs on Tailwind CSS 4 with a shadcn-style component system built on Radix UI primitives, and Framer Motion handles animation across both the marketing site and the vertical landing-page funnels. The entire codebase, roughly 397 TypeScript/TSX files and about 34,000 lines, lives in a single pnpm workspace, with ESLint, using the Antfu config, Prettier, and Husky/lint-staged pre-commit hooks acting as the primary quality gate. Data lives in Postgres, accessed through Drizzle ORM with drizzle-kit-managed migrations, using the Neon serverless Postgres driver in production and Docker Compose for local development so the schema and query layer behave identically in both environments. The schema covers every domain the platform serves: CMS content (company info, team members, quick facts, FAQs, services and service features, pricing tiers, portfolio entries), the internal CRM (clients, with pipeline status, contact info, contract dates, testimonials, ratings, notes), lead capture (inquiries, with contact details, message, IP/user-agent metadata, and internal notes), and commerce (orders, order items, and download tokens). Keeping all of this in one Postgres database, rather than splitting the CMS, CRM, and store across separate systems, is what lets a lead convert into a client and a client testimonial flow into the public portfolio without manual re-entry. Authentication runs on better-auth, supporting email/password login alongside Google and Facebook social login, with role-based access control enforced in middleware so the entire admin CMS, client tracker, and inquiry inbox sit behind a single authenticated, authorized boundary rather than being protected page by page. The digital-asset storefront is the most operationally sensitive piece: checkout runs through Stripe, with webhook handling that creates order and order-item records once payment is confirmed. Rather than emailing a static download link, the platform issues download tokens that expire, enforce a maximum download count, can be revoked by staff, and support a dedicated redownload endpoint for legitimate repeat access within the allowed limit. Upstash Redis backs the rate limiting that protects both the download endpoints and other sensitive routes from abuse. Resend handles transactional email, order confirmations and notifications, and UploadThing handles file storage and CDN delivery for both the purchasable design assets and CMS-managed media like portfolio images and team photos. Vercel Analytics is wired in for basic usage visibility. Production deployment is a real, ongoing operational story rather than a one-time setup. Internal documentation describes a Vercel deployment path, but the platform actually runs in production via Hostinger's Git auto-deploy, and the commit history includes genuine fixes for Hostinger-specific build issues, esbuild and sharp permission errors, and pnpm build-script allowlisting, that had to be resolved to get builds succeeding on that host. Later commits seed real company, pricing, FAQ, and portfolio content directly into the production database and make live operational changes, including updating the agency partner's live phone number and adding WhatsApp as a contact channel, confirming this is an actively used production system rather than a static demo.
Digital-asset purchases are protected by a download-token system, not a static link: each token expires, enforces a maximum number of downloads, can be revoked by staff, and is served through a dedicated redownload endpoint for legitimate repeat access within the allowed limit. Upstash Redis backs rate limiting on these and other sensitive routes. This turns what could have been a simple email-a-zip-file cart into genuine digital-delivery infrastructure, protecting the agency partner's paid design assets from casual redistribution while still letting legitimate buyers redownload their purchase.
Rather than one-off campaign pages, Arcetis built a shared component library, countdown offers, pricing sections, testimonials, what-you-get sections, reused across at least two industry-specific funnels, restaurant offers and watersports booking. Built with Framer Motion and the same Radix/Tailwind design system as the rest of the platform, these components let the agency partner assemble a new, on-brand pitch page for a prospective client's industry quickly, turning campaign-page creation into configuration rather than custom development each time.
Internal documentation describes a Vercel deployment path, but the platform's real production home is Hostinger's Git auto-deploy, and the commit history shows the actual work of getting it there: fixes for esbuild and sharp permission errors and pnpm build-script allowlisting specific to that host's build environment. Combined with commits seeding live company, pricing, FAQ, and portfolio content and updating the agency partner's live phone number and WhatsApp contact, this is clear evidence of a genuinely operated production system, not a deployed-and-forgotten prototype.
A single better-auth integration handles email/password login alongside Google and Facebook social sign-in, with role-based access control enforced centrally in Next.js middleware. That one boundary protects the entire admin CMS, the internal client tracker, and the lead-inquiry inbox, so authorization is a single, consistently enforced concern rather than something re-implemented per page or per feature across the platform.
TypeScript/TSX files shipped
lines of production code
Technology used
Key learnings
Building one platform instead of four separate tools was the right call for a team the size of the agency partner's, a single Postgres schema and a single authenticated application meant a lead, a client, a testimonial, and a portfolio entry could all reference the same underlying data instead of living in disconnected systems that needed manual reconciliation. The tradeoff is that the platform's own internal documentation describing a Vercel deployment fell out of sync with reality once the agency partner moved production to Hostinger, a reminder that documentation drifts unless deployment changes are treated as first-class, not incidental. The clearest deliberate tradeoff, though, was around test coverage. The platform ships with no automated test suite and no CI pipeline; ESLint, Prettier, and Husky/lint-staged pre-commit hooks are the only quality gates, and the Next.js build configuration explicitly ignores lint and type errors at build time. That is not an oversight, it is a considered choice for an internal, agency-operated tool where shipping working features quickly mattered more than exhaustive automated verification, and where the people using the admin CMS and CRM are the same people who can flag a bug the moment they see it. It is an honest tradeoff worth naming plainly: this is a pragmatic, ship-fast internal platform, not an over-engineered enterprise system, and it was built and evaluated with that context in mind rather than against a standard that didn't fit its actual use.
All three, in one Next.js codebase. It is the agency partner's public marketing website, an internal admin CMS and lightweight CRM for managing clients and leads, and a real e-commerce store selling digital design assets via Stripe, unified under one authentication system and one Postgres database instead of separate disconnected tools.
Purchases don't produce a static download link. Instead, the platform issues an expiring download token tied to the order, enforces a maximum number of downloads, can be revoked by staff, and is served through a dedicated redownload endpoint, backed by Upstash Redis rate limiting, so legitimate buyers can redownload within limits while casual redistribution is constrained.
It is genuinely in production. The commit history includes fixes for real Hostinger-specific deployment failures, seeding of live company, pricing, FAQ, and portfolio content into the production database, and operational updates like changing the agency partner's live phone number and adding WhatsApp contact, all clear signs of an actively operated system, not a shelved prototype.
It was a deliberate tradeoff, not an oversight. As an internal tool built to ship quickly for a small agency team, quality is enforced through ESLint, Prettier, and Husky/lint-staged pre-commit hooks rather than automated tests or CI, and the build configuration explicitly ignores lint/type errors, a pragmatic choice suited to its actual scale and use, not a hidden flaw.