Skip to content

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.

What the agent does

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
01
The problem

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.

02
Outcomes

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.
03
How it works

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.

The Neo4j graph model. A Customer places orders, owns and rates Products, and answers quiz questions. A Product is made by a Brand, sits in a Category, contains Ingredients, targets Concerns, and is used in a RoutineStep. The Product Match Widget traverses from a Customer to a Product to score fit.

The Neo4j graph model. A Customer places orders, owns and rates Products, and answers quiz questions. A Product is made by a Brand, sits in a Category, contains Ingredients, targets Concerns, and is used in a RoutineStep. The Product Match Widget traverses from a Customer to a Product to score fit.
Open standards used
REST APIs
Tech stack
Neo4j 5Next.js 15TurborepopnpmDocker ComposeSentence-transformer embeddings
Next step

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.

Your details go to a named contact on the MACH Alliance team that built this work and can answer your questions. We aim to reply within 2 business days. Your details are handled under the MACH Alliance privacy policy.

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.

Keep reading

Related solutions

  • MACH Alliance logo

    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 Hackathon
  • MACH Alliance logo

    Wholesale buyers place and change orders in plain language, and see the price they will actually pay.

    SynapseAI B2B Wholesale

    AI Exchange Hackathon
Verification

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.

Status: Reference prototypeAdded Jun 2, 2026A listing is an editorial decision, not a MACH Alliance certification.

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.