app.jointcommerce.com
Consumer Ordering Platform
Built from scratch. Grew 2,000 to 200,000 monthly users in 11 months. 100x. Powered the data side of a two-sided AdTech platform - the consumer app generated the first-party signal that fed the advertiser activation engine across 200+ accounts.
Why the consumer app existed
JointCommerce was a two-sided AdTech platform: a consumer side and an advertiser side. The advertiser side activates audience data - segments, lookalikes, intent signals, conversion attribution. But that data has to come from somewhere real.
The consumer ordering app was the somewhere. Every signup, every browse, every checkout, every repeat purchase produced first-party signal. The app didn't exist as a side project - it existed because without it, the advertiser side had nothing to activate. The whole platform thesis rested on owning the data, not buying it.
By month 11, 200,000 monthly active users were generating the behavioral signal that powered 200+ advertiser accounts. The two sides only worked together.
Architecture, from scratch
Nothing existed before I joined - no platform, no team, no codebase. The consumer app was built ground-up on a stack designed for fast iteration and clean instrumentation.
Next.js Consumer App
Server-side rendered storefront, product catalog, ordering flow, account management, loyalty. Built for crawlability and conversion - every page indexed, every interaction tracked.
Django Backend
Orders, user management, product catalog, multi-location inventory, loyalty programs, delivery tracking. 16 Django apps, 235 models. The operational core of the platform.
PostgreSQL
Transactional data store - users, orders, products, sessions, pixel events. Schema designed for analytics-friendly queries from day one. Read replicas for reporting workload.
Redis
Session store, page cache, hot product cache, rate limiting, async job queues. The reason the storefront stayed sub-200ms while traffic 100x'd.
AWS Infrastructure
EC2 compute, S3 for assets and exports, RDS for managed Postgres, CloudFront for static delivery. Vercel for the Next.js front-end. Scaled from 2K to 200K MAU with no rewrites.
Custom Pixel Tracking
Custom JavaScript pixel instrumented across every page and event - page views, product views, add-to-cart, checkout, conversions. The full ad-impression → purchase chain captured in real time.
Analytics Layer
Behavioral event stream flowing into the CDP - every signal joinable by user, device, and session. Feeds the audience activation pipeline on the advertiser side.
2,000 to 200,000 MAU. 11 months.
The curve speaks for itself. Month 1: 2,000 monthly active users. Month 11: 200,000. Driven by SEO content (55K articles, 13K directory pages), product-led growth, and a flywheel that fed itself.
How the consumer app fed the advertiser side
The consumer app wasn't valuable on its own - it was valuable because of what it fed. Every signup, browse, and purchase became signal. That signal became audiences. Those audiences drove ROAS. ROAS drove more advertiser spend. And advertiser spend reinvested back into the consumer app.
The data outputs
The consumer app's job was to produce signal. Here's what it actually produced.