# GiftDice — Full Documentation > Gift exchanges and shareable wishlists for any occasion. Website: https://giftdice.com --- ## Overview GiftDice is a free web application for organizing gift exchanges and creating shareable wishlists. It supports random matching for group exchanges (Secret Santa style), curated gift lists, and personal birthday wishlists with item reservations. --- ## Gift Exchange Features ### Creating an Exchange Organizers create an exchange by choosing: - **Occasion**: Valentine's Day, Christmas, Birthday, Anniversary, Wedding, Baby Shower, Housewarming, Graduation, Workplace, Family, Date Night, or Custom. - **Budget Range**: Optional min/max budget in any supported currency. - **Gift Mode**: - **Gift Ideas (Auto)** (default): Givers see curated gift ideas from the catalog based on occasion and budget — no setup needed by the organizer. - **Custom Gift List**: A curated pool of gift ideas auto-populated based on occasion and budget. The organizer can add, edit, or remove suggestions. Givers browse the list for inspiration. - **Assigned Gifts**: The organizer adds specific gifts to a list, and each gift is randomly assigned to a specific match during the draw. - **Gender Matching**: Optional setting to match male-female pairs for couples exchanges. - **Fine System**: Optional fun penalty amount for late or missing gifts. - **Countdown Timer**: Group pages show an "X days left" badge when an exchange date is set. Color-coded: red for today, amber for ≤7 days, muted for longer. ### Inviting Members - Each exchange generates a unique invite code. - Share the invite link — participants join by entering the code or via Magic Link email. - **Bulk Email Invites**: Group owners can invite up to 20 people at once by entering email addresses. Emails are deduplicated, validated, and rate-limited. Recipients get an invite email with a direct join link. - Members can optionally provide their gender for gender-aware matching. ### Matching - The organizer triggers the random matching from the exchange dashboard. - Each participant is randomly assigned exactly one recipient. - Gender matching is respected if enabled. - Participants see only their own assigned match — it's a secret. - **Rematch / Re-Draw**: The group owner can re-draw matches after the initial draw. Old matches are deleted, new matches are generated, and match notification emails are re-sent to all members. ### Gift Modes in Detail **Gift Ideas (Auto)**: - The default mode. No setup required by the organizer. - After matching, givers see curated gift ideas from the GiftDice catalog, filtered by occasion and budget. - If no budget was set, catalog prices are hidden so they don't mislead. **Custom Gift List**: - When the organizer creates an exchange with this mode, the system automatically populates curated gift ideas based on the chosen occasion and budget range. - The organizer can customize, add, or remove suggestions before finalizing. - Givers browse the list for inspiration on what to buy. - Gifts can also be uploaded in bulk via CSV or PDF files. **Assigned Gifts**: - The organizer adds specific gifts to a list. - After matching, each matched pair is assigned a specific gift. ### Match Reveal After matching, each participant sees: - A fun dice-roll animation with confetti when they first reveal their match. - Their assigned recipient's name. - The budget range for the exchange. - Gift ideas from the catalog (Auto mode), the custom gift list (Custom Gift List mode), or their assigned gift (Assigned Gifts mode). - **Private Match Chat**: A private messaging feature between matched pairs. Givers can message their recipient to ask about sizes, preferences, or allergies. Recipients can message their giver. Messages are private — only the two people in the match can see them. Rate-limited to 20 messages/day per conversation. Sends email + in-app notifications on new messages. ### Affiliate Shopping Links - AI gift suggestions include Amazon Associates affiliate links when `NEXT_PUBLIC_AMAZON_ASSOCIATE_TAG` is configured. - Wishlist item URLs pointing to Amazon domains are automatically tagged with the Associates tag when displayed. - Falls back to Google Shopping search links when no affiliate tag is set. --- ## Wishlist Features ### Creating a Wishlist Users can create personal wishlists with: - **Title**: Name of the wishlist (e.g., "My Birthday Wishlist 2025"). - **Occasion**: Birthday, Christmas, Anniversary, etc. - **Description**: Optional note for gift-givers. ### Adding Items Each wishlist item supports: - **Name**: Item name (required). - **Description**: Details like color, size, model. - **Image**: Upload an image directly (server-side compressed to WebP) or provide a URL. - **Link**: URL to where the item can be purchased. - **Price**: Optional price in any supported currency. - **Priority**: 0-10 scale for how much you want this item. - **Do Not Buy**: Mark items you explicitly don't want. Shown with a red strikethrough and reason. These items cannot be reserved. ### Sharing - Each wishlist has a unique public share link (e.g., giftdice.com/wishlist/abc123). - Anyone with the link can view the wishlist — no login required to browse. - **Social Share Buttons**: WhatsApp, Twitter/X, and copy-link sharing buttons on the public wishlist and join pages. - **Dynamic OG Tags**: Public wishlist and join pages generate Open Graph and Twitter Card metadata for rich social previews when shared. - Logged-in visitors can **reserve** items to indicate they plan to buy them. A confirmation dialog is shown before committing the reservation. - The wishlist owner sees who reserved each item, preventing duplicate gifts. - **Image Preview**: Clicking any item thumbnail on a public wishlist opens a full-size preview in a lightbox dialog. Graceful fallback if the image fails to load. ### Reservations - Visitors reserve items by clicking "Reserve" on the public wishlist page. - Reserved items appear as "Taken" to other visitors. - The person who reserved can unreserve at any time. - The wishlist owner sees reservation details. ### Collaboration - Wishlist owners can invite collaborators by email with role-based access: - **Editor**: Can add, edit, and remove wishlist items. - **Viewer**: Can browse the wishlist (read-only). - Invited users receive both an email notification and an in-app notification. - Owners can resend invitations for pending collaborators. - Owners can change a collaborator's role or remove them at any time. ### Similar Items (AI) - Each wishlist item has a "Find similar items" button. - AI generates 4 alternative product suggestions based on the item's name, category, price, and occasion. - Each suggestion includes name, description, estimated price, category, and a shopping link. - Suggestions can be added directly to the wishlist with one click. ### Wishlist Personalization Wishlist owners can personalize how their public wishlist page looks: - **Cover Photo**: Upload a banner image shown at the top of the public page. Drag-to-reposition lets owners set the focal point (stored as CSS `object-position`). Replace or remove at any time. - **Visual Themes**: Choose from 6 occasion-matched themes: - **Classic** (default) — original clean white design, unchanged for existing wishlists - **Blossom** 🌸 — soft cherry-blossom pink/lavender, ideal for birthdays and Valentine's - **Peach** 🍑 — warm coral-to-rose sunset, ideal for baby showers and housewarming - **Sky** 🌤️ — soft periwinkle blue, ideal for graduations and baby showers - **Garden** 🌿 — rich botanical emerald, ideal for housewarming and family occasions - **Golden Hour** 🌅 — warm amber glow, ideal for anniversaries and celebrations - **Animated Decorations**: Each non-default theme renders floating animated emoji particles (falling petals, drifting clouds, twinkling stars) as a fixed background layer behind all content. - Both cover photo and theme are fully optional. If neither is set, the default Classic layout is shown. --- ## Email Notifications GiftDice sends transactional emails powered by Resend and React Email: - **Match Ready**: Sent automatically to all group members when the organizer draws matches. Includes group name, occasion, exchange date, budget range, and a link to reveal the match. - **Match Reminder**: Sent to members who haven't revealed their match yet. Can be triggered by the group owner from the exchange page, or by the platform admin for all groups at once. - **Member Joined**: Sent to the group owner when a new participant joins via the invite link. Includes the new member's name and the current member count. - **Group Cancelled**: Sent to all members (except the owner) when a group is deleted. Includes the group name and a link back to the dashboard. - **Group Invite**: Sent to email addresses when the group owner uses bulk email invites. Includes the inviter's name, group name, occasion, and a direct join link. - **Item Reserved**: Sent to the wishlist owner when someone reserves an item. Includes the reserver's name, item name, and a link to the wishlist dashboard. - **Item Unreserved**: Sent to the wishlist owner when a reservation is cancelled. Includes the item name and a link to the wishlist dashboard. - **Wishlist Collaboration Invite**: Sent when a wishlist owner adds a collaborator. Includes role (Editor/Viewer), wishlist title, and a link to the wishlist. - **Welcome**: Personal, founder-tone email sent to first-time users who join their first exchange via an invite link. Only sent once. - **Onboarding — Create a Wishlist** (Day 1): Sent ~24 hours after signup to users who haven't created a wishlist yet. Highlights AI wishlist builder, item reservations, and sharing. - **Onboarding — Start an Exchange** (Day 3): Sent ~72 hours after signup to users who haven't joined or created a group. Highlights random matching and invite links. - **Daily Entry Digest**: Organizers receive a daily digest of new entries for their active campaigns. - **Milestone Emails**: Organizers receive milestone alerts when campaigns reach 100 and 500 entries. - **Wishlist Share Reminders**: Periodic "share your wishlist" reminder emails for users with wishlists that have items (3-day cooldown). - **Birthday Wishes**: Daily cron job (`/api/cron/birthday-wishes`) sends a heartfelt birthday email and in-app notification to users whose birthday wishlist event date is today. Deduplicates by user so each person gets one message even with multiple birthday wishlists. - **Wishlist Reservation Reminders**: Daily cron job (`/api/cron/wishlist-reminders`) sends weekly reminder emails to users who reserved wishlist items when the event is 2–30 days away (Redis-deduped with 6-day TTL so at most one per week per wishlist). Day-before and day-of urgent reminders sent separately. Stops automatically once the event date passes. - **Giveaway Collaborator Emails**: Manager collaborators receive all organizer emails: first entry alerts, milestone notifications, daily entry digest, draw day reminders, and draw failure notifications. - **Resend Audience Auto-Sync**: User emails are synced to Resend Audience for improved deliverability. Both onboarding emails skip users who already took the action — no nagging. All emails share a consistent layout with the GiftDice branding, occasion details, and a clear call-to-action button. --- ## Onboarding & First-Run Experience ### Profile Editor The Settings page includes a profile section where users can: - Upload an avatar (camera overlay on hover, 2 MB limit, magic-byte validation for JPG/PNG/WebP, server-side compression to WebP). - Edit their display name (max 50 characters). - View their email (read-only). Avatar storage uses a dedicated `avatars` Supabase Storage bucket with RLS (users can only write to their own folder). ### Profile Completion Prompt A dismissible card on the dashboard nudges users who have no avatar or an email-prefix display name to complete their profile. Links to `/settings`. Stored in localStorage — once dismissed, it never reappears. ### Getting Started Checklist A 4-step checklist shown on the dashboard for new users: | Step | Done when | CTA | |------|-----------|-----| | Complete your profile | Has avatar + non-email display name | Update Profile → /settings | | Create or join an exchange | groupsTotal > 0 | Create Exchange → /groups/new | | Create a wishlist | wishlistCount > 0 | Create Wishlist → /wishlists/new | | Try a giveaway | Created or entered a giveaway | Explore Giveaways → /giveaways | - Progress bar showing "X of 4 complete". - Green check circles for completed steps, CTA buttons for incomplete ones. - When all 4 are done: PartyPopper celebration animation → auto-dismiss after 3 seconds. - "Hide checklist" / "Dismiss" button always visible for manual dismissal. - Stored in localStorage — once dismissed, it never reappears. ### Dashboard Prompt Priority The dashboard shows at most one prompt at a time to avoid banner fatigue: 1. Profile completion prompt (highest priority) 2. Push notification prompt 3. Referral banner (lowest priority) ### Onboarding Email Sequence Automated drip emails for new users, powered by a daily cron job (`/api/cron/onboarding`): - **Day 1** (~24h after signup): "Create a wishlist" — skipped if user already has one. - **Day 3** (~72h after signup): "Start an exchange" — skipped if user already joined or created one. Each user's onboarding progress is tracked via `profiles.onboarding_step` (0 → 1 → 2). ### First-Time Tips Contextual, one-time tips shown on specific pages to help users discover features: - Uses a reusable `FirstTimeTip` component with a unique localStorage key per tip. - Once dismissed, tips never reappear. ### Nav Feature Discovery "New" dot badges appear on Wishlists and Giveaways nav items for users who haven't visited those sections yet. The badge disappears permanently once the user visits the page. Tracked in localStorage. --- ## Giveaway Features ### Creating a Giveaway Campaign Organizers create a campaign with: - Title and description - Prize description (GitHub-style markdown editor with Write/Preview tabs, formatting toolbar, keyboard shortcuts Ctrl+B/I/K, up to 5,000 characters, line breaks preserved via remark-breaks) - Number of winners - Entry question (custom question entrants must answer) - Draw date - Optional sponsor name - Settings: show entry count publicly, notify non-winners ### Additional Giveaway Features - **Giveaway Sorting**: Browse page supports sorting by newest, ending soon, or most entries. - **Countdown Timers**: Giveaway cards approaching draw date show countdown timers. - **Winner Payment Details**: Organizers see payment details on the winners page for monetary giveaways. - **Winner Name Anonymization**: Public giveaway results show anonymized names (e.g. "John D."). - **Recurring Exchanges**: Re-run last year's exchange with the same group. Copy group settings + members into a new exchange on a schedule. - **Admin Dashboard**: Dedicated `/admin` page with platform metrics (monetization, AI usage, profile analytics, giveaway stats), real-time activity feed (8 event types: signups, exchanges, wishlists, giveaways, Dice Duels, member joins, match draws, credit purchases — enriched with user emails and context, Redis-cached at 30s TTL), admin audit log, campaign management, and nav links. ### Giveaway Collaboration - Organizers can invite collaborators by email with role-based access: - **Manager**: Full edit, draw execution, and entry management. - **Viewer**: Read-only access to entries, stats, and exports. - Invited users receive both an email notification and an in-app notification. - **Pending invites**: If the invitee doesn't have a GiftDice account, a pending invite is created. They receive a signup email and automatically gain collaborator access when they create an account (resolved atomically via database trigger). The organizer receives an in-app notification and email when the invitee signs up. - Owners can resend invitations, change a collaborator's role, or remove them at any time. - **Giveaway list tabs**: "My Campaigns" shows owned campaigns, "Invited" tab shows campaigns where the user is a collaborator. - **Role badge**: Campaign dashboard shows an "Invited · Manager/Viewer" badge for non-owner collaborators. ### Entry Flow 1. Organizer shares the public giveaway link (`/giveaway/{slug}`) 2. Entrant fills form: name, email, Twitter handle, answer to entry question, email consent 3. A GiftDice account is created via magic link (if user is new) 4. Entry is recorded and confirmation email is sent 5. Entrant clicks magic link to verify email, lands on thank-you page ### Organizer Dashboard - View all entries with search, filtering, and pagination - Bulk actions: pre-select, exclude, or reset entries - Vouch for entries: adding a vouch automatically pre-selects as a guaranteed winner (unless excluded) - Pre-draw summary: Pool A (pre-selected), Pool B (open), random slots remaining - Execute draw with confirmation dialog - Post-draw: View Winners button and clickable winners stat card link to dedicated winners page - Cancel campaign with entrant notification ### Winners Page - Dedicated page at `/giveaways/{id}/winners` showing all winners in a card grid - Search filter (shown when >3 winners) - Copy winner list to clipboard - Per-winner cards show name, Twitter handle, vouch info, entry response, and submission date - Redirects to campaign dashboard if draw hasn't been executed yet ### Two-Pool Draw Algorithm - **Safety net**: Vouched entries still in "entered" status are auto-promoted to "pre_selected" before the draw - **Pool A** (pre-selected): Guaranteed winners, bypasses randomization - **Pool B** (open pool): Random selection via Fisher-Yates shuffle fills remaining slots - Excluded entries are ignored entirely (vouching an excluded entry saves the vouch but does not change status) - If fewer entries than winner slots, all entrants win - **Auto Draw Failure Handling**: If auto-draw fails (e.g. no eligible entries), the campaign is marked as `draw_failed`. The organizer receives an in-app notification and can retry the draw manually from the dashboard. ### Giveaway Emails - Entry confirmation - Draw announcement (sent to all entrants) - Winner notification - Non-winner follow-up (optional, controlled by organizer setting) - Daily entry digest for organizers - Milestone emails (100 entries, 500 entries) for organizer motivation - Collaborator invite (includes role, campaign title, and link; variant for non-registered users with signup CTA) - Collaborator accepted (notifies organizer when an invited collaborator signs up and gains access) - Draw emails processed via dedicated cron job (`/api/cron/send-draw-emails`) in batches of 15 per invocation for reliable delivery on large campaigns (100+ entries) ### Limits - Free tier: 5 active giveaway campaigns, 500 entries per campaign, 50 winners per draw - Pro tier: Unlimited active campaigns, 10,000 entries per campaign, 500 winners per draw --- ## Dice Duel (Live Quiz Game) Dice Duel is a Kahoot-style live quiz game built into GiftDice. ### How It Works 1. **Host creates a quiz** — add multiple-choice or true/false questions with a time limit per question (default 20 seconds). 2. **AI Question Generator** — enter any topic and AI generates trivia questions using GPT-4o-mini. Generates 3-20 questions at a time, each with 4 multiple-choice options and the correct answer marked. The creator can edit, delete, or add more questions after generation. Free for all users (uses the shared daily AI quota: 10/day free, unlimited for Pro). 3. **Share the join code** — players open `/dice-duel/join/{CODE}` on their phones and enter a display name. No account or app download needed. Hosts can also send email invites with game details and join code. 4. **Play in real time** — the host controls the game flow from their screen. Questions appear on all players' phones simultaneously via Supabase Broadcast. 5. **Speed-based scoring** — correct answers earn up to 1,000 points. Faster answers score more. A leaderboard is shown after every question. 6. **Results persist** — all answers are saved to the database for post-game review. ### Game Management - **Edit**: Hosts can edit game settings (title, time limit, max players) from the `/dice-duels` list page. - **Cancel / Delete**: Cancel in-progress games or delete completed/cancelled ones. Status-aware action buttons show only valid actions per game state. - **Ended Game Handling**: Players visiting a finished or cancelled game URL see a "Game Over" or "Game Cancelled" message instead of being stuck on a waiting screen. ### Results Page The results page (`/dice-duels/{id}/results`) features a celebration design: - Confetti effects and dice-themed SVG decorations. - Animated podium stage visualization (1st, 2nd, 3rd place) with crown/trophy icons. - Per-question breakdown with accuracy bars. - Stats summary (total players, questions, average score). - PuzzoFMe partner links and GiftDice feature promotion. ### Invite Email Email template for inviting players with game details, join code, and direct join link. Sent via Resend with the shared `EmailLayout` component. ### Technical Details - **Host-as-orchestrator**: The host's browser drives the game flow. No WebSocket server needed — uses Supabase Broadcast (client-to-client). - **Batched persistence**: One API call per question (not per player) to minimize serverless invocations. - **Redis rate limiting**: Game creation (10/min), answer submission (60/min), and join code lookup (20/min) endpoints are rate-limited via Upstash Redis. - **Duplicate answer prevention**: Upsert with `ignoreDuplicates` prevents 500 errors on double-submission. - **Auto cleanup**: A daily cron job (`/api/cron/dice-duel-cleanup`) removes games stuck in lobby for 24+ hours. - **Guest play**: Players join with just a name — `user_id` is nullable on the players table. ### Pages | Page | URL | Description | |------|-----|-------------| | Dice Duels | https://giftdice.com/dice-duels | Host's game list with edit/cancel/delete actions (authenticated) | | Create Game | https://giftdice.com/dice-duels/new | Create a new quiz (authenticated) | | Host Screen | https://giftdice.com/dice-duels/{id}/host | Host TV screen — controls game flow | | Results | https://giftdice.com/dice-duels/{id}/results | Post-game results with podium and stats | | Join Page | https://giftdice.com/dice-duel/join/{code} | Public join page (no auth) | | Play Screen | https://giftdice.com/dice-duel/{id}/play | Player phone screen (no auth) | | SEO Landing | https://giftdice.com/dice-duel | SEO landing page | --- ## Pricing ### Free Plan (forever) | Resource | Limit | |----------|-------| | Groups | 10 | | Wishlists | 10 | | Items per wishlist | 50 | | Active giveaways | 5 | | Entries per giveaway | 500 | | AI features / day | 10 | | Bulk invites per batch | 10 | | Winners per giveaway | 50 | ### AI Credit Pack — Best Value ($1.99 one-time) - 100 AI credits per pack - Never expires - Used after the 10 free daily AI uses are exhausted - Buy multiple packs — credits stack - Works with all AI features: gift suggestions, wishlist builder, URL & image import, thank-you notes ### Pro Plan ($2.99/mo or $19/yr) | Resource | Limit | |----------|-------| | Groups | Unlimited | | Wishlists | Unlimited | | Items per wishlist | 200 | | Active giveaways | Unlimited | | Entries per giveaway | 10,000 | | AI features / day | Unlimited | | Bulk invites per batch | 50 | | Winners per giveaway | 500 | Pricing page: https://giftdice.com/pricing Payment processing: Lemon Squeezy ### Usage Indicators Free-tier users see subtle, non-blocking usage hints throughout the app: - **Dashboard card**: Compact card with color-coded progress bars for groups, wishlists, giveaways, and AI uses. Amber at 80%, red at 100%. Hidden for Pro users. - **AI dialog hints**: "X AI uses left today" shown in gift recommender, thank-you note, and AI wishlist builder dialogs. Shows "Daily limit reached · Upgrade" at zero. - **Create flow hints**: "You can create X more [resource] on your plan" shown when creating new groups, wishlists, or giveaways. Amber upgrade link when ≤1 remaining. - **Settings page**: Usage overview card between Subscription and Cookie Preferences sections. All indicators are informational only — nothing is blurred, blocked, or gated behind interstitials. --- ## Supported Currencies USD (US Dollar), EUR (Euro), GBP (British Pound), NGN (Nigerian Naira), CAD (Canadian Dollar), AUD (Australian Dollar), JPY (Japanese Yen), CHF (Swiss Franc), INR (Indian Rupee), BRL (Brazilian Real), MXN (Mexican Peso), ZAR (South African Rand), KES (Kenyan Shilling), GHS (Ghanaian Cedi). --- ## Security & Reliability - Every API route verifies authentication and resource ownership server-side. - Supabase Row Level Security (RLS) at the database layer as a second boundary. - Draw execution uses an atomic status lock to prevent concurrent draws from both modifying entries. - Paginated entry fetching (`fetchAllRows`) with `throwOnError` ensures draws abort on DB errors instead of proceeding with partial data. - CSV export formula injection hardening — strips control characters and prefixes dangerous leading characters. - Email header injection prevention — strips newlines from recipient addresses before sending. - Audit logging for sensitive organizer actions (draw execution, CSV export, bulk entry status changes) to `admin_audit_log` table. - Redis-based dedup for milestone notifications and draw emails prevents duplicates from concurrent requests. - Rate limiting on upload, AI, and game API endpoints. - Webhook event deduplication via `webhook_events` table with UNIQUE constraint — prevents double-processing of retried webhook deliveries. - Payment failure grace period (5 days) — users retain Pro access while payment issues are resolved instead of immediate downgrade. - Webhook replay protection — rejects stale (>10 min) and future-dated (>60s) webhook events. --- ## Technical Details - **Platform**: Web application (works on all devices). - **Authentication**: Google OAuth + Magic Link (email OTP) sign-in. - **Framework**: Next.js with React. - **Hosting**: Deployed on Netlify. - **Database**: Supabase (PostgreSQL). - **Email**: Resend with React Email templates. - **Analytics**: Umami Cloud (privacy-friendly, cookie-free, GDPR-compliant). - **PWA**: Progressive Web App manifest and service worker for Add to Home Screen and offline caching. Web push notifications for match ready, giveaway winner, and item reserved events. - **Dark Mode**: Theme toggle on all pages (homepage, SEO landing pages, dashboard). Persisted across sessions. - **Mobile-First Design**: Fully responsive with a Twitter-style bottom tab bar on mobile (auto-hides on scroll down, re-appears on scroll up). - **Paginated Lists**: All list views (groups, wishlists, giveaways, Dice Duels) paginate with "Load More" for fast initial loads and reduced data transfer. - **Structured Data**: Schema.org HowTo and Product JSON-LD on landing and pricing pages, FAQPage on the homepage, Article on blog posts — for rich search results. - **GDPR / UK GDPR Compliance**: Cookie consent banner, consent-gated analytics (DataFast loaded only after consent; Umami always loads cookie-free), account deletion (right to erasure) with two-step email confirmation, data export (right to data portability), and a comprehensive privacy policy referencing GDPR Articles 6, 15–22. - **Pricing**: Free plan with generous limits. AI Credit Pack at $1.99 for 100 credits (best value). Pro plan at $2.99/mo or $19/yr for power users. - **Payments**: Lemon Squeezy (webhook-based subscription management). - **Security**: Row Level Security on all tables, profile column protection trigger (tier/billing/subscription/referral fields), Cloudflare Turnstile CAPTCHA on giveaway entries, fail-closed rate limiting via Upstash Redis, timing-safe confirmation code comparison, role-based data filtering for sensitive fields, webhook deduplication and replay protection, payment failure grace period. --- ## Pages | Page | URL | Description | |------|-----|-------------| | Home | https://giftdice.com | Landing page with features overview | | Login | https://giftdice.com/login | Sign in with Google or Magic Link | | Secret Santa | https://giftdice.com/secret-santa | SEO landing page for Secret Santa | | Birthday Wishlist | https://giftdice.com/birthday-wishlist | SEO landing page for Birthday Wishlists | | Office Gift Exchange | https://giftdice.com/office-gift-exchange | SEO landing page for Office Exchanges | | White Elephant | https://giftdice.com/white-elephant | SEO landing page for White Elephant exchanges | | Wedding Gift List | https://giftdice.com/wedding-gift-list | SEO landing page for Wedding Gift Registries | | Baby Shower Registry | https://giftdice.com/baby-shower-registry | SEO landing page for Baby Shower Registries | | Christmas Exchange | https://giftdice.com/christmas-gift-exchange | SEO landing page for Christmas Gift Exchanges | | Online Giveaway | https://giftdice.com/online-giveaway | SEO landing page for online giveaways | | Gift Exchange Game | https://giftdice.com/gift-exchange-game | SEO landing page for gift exchange games | | Dice Duel | https://giftdice.com/dice-duel | SEO landing page for live quiz games | | Nigeria Secret Santa | https://giftdice.com/ng/secret-santa | Regional SEO page with NGN budgets | | Kenya Gift Exchange | https://giftdice.com/ke/gift-exchange | Regional SEO page with KES budgets | | South Africa Gift Exchange | https://giftdice.com/za/gift-exchange | Regional SEO page with ZAR budgets | | Pricing | https://giftdice.com/pricing | Free, AI Credit Pack & Pro plan comparison | | Dashboard | https://giftdice.com/dashboard | User dashboard (authenticated) | | Create Exchange | https://giftdice.com/groups/new | Create a new gift exchange | | Wishlists | https://giftdice.com/wishlists | Manage your wishlists (authenticated) | | Public Wishlist | https://giftdice.com/wishlist/{code} | Public shareable wishlist page | | Giveaways | https://giftdice.com/giveaways | Manage your giveaway campaigns (authenticated) | | Create Giveaway | https://giftdice.com/giveaways/new | Create a new giveaway campaign | | Public Giveaway | https://giftdice.com/giveaway/{slug} | Public giveaway entry page | | Giveaway Results | https://giftdice.com/giveaways/{id}/results | Check your giveaway result (authenticated) | | Giveaway Winners | https://giftdice.com/giveaways/{id}/winners | View all winners for a campaign (organizer) | | Dice Duels | https://giftdice.com/dice-duels | Host's game list (authenticated) | | Create Dice Duel | https://giftdice.com/dice-duels/new | Create a new quiz game (authenticated) | | Settings | https://giftdice.com/settings | Profile editor, subscriptions, referrals (referrer earns 7 Pro days up to 90; referred gets 3 bonus AI uses; email + in-app notifications), cookie preferences, data export, two-step account deletion with email code verification (authenticated) | | Privacy | https://giftdice.com/privacy | Privacy policy | | Terms | https://giftdice.com/terms | Terms of service | --- ## API GiftDice does not currently offer a public API. All functionality is accessed through the web interface. --- ## Contact - Twitter: @olanetsoft - Website: https://giftdice.com