Shoppers see what they actually want, the instant they land. A TensorFlow-powered engine turns clickstream noise into +23% revenue, $680K a year, with sub-50ms recommendations.
Generic best-seller lists ignored intent: a returning shopper saw the same homepage as a first-time visitor. Conversion stalled because relevance was static while behavior was not.
We split the problem in two, a two-tower retrieval model to find what's plausibly relevant, and a deep ranker to order it by predicted conversion. Redis absorbs the read load so personalization never costs page speed.
Every impression and click is logged back to PostgreSQL as a training label, so yesterday's behavior shapes today's model. A nightly retrain on AWS GPUs refreshes embeddings and pushes new weights behind a holdout group.
An always-on A/B holdout keeps the +23% number honest, uplift is measured against users who never see the engine, not against a guess.
| Component | Technology | Why |
|---|---|---|
| Model training | TensorFlow | Two-tower embeddings plus a deep ranker in one framework |
| Online serving | Redis | Sub-millisecond reads for cached top-N per user |
| System of record | PostgreSQL | Durable events, catalog, and A/B assignments |
| Infrastructure | AWS | Kinesis ingest, S3 features, GPU training, ECS serving |
| Glue & APIs | Python | Shared feature logic across training and inference |
Separate user and item towers let candidate generation scale to millions of SKUs via ANN lookup.
Per-user top-N is precomputed and cached in Redis for sub-50ms storefront responses.
Content-based item embeddings cover new users and freshly added products before behavior accumulates.
Automated nightly pipelines retrain on fresh labels to track shifting taste and seasonality.
Margin, inventory, and merchandising constraints are applied after ML scoring without retraining.
Built-in control groups attribute revenue lift cleanly and guard against silent model regressions.
“"We didn't make the catalog bigger, we made every shopper's first screen feel hand-picked."”
The engine turned a static, one-size-fits-all storefront into a per-shopper experience that learns every night. Measured against a live holdout, personalization drove a 23% revenue lift and an 18% jump in conversion, roughly $680K of incremental annual revenue, while Redis kept the experience under 50ms at the moment of purchase. The result is a self-improving system: the more customers shop, the sharper the recommendations get.