City-break shoppers see every hotel on a map next to the points of interest they care about, with walking routes and what guests say.
IPSY Customer Preference Knowledge Graph
Product recommendations arrive with a reason a shopper can read, not only a score.
A Neo4j graph of customers, products, reviews, and quiz answers, traversed live to score whether a product fits.
Traverses a graph of customers, products, reviews, and quiz answers to decide whether a given item suits a given shopper.
- Brand
- IPSY
- Contributed by
- MACH Alliance (Hub operator)
- Industry
- Retail, CPG
- Audience
- B2C
Why this exists
A beauty subscription has to decide, for each customer, whether a specific product is worth putting in the box. The signals that answer that are relational: what this customer bought, what they reviewed and how, what they said in the beauty quiz, and how the product relates to other products they liked.
Read more
Stored in tables, those relationships are joins, and the useful questions are several joins deep. A recommendation built that way is expensive to compute and hard to explain, which matters because the customer-facing question is not only whether this is a match but why.
What this demonstrates
- A Product Match Widget that traverses the graph in real time to determine whether a product is a good fit for a specific customer, suitable for placement on a product detail page.
- A match explanation that streams from a language model, so the score comes with a reason rather than only a number.
- A force-directed graph visualizer and a control panel exposing customer profiles, inventory, order history, and graph statistics.
Read more
- An ingestion pipeline that loads roughly 10,000 products, 10,000 reviews, user profiles, orders, quiz responses, and subscription ratings into the graph.
- Built as a working prototype at a hackathon, not a production deployment. The hub records it as such.
Architecture
The graph runs on Neo4j 5 Community Edition in Docker Compose. A graph-service package holds the driver singleton, schema constraints and indexes, query functions, the CSV ingestion pipeline, TypeScript interfaces, and Neo4j type serialization. Serialization is its own concern for a reason: Neo4j's integer and temporal types do not survive a naive JSON round trip.
Read more
The control panel is a Next.js 15 App Router application with four tabs, backed by API routes for match scoring, streaming match explanation, graph visualization data, statistics, the customer list, and per-customer profile, inventory, and history.
Source data covers customer profiles, a catalog of around 10,000 products, product reviews and ratings, user-order-product relationships, user-specific reviews, subscription ratings, order history, and beauty quiz responses, plus crawled blog metadata with sentence-transformer embeddings for content matching. Those files are supplied separately rather than committed.
The repository is a Turborepo monorepo using pnpm workspaces, with the graph service and the control panel as separate packages. The language-model explanation is optional: without an API key the match score still computes, which keeps the graph traversal and the narration independently testable.
Take the code
This one is published in full. Read it, run it, fork it. Nothing here is behind a conversation.
Request an intro
This one is the MACH Alliance’s own work. Ask about explaining why a product fits, and the people who built it will answer.
Not ready to talk to anyone? MACH Insider is the Alliance mailing list. New solutions, program openings, and the research behind them, once a month.
Related solutions
- AI Exchange Hackathon
Golfers describe a trip in their own words and get resorts ranked on what similar groups actually booked, with the reasons shown.
Your Golf Travel AI Trip Advisor
AI Exchange HackathonWholesale buyers place and change orders in plain language, and see the price they will actually pay.
SynapseAI B2B Wholesale
AI Exchange Hackathon
Public code
The implementation is published in full, so anything on this page can be checked against the repository. Anything the repository does not show is not established here.
Where this came from
Built at a MACH Alliance AI Exchange Hackathon. The source CSV and blog data files are not committed to the repository and must be supplied separately. The repository does not record who took part, so the organizations credited here come from the AI Exchange contributors slide. Individuals are not published, only the organizations they represented.
Built something worth showing?
Put your agentic solution in front of the enterprise leaders who use the hub to decide what to build next. Submissions are open to MACH Alliance Members, Collaborators, or Ambassadors.





