Inspiration
Lots of sites geo-block (food delivery, streaming, local services, Gaming, Enteprise). Visitors outside the allowed region usually hit a “not available in your area” page and leave. We wanted to turn that moment into something useful, show them relevant local alternatives and let the publisher earn affiliate revenue instead of wasting that traffic.
What it does
AffiliGate is a one-script widget for geo-restricted sites. You set allowlist or blocklist rules in the dashboard. In-region visitors see your site as normal. Out-of-region visitors see a friendly overlay with location-matched partner offers. They get alternatives, you get paid per click. No backend changes, drop the script, configure rules, and add offers.
How we built it
API: Node.js, Express, TypeScript, MongoDB, MaxMind GeoIP2, Zod, JWT, CORS, express-rate-limit
Dashboard: Next.js 15, React 19, Tailwind CSS, NextAuth (MongoDB adapter), Resend (magic link), Framer Motion, TanStack React Query, React Hook Form, Zod, Radix UI, Lucide React
Widget: Vanilla JavaScript, script tag with data-pub / data-website
Challenges we ran into
- Geo accuracy
- Widget embedding
- Offer relevance
Accomplishments that we're proud of
- One-script integration
- Real geo decisions
- Polished overlay
- Full loop
What we learned
- Geo-blocking is common, turning that moment into affiliate revenue is a clear use case.
- A tiny, dependency-free widget (vanilla JS) is easier to adopt than a framework-based embed.
- MaxMind GeoIP is enough for country/region for most use cases; combining it with explicit dev params makes debugging and demos much easier.
What's next for AffiliGate
- More offer sources: Connect real affiliate networks/APIs and support multiple verticals.
- Analytics in the dashboard: Funnel views (decisions → offers shown → clicks) and revenue estimates.
- Customization: Let publishers tweak overlay copy, logo, and CTA so it fits their brand.
Built With
- express.js
- framer-motion
- geoip2
- gsap
- javascript
- lenis
- lucide-react
- maxmind
- mongodb
- next.js-15
- nextauth
- node.js
- playwright
- query
- radix-ui
- react
- react-19
- react-hook-form
- resend
- tailwind-css
- tanstack
- typescript

Log in or sign up for Devpost to join the conversation.