Luxury watches and jewelry, Aventura FL · ~$500K/yr on Shopify · retained 8 months
A voice agent that checks 5,000 live products
01
Why a human VA fails at this task
The showroom is open Monday to Friday, 10am to 5pm. 9 in 10 calls arrive outside that window, including $40,000 inquiries at 11pm and on Sundays. All of them hit a voicemail box nobody dealt with before Monday.
They tried a virtual assistant first. Someone who cannot see the stock cannot answer the only question that matters: do you have this piece, and what does it cost.
Stock changes every day, so a saved copy of the product list is out of date within 24 hours. Every answer has to come from live data.
02
How it works
Layer 1 Keeping the product list up to date
n8n’s built-in Shopify node only pulls 50 products at a time. Looping it enough times to get through all 5,000 kept hitting Shopify’s rate limit and switching the workflow off.
I replaced it with a custom request that pages through Shopify 250 products at a time, which is 5x faster and runs without me touching it.
It updates the existing record rather than adding a new one, so a price change edits the product instead of duplicating it.
Fig 1 Pulling every product out of Shopify, page by page
The arrow from Has More Products? back to Build Request is the loop.
Fig 2 The same loop for orders, slowed down so Shopify does not block it
The same loop with one addition: a Wait node between rounds. Without it the loop goes fast enough to hit Shopify’s rate limit, which is what was quietly killing the workflow before.
Layer 2 Finding the right watch while the caller waits
The agent can call 3 lookups in the middle of a conversation.
Each one does the same thing: take what the caller said, clean it up, search the product list, rank the matches, and hand back the best one in a form the agent can read out loud.
A real listing. These 3 fields are everything the agent has to match against.
1Product nameLong and brand-heavy. This is what callers mispronounce and what speech-to-text mangles.
2PriceThe tiebreaker. When a name hits a cluster of near-identical pieces, price separates them.
3Model numberDigits, letters, dots, and a Preowned- prefix only some products carry.
Fig 3 Finding a watch by name and price
Extract & Normalize cleans up what the caller said, Airtable returns everything that might match, then Fuzzy Match & Rank narrows it to one.
Fig 4 Finding a watch by model number
The same flow pointed at the model number instead. Most of the work is stripping out the capitals and punctuation that make an exact search return nothing. 90 to 95% correct across 5,000 products.
Fig 5 Looking up an order, with a live check if it is missing
Note the branch to Run Order Sync. If the order has not been saved yet, this fetches the newest orders straight from Shopify and then answers, instead of telling the caller it cannot find them.
It asks instead of guessing. If a model number matches more than one watch, the agent asks for the price and narrows it down. A pronunciation list keeps the brand names spelled correctly on the way in.
Layer 3 Turning each call into a lead the owner sees
Every finished call saves the transcript, the recording, the caller’s details and a link to the exact product they asked about.
A scheduled workflow gathers the overnight calls and emails them before the shop opens, because the owner was never going to log into a dashboard.
Fig 6 The email the owner gets before opening
The If gate is the part that matters: a quiet night sends nothing rather than an empty report.
03
The results, counted by hand
I listened to every call in a recent sample and tagged each one: when it came in, what they wanted, how it ended, and whether a lead was actually captured.