Most "AI gift finders" are a search box with a chatbot glued on. I wanted to build something different — ** GiftHive**, a quiz-driven gift recommender that ranks real Amazon products by who the recipient
In this post I'll walk through the architecture, the conversion tricks I learned shipping it, and the bits I'm proudest of.
Picking gifts is emotionally expensive. You scroll Amazon for an hour, second-guess every option, and end up buying a gift card. Existing tools don't help because they optimize for keyword match, not recipient fit.
GiftHive flips the input: instead of "show me gifts under $50", you answer a 30-second quiz about the person (relationship, interests, occasion, budget) and get a ranked shortlist with explanations of why each gift fits.
The whole site is a 3-step conversion funnel:
Every step has a single primary CTA. The exit-intent modal is route-aware — it only fires on /
and stays silent on /quiz
and /results
so it never interrupts the funnel mid-flow. That bug cost me ~15% of quiz completions before I caught it.
Each quiz answer maps to a vector of attributes (interests, style, budget, relationship). Products in the catalog have matching tags. Ranking is a weighted score:
score = tag_overlap * w1 + budget_match * w2 + occasion_match * w3
No ML model needed — a few hundred products and clean tagging is enough to feel personal.
Every product link runs through getAmazonUrl()
which:
tag=
param — if so, replaces it with ours?tag=gifthive08-20
export function getAmazonUrl(gift: Gift) {
const AFFILIATE_TAG = "gifthive08-20";
if (gift.amazonUrl) {
return /[?&]tag=/i.test(gift.amazonUrl)
? gift.amazonUrl.replace(/([?&])tag=[^&]*/i, `$1tag=${AFFILIATE_TAG}`)
: `${gift.amazonUrl}${gift.amazonUrl.includes("?") ? "&" : "?"}tag=${AFFILIATE_TAG}`;
}
return `https://www.amazon.com/s?k=${encodeURIComponent(gift.name)}&tag=${AFFILIATE_TAG}`;
}
Every ASIN in the catalog is real and verified, so clicks register in the Associates dashboard.
A few things that moved the needle:
Deployed on Cloudflare Pages via wrangler
. The default *.pages.dev
domain works fine, but some startup directories (like BetaList) reject it as "free hosting" — something to keep in mind if you're planning a launch there.
GiftHive is live at ** https://gifthive.pages.dev** — I'd love feedback, especially on the quiz flow and the quality of recommendations.
If you're building something with a similar funnel, the biggest lesson was: route-aware components beat global components. A social proof toast that fires on every page feels spammy; one that only fires on /results
feels like proof.
Happy hacking!