Skip to content

Two shops selling the same thing were incomparable until the catalog was shared

A directory where every local business keeps its own inventory and reviews, and a shared catalog suggests products as they're added. A search for one item finds it in four shops instead of finding four spellings of it.

Aislemarkvoltmere aa Cedar BendJM

Catalogue product

cat_4H2K91

Voltmere AA Alkaline Batteries

8-pack · Voltmere · Household › Batteries · UPC 0 84213 55120 7

“voltmere aa” matched this entry, then every shop linked to it

6

shops have it

$8.99 – $11.25

6 shops in Cedar Bend

One product · each shop's own price and stock
Price, low to highNearestOpen now From Maple Ave & 3rd St
#ShopDistanceStockOpen untilTheir price
1Pine Street General41 Pine St 4.5 (63)0.3 miIn stock · 148 PM$8.99
2Hadley Hardware212 Main St 4.7 (86)0.6 miIn stock · 226 PM$9.49
3Corner Pantry Market9 Elm Ct 4.3 (112)0.9 miLow · 510 PM$9.79
4Lakeside Pet & Feed18 Shore Rd 4.8 (41)1.4 miIn stock · 97 PM$10.49
5Cedar Bend Pharmacy300 Main St 4.6 (74)1.1 miIn stock · 319 PM$10.99
6Burke's Outdoor Supply5 Quarry Rd 4.4 (29)2.2 miLow · 35 PM$11.25
Prices and stock are set by each shop and updated from its own dashboardAll sizes of this product

On the map

You · Maple Ave & 3rd St
Pine Street General0.3Hadley Hardware0.6Corner Pantry Market0.9Cedar Bend Pharmacy1.1Lakeside Pet & Feed1.4Burke's Outdoor Supply2.2

Every pin sells the same catalog entry, so nearest and cheapest are a real comparison, not six guesses at a name.

Who, what, and how long

Industry
E-commerce & Retail
Duration
12 weeks
Cooperation model
Fixed price
Services
Platform engineeringSearchMerchant tools
Integrations
Map and geocoding APIImage hosting and resizingSearch indexingTransactional email
Technologies
Next.jsTypeScriptPostgreSQLVercelTailwind CSS
Team
1 Project lead2 Full-stack engineers1 Product designer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

The hard problem

  1. 01

    The first version let every shop type its own product names. Within a month the same item existed as six different strings, search returned one shop instead of six, and the directory's only real promise (telling you who nearby has the thing) didn't work.

    Free-text entry across many sellers isn't a data-quality problem that cleanup can solve, because there's nothing to reconcile against. Six spellings of one item are six items until somebody decides otherwise, and nobody in a town directory has the standing to decide. A search returned the one shop that had spelled it the searcher's way, which is worse than returning nothing.

    A shared catalog behind free-text entry. As an owner types, the platform suggests an existing catalog entry; picking one links the shop's stock to a product every other shop can also link to. Owners still set their own price and quantity, but the identity of the product is shared.

How the pieces fit

  1. 01

    Put a suggestion step in front of free-text product entry instead of policing names afterward

    Typing a product name suggests matching catalog entries before free text is accepted, so the correction happens at entry, where it can still work.

  2. 02

    Kept price and stock per business while sharing product identity across them

    The split was tested with shop owners before it was built, because sharing product identity is the part a business is most likely to object to.

  3. 03

    Allowed a genuinely new product to be added, so the suggester never becomes a wall

    The suggester proposes and never blocks, and a genuinely new product enters the shared catalog and becomes a suggestion for the next shop.

  4. 04

    Scoped reviews and banners to the business, since those are the shop's own voice

    Scoping reviews to the business kept one shop's bad week from attaching itself to a product every other shop also sells.

  5. 05

    Made following a shop the lightweight action, ahead of any account-heavy feature

    Following a shop is the lightest engagement action and shipped before anything account-heavy, because it's the one people actually take.

Introduction

The system we were asked to build

A single directory lists the stock of independent shops across a town in one place. We built the public directory and search, the per-business dashboard where owners manage inventory, banners and reviews, and the shared catalog that keeps their listings comparable.

A town directory listing the stock of independent shops in one place, whose first version had let every owner type their own product names. Within a month the same item existed under six strings and the directory's only real promise (telling you who nearby has the thing) had stopped working. The engagement was scoped around fixing the catalog, with the search on top of it to follow.

Full-Stack Engineering

01

Suggest before free text

Adding a product starts with matching an existing catalog entry, which is why the same item doesn't exist under six names.

