# How I Built GiftHive: An AI Gift Finder That Actually Picks Gifts People Want

> Source: <https://dev.to/hao764/how-i-built-gifthive-an-ai-gift-finder-that-actually-picks-gifts-people-want-26bh>
> Published: 2026-08-11 04:41:44+00:00

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`

``` js
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!
