Brands & Ventures · E-commerce · US Manufacturing
SignzArt
Co-founded a US commercial-signage company and single-handedly built its full technical stack — storefront, custom-quote commerce, CRM and order ops.
THE WORK
The Situation
A signage company is two businesses wearing one coat: a storefront that quotes, and a factory that builds.
SignzArt is a US commercial-signage venture — American design, overseas manufacturing, UL-certified. I am one of three co-founders and the sole developer. The company needed an end-to-end commerce and operations system built from zero. American navy and red. USD only.
The Job-to-be-Done
When a customer needs custom commercial signage,
I want to quote, sell and route each order into manufacturing and CRM automatically,
So I can run the business without manual glue between tools.
The brief was premium commercial signage, transparently priced. Most signage buying is opaque — a form, a wait, a phone call. The job was to remove the glue between those steps.
The Approach
I started from the seam, not the screen. Custom signage does not have a single price; it has a pricing function. So I separated the pricing engine from the pricing data — pure functions over range-based tables, with cost-floor validation so no configuration can quote below margin, and weight-slab shipping derived from carrier rates. Eight product categories, six self-serve calculators, all reading from the same tables.
The second decision was to treat commerce and operations as one system, not two integrations bolted together later. A quote, a checkout, a manufacturing handoff and a CRM record are the same order at different moments. I built the whole thing as a Turborepo monorepo so the web app, the worker and the database share one typed contract.
The third was to keep the request path thin. Anything that talks to a third party — Stripe, HubSpot, Resend, inbound email — happens off the request, on a queue. The storefront stays fast; the slow, failure-prone work runs where it can retry.
The System
The monorepo runs a Next.js 16 and Payload CMS 3 web app alongside a dedicated long-running BullMQ worker, both sharing a Drizzle/Postgres database package and ten headless CMS collections. Between them sits a decoupled async pipeline: five typed BullMQ queues — email, webhook, order, CRM and sequences — on Redis, with a scheduler and graceful shutdown. Webhook ingestion for Stripe, HubSpot, Resend and inbound email lands on the webhook queue rather than the request path; Stripe handles checkout and Resend handles transactional mail.
On top of the order spine, a lead-scoring service pairs a pure scoring engine with DB persistence — time-decay, tier derivation — firing hot-lead alerts and syncing to a HubSpot custom property. A full B2B/wholesale portal API covers products, orders, quotes and invoices with balance and pay, behind NextAuth on the Drizzle adapter. Media moves through S3 presigned uploads fronted by a private media proxy. The stack is containerized on Dokploy/Hetzner with health checks.
Status
Live, and in active build. The storefront, pricing calculators, queues, CRM sync and wholesale portal are running; the platform continues to grow alongside the business it serves.