Typing a product name suggests matching catalog entries before it accepts free text, so the ordinary path links a shop's stock to a product that already exists. That's what stops one item existing under six spellings across six shops. The correction has to happen at entry, because no amount of later deduplication recovers a catalog that was never shared.

What shipped
  • Suggestion offered before free text is accepted
  • Linking is the default path, not a cleanup task
  • One item can't accumulate six spellings
Add a product

Start typing: the shared catalog is searched before anything new is created

Thu, Sep 17, 2026
1Find it in the catalogue2Your price and stock3On your page

Find it in the catalogue

Shared by every shop in Cedar Bend
voltmere aa5 catalogue matches

Pick the exact product. Your price and quantity are set on the next step.

Voltmere AA Alkaline Batteries · 8-packcat_4H2K91Stocked by 5 shops Link
Voltmere AA Alkaline Batteries · 4-packcat_4H2K88Stocked by 3 shops
Voltmere AA Alkaline Batteries · 20-packcat_4H2L07Stocked by 2 shops
Voltmere AAA Alkaline Batteries · 8-packcat_4H2K93Stocked by 4 shops
Voltmere AA Rechargeable NiMH · 4-packcat_5B0T12Stocked by 1 shop
None of these? Add it as a new productAlways available. It joins the catalog for the next shop.New product

Linking is the usual path: the same item never ends up under a second name.

Linking to

Identity is shared · listing is yours

Catalogue entry · shared

cat_4H2K91
Voltmere AA Alkaline Batteries8-pack · Voltmere
Household › Batteries 0 84213 55120 7
Your listing · only at Burke's Outdoor Supply

Your price

$11.25

Quantity

3

Availability

In store

Already linked by

their prices stay theirs
Pine Street General$8.99
Hadley Hardware$9.49
Corner Pantry Market$9.79
Cedar Bend Pharmacy$10.99
Lakeside Pet & Feed$10.49
Link and list at $11.25Back
On screen

Burke's Outdoor Supply types "voltmere aa" and the catalogue offers its matches first. Picking the 8-pack links the shop's own price and quantity to the entry five other shops already link, and adding a new product stays one row below.

Good morning, Dana

Hadley Hardware · this week at a glance · Thu, Sep 17, 2026

New banner

Product views

1,284

People who opened one of your listings

Listed products

318

Each one a shared catalog entry

Run down to nothing

4

Still searchable, shown as out

Followers

418

Hear about your banners

What was looked at

This week
Voltmere AA Alkaline Batteries184
Tallow Creek Garden Hose132
Brightfield LED A19 Bulbs, 60W equiv.97
Harbor Grip Duct Tape88
Kestrel Leaf Rake, 24-tine71
Voltmere AAA Alkaline Batteries64
FreshCoat Interior Paint, Eggshell White52

Run down to nothing

4 items
Harbor Grip Zip Ties, 8 in100-pack · out since Sep 15 · 23 views sinceOutRestock
Tallow Creek 8-Pattern Hose Nozzle1 each · out since Sep 14 · 19 views sinceOutRestock
Brightfield LED BR30 Flood Bulbs2-pack · out since Sep 12 · 12 views sinceOutRestock
Voltmere 9V Lithium Battery1-pack · out since Sep 9 · 9 views sinceOutRestock

Setting a quantity puts them back in search results as in stock.

Your price against the nearest shop

Same catalog entry · nearest to your door

Comparable because both shops link the same product. Only you can change your column.

ProductYoursNearest with itTheirsDifference
Voltmere AA Alkaline Batteriescat_4H2K918-pack$9.49Pine Street General0.4 mi · 6 shops link it$8.99$0.50
Tallow Creek Garden Hosecat_2G8P1450 ft$34.99Burke's Outdoor Supply1.6 mi · 2 shops link it$32.99$2.00
Brightfield LED A19 Bulbs, 60W equiv.cat_3L0E624-pack$11.99Pine Street General0.4 mi · 3 shops link it$12.49$0.50
Harbor Grip Duct Tapecat_1D7T3020 yd$6.99Pine Street General0.4 mi · 4 shops link it$6.99Same
Kestrel Leaf Rake, 24-tinecat_2K5R091 each$21.99Burke's Outdoor Supply1.6 mi · 2 shops link it$19.99$2.00
Voltmere AAA Alkaline Batteriescat_4H2K938-pack$9.49Cedar Bend Pharmacy0.5 mi · 4 shops link it$10.49$1.00
FreshCoat Interior Paint, Eggshell Whitecat_6W9F211 gal$38.99Only you stock it——
Sparrow Wild Bird Seedcat_3S4B7710 lb$14.99Lakeside Pet & Feed1.1 mi · 3 shops link it$12.99$2.00

Nobody else sees this comparison. Residents see each shop’s price on the product’s results.

On screen

Hadley Hardware's dashboard: what was looked at this week, what has run down to nothing, and its own price for each product set against the nearest shop linking the same catalog entry.

02

Shared identity, local price

Product identity is shared across shops; price and stock stay with the business that set them.

Product identity is shared and commercial detail isn't: every shop linking to the same catalog entry sets its own price, its own quantity and its own availability. The split is the whole design. Shared identity makes search work across the town, and local pricing keeps each business in control of the only thing it actually needs to control.

What shipped
  • Identity shared; price, stock and availability stay local
  • Search works across shops because identity is shared
  • Businesses keep control of what actually matters to them
03

New products still allowed

The suggester proposes, it doesn't block: a genuinely new item can always be added.

The suggester proposes and never blocks. A genuinely new product can always be added, because a matcher that refuses unfamiliar items would push owners straight back to whatever they were using before. New entries enter the shared catalog and become suggestions for the next shop, which is how the catalog keeps growing after the initial seed.

What shipped
  • The matcher proposes; it never refuses an entry
  • New products enter the shared catalog immediately
  • The catalog grows from real entries, well past its seed
Add a new catalogue product

No exact match in the catalog · near-matches shown first, and none of them is required

voltmere aa lithium 8-packNo exact match6 near-matches

Is it one of these?

Suggestions only · nothing here blocks you

If one is the same product, link to it instead. If not, add yours below.

Voltmere AA Alkaline Batteries · 8-packcat_4H2K91Alkaline, not lithium6 shopsLink instead
Voltmere AA Alkaline Batteries · 4-packcat_4H2K88Alkaline · 4-pack3 shopsLink instead
Tallow Creek AA Lithium Batteries · 8-packcat_6T1Q55Different brand2 shopsLink instead
Voltmere AAA Alkaline Batteries · 8-packcat_4H2K93AAA, alkaline4 shopsLink instead
Voltmere AA Rechargeable NiMH · 4-packcat_5B0T12Rechargeable · 4-pack1 shopLink instead
Voltmere 9V Lithium Battery · 1-packcat_5B0T409V, single2 shopsLink instead
None of these · add “Voltmere AA Lithium Batteries, 8-pack”Selected. The details are on the right.

New catalogue entry

cat_7R3M40

Product name

Voltmere AA Lithium Batteries

Brand

Voltmere

Size

8-pack

Category

Household › Batteries

UPC

0 84213 55188 7
Your listing · only at Burke's Outdoor Supply

Your price

$21.49

Quantity

12

When you add it

It enters the shared catalog straight away

Your price and quantity stay with Burke's Outdoor Supply

The next shop that types it is offered it as a match

Residents can find it in search today

Add to the catalog and list itNo approval step
On screen

Asking for a genuinely new entry: six near-matches are put in front of the owner with a link-instead option on each, and none of them stands in the way of adding the lithium 8-pack to the catalog.

10:42
voltmer aa

Showing the catalog product for voltmer aa

Voltmere AA Alkaline Batteries8-pack · Voltmere

6 shops · $8.99–$11.25

NearestCheapest
Pine Street General 0.3 mi · until 8 PM$8.99In stock
Hadley Hardware 0.6 mi · until 6 PM$9.49In stock
Corner Pantry Market 0.9 mi · until 10 PM$9.79Low
Cedar Bend Pharmacy 1.1 mi · until 9 PM$10.99In stock
Lakeside Pet & Feed 1.4 mi · until 7 PM$10.49In stock
Burke's Outdoor Supply 2.2 mi · until 5 PM$11.25Low
SearchShopsFollowingYou
04

Search resolves to products

On screen

Misspelled as "voltmer aa" on a phone, the query still resolves to the catalogue product, and all six shops that stock it are listed nearest first with price and stock.

A query lands on a catalog product and returns every shop that stocks it, not one shop that spelled it your way.

A search resolves to a catalog product and returns every shop stocking it, with price and distance, however the searcher happened to spell it. That's the behavior the shared catalog was built to make possible, and it's the difference between a directory and something a resident actually uses twice.

What shipped
  • Queries resolve to a product, then list every shop stocking it
  • Price and distance shown per shop
  • Spelling no longer decides which shop is found
05

Reviews stay with the shop

Reviews and banners are the business's own voice and are scoped to it, never to the shared catalog.

Reviews, banners and shop copy are scoped to the business and never to the shared catalog entry, because a shop's reputation is its own and a product's identity is everyone's. Mixing the two would let one shop's bad week attach itself to a product every other shop also sells.

What shipped
  • Reviews and banners scoped to the business, not the product
  • A shop's reputation can't attach to a shared catalog entry
  • Each business keeps its own voice on its own page
Reviews

Written about Hadley Hardware · replies appear under the review on your page

4.7 (86)
Needs a reply · 5Replied · 81Scoped to Hadley Hardware

Reply queue

Oldest last
MRMaya RiveraSep 16

The Voltmere AA pack I bought Saturday had two dead cells. Staff swapped it without any fuss, but check what's on that shelf.

Mentions a product · still filed under this shop
GOGlen OduyaSep 16

Dana walked me through three kinds of wall anchors and sent me home with the right one. Twenty minutes, one trip.

PNPriya NairSep 15

Good hose selection and the price matched what the app said. Parking out front is tight on a Saturday.

TWTom WhitakerSep 14

They cut a key while I waited and it worked first time. Friendliest counter on Main Street.

ALAna LuceroSep 13

Paint was in stock like the listing said, but only one person on the mixing counter at lunchtime.

Reply to Maya Rivera

rv_8812
MRMaya RiveraSep 16 · on your page

The Voltmere AA pack I bought Saturday had two dead cells. Staff swapped it without any fuss, but check what's on that shelf.

Your reply, as Hadley Hardware

Thanks, Maya, and sorry about that pack. We pulled the rest of that shelf and checked every date. Bring it by any time and we’ll swap it on the spot.

Post replySigned Dana Hadley

Where this review lives

Hadley Hardware’s pageCounts toward this shop’s ratingAttached
Voltmere AA Alkaline Batteries, 8-packcat_4H2K91Not attached
The 5 other shops that link this product show no trace of it.
On screen

The reply queue, where a two-star review that mentions the battery pack stays attached to Hadley Hardware's page, not to the shared catalog entry the other five shops link.

Process

Phase by phase

  1. Phase 1: The Directory

    Businesses And Their Pages

    Built business profiles and category browsing: the base the whole product sits on, and the surface a shop is judged by before anyone looks at stock.

    • Business Profiles
    • Categories
    • Public Pages
  2. Phase 2: The Shared Catalogue

    Suggest Before Free Text

    Built catalog suggestion into the add-product flow. An owner types, sees matching entries, and picks one, linking their stock to a shared product identity instead of a new string.

    • Catalogue Model
    • Suggestion Endpoint
    • Add-Product Flow
  3. Phase 3: Inventory

    Price And Stock Stay Local

    Built the per-business inventory: the same catalog product carries a different price and quantity in each shop, which is exactly the comparison the directory exists to show.

    • Per-Business Inventory
    • Pricing
    • Stock Levels
  4. Phase 4: Search

    One Query, Every Shop

    Built search across catalog products instead of shop-entered strings, so a query resolves to a product and the result is the list of shops that have it.

    • Product Search
    • Shop Results
    • Availability Display
  5. Phase 5: Merchant Tools

    Banners, Reviews, Followers

    Built the dashboard surfaces a shop owner actually returns for: promotional banners, replying to reviews, and seeing who follows them.

    • Banners
    • Review Replies
    • Followers
AislemarkWhat are you looking for? Cedar BendJM
Banner from Hadley Hardware

Fall garden week: 15% off hoses and rakes

In store through Sat, Sep 27. Ask at the counter about hose repair kits.

Hadley Hardware

4.7 (86) 212 Main St, Cedar Bend Open until 6 PM

418 followersFollow

In stock at Hadley Hardware

318 products · prices and stock set by the shop
ProductPriceStockElsewhere in town
Voltmere AA Alkaline Batteries8-pack$9.49In stock · 22Compare at 5 more
Tallow Creek Garden Hose50 ft$34.99Low · 6Compare at 1 more
Brightfield LED A19 Bulbs, 60W equiv.4-pack$11.99In stock · 18Compare at 2 more
Harbor Grip Duct Tape20 yd$6.99In stock · 40Compare at 3 more
Kestrel Leaf Rake, 24-tine1 each$21.99Low · 7Compare at 1 more
Voltmere AAA Alkaline Batteries8-pack$9.49In stock · 16Compare at 3 more

Hours

Set by the shop

Mon – Fri8 AM – 6 PM

Saturday8 AM – 5 PM

Sunday10 AM – 3 PM

Closed Thanksgiving Day

Reviews of this shop

86
Glen OduyaDana walked me through three kinds of wall anchors and sent me home with the right one. Twenty minutes, one trip.
Priya NairGood hose selection and the price matched what the app said. Parking out front is tight on a Saturday.
On screen

A shop's own page: its banner, its stock and prices, its opening hours, its reviews and a Follow button. The catalog supplies only the identity of each product it sells.

What it carries now

Shared

Product identity

Per shop

Price and stock

Catalogue, not strings

Search targets

None

Blocked new products

Product identity, price and stock, and search targets are all descriptions of the model, not measurements. Blocked new products is none: the matcher can't refuse an entry, which is the property that keeps the catalog growing past whatever it was seeded with.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

What the architecture settled

Free-text product entry across many sellers destroys search within weeks. The fix belongs at entry, not in cleanup.

Cleanup can't recover a catalog that was never shared: six spellings are six products, and by the time anyone notices there's no authority to merge them.

Share product identity and keep price local. That split is what makes a directory comparable and still fair to each shop.

Sharing identity and keeping price local is the split that makes the whole thing work: comparison across the town, control within each shop.

A suggester that blocks becomes a support queue. It has to propose and then get out of the way.

A matcher that refuses unfamiliar items becomes a support queue and, worse, sends owners back to whatever they were using before it existed.

The lightest engagement action, following a shop, earns more return visits than any account feature built before it.

Following outperformed every account feature considered ahead of it, because it asks for one tap and no commitment and still produces a reason to return.

How the work was run

We ran the suggestion flow past eight shop owners before building it, and the design changed because of it: the suggester proposes and never blocks. Owners had been burned by a system that refused entries it didn't recognize, and wouldn't have adopted another one.

Twelve weeks, fixed, with the suggestion step built and tested with real shop owners before the search work, because search is downstream of the catalog in every sense. The rule that the suggester proposes and never blocks came from that testing: an owner refused an unfamiliar item would go back to whatever they had been using before.

One item, searched two ways

Six spellings made one item look like several. One catalog entry finds all six shops.

Pick a query and run it against the strings six shops typed for the same pack of batteries, then against the shared catalog. The third tab adds a product the catalog doesn't have yet. Switch tabs, or use the arrow keys once one is focused.

Each shop's listing was whatever the owner typed. A search could only look for its words inside those strings, so one item under six names came back as a few separate products, or as nothing.

voltmere aa

What each shop typed for the same item

  • VOLTMERE AA-8Pine Street General Matched
  • Voltmere AA Alkaline 8pkHadley Hardware Matched
  • voltmer AA 8 packCorner Pantry Market Not found
  • AA batteries (8) - VoltmereCedar Bend Pharmacy Matched
  • Alkaline double-A 8ctLakeside Pet & Feed Not found
  • Batteries, AA, 8 countBurke's Outdoor Supply Not found

What the resident saw

  • VOLTMERE AA-8A product of its own · 1 shop · Pine Street General$8.99
  • Voltmere AA Alkaline 8pkA product of its own · 1 shop · Hadley Hardware$9.49
  • AA batteries (8) - VoltmereA product of its own · 1 shop · Cedar Bend Pharmacy$10.99

3 listings for one item, 3 of 6 shops never shown, and no way to compare the prices.

Why the answer changed: shops no longer name the product. They link their own price and stock to an entry every other shop can link to, so a search has one thing to find.

Architecture

From a typed product name to every shop that stocks it

The correction happens at entry, where it can still work. Search sits downstream of the catalog, so it only ever has products to find, never strings.

  1. 01 · Trigger
    An owner adds a productEntry starts in the per-business dashboard, the one place a product name is ever typed.
  2. 02 · Suggest
    Suggestion endpointMatching catalog entries are offered before free text is accepted, so linking is the default path, never a cleanup task.
  3. 03 · Engine
    Shared catalogue modelOne identity per product. The matcher proposes and never refuses: a genuinely new product enters the catalog at once and becomes the next shop's suggestion.
  4. 04 · State
    Per-business inventory in PostgreSQLPrice, quantity and availability are stored against the business, as are reviews and banners. None of them is written to the catalog entry.
  5. 05 · Delivery
    Product search on Next.jsA query resolves to a catalog product, then returns every shop stocking it with price and distance.

What sharing a catalog could break

Catalogue integrity & shop isolation

Duplicates are stopped at entry

Typing a product name offers matching catalog entries before free text is accepted, and a request for a new entry is shown its near-matches first. Linking is the ordinary path, so one item doesn't collect six spellings.

Nothing one shop sets reaches another

Only product identity is shared. Price, quantity, availability, reviews, banners and shop copy are scoped to the business, so one shop's bad week can't attach itself to a product every other shop also sells.

No owner is refused a listing

The suggester proposes and never blocks. A genuinely new product can always be added; it enters the shared catalog immediately and becomes a suggestion for the next shop.

Listing many sellers who each name the same products their own way? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.