{"id":69989,"date":"2026-11-09T07:10:56","date_gmt":"2026-11-09T01:40:56","guid":{"rendered":"https:\/\/www.quickonlinetips.com\/archives\/tools\/secret-santa-generator\/"},"modified":"2026-11-09T07:10:56","modified_gmt":"2026-11-09T01:40:56","slug":"secret-santa-generator","status":"publish","type":"page","link":"https:\/\/www.quickonlinetips.com\/archives\/tools\/secret-santa-generator\/","title":{"rendered":"Secret Santa Generator: Draw Names Online Free"},"content":{"rendered":"<p>This free <strong>Secret Santa generator<\/strong> draws names for your office, family or friends gift exchange in seconds. Add everyone&#8217;s name, keep couples from drawing each other, set a budget and date, then send each person a private link that shows only who they are buying for. No sign-up, no emails collected, and the draw happens in your own browser.<\/p>\n<style>.qss-me{background:#fff;border:3px solid #B91C1C;border-radius:14px;padding:18px;text-align:center;margin:0 0 18px} .qss-me h3{margin:0 0 8px;font-size:22px;color:#B91C1C} .qss-me .qss-who{font-size:clamp(30px,7vw,46px);font-weight:800;color:#166534;margin:10px 0;word-break:break-word} .qss-me p{margin:6px 0 0} .qss-list{list-style:none;margin:10px 0 0;padding:0;display:grid;gap:8px} .qss-list li{display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:#fff;border:1px solid #CBD5E0;border-radius:10px;padding:8px 10px} .qss-list li b{flex:1 1 140px;font-size:16px;word-break:break-word} .qss-reveal{background:#FFF7ED;border:2px solid #EA580C;border-radius:12px;padding:16px;text-align:center;margin:12px 0 0} .qss-reveal .qss-who{font-size:30px;font-weight:800;color:#166534;margin:8px 0;word-break:break-word} .qss-pair{font-size:16px;margin:4px 0 0} .qss-warn{background:#FFF4E5;border:1px solid #F6AD55;border-radius:8px;padding:8px 10px;font-size:15px;margin:10px 0 0;color:#7B341E}<\/style>\n<div class=\"qt-tool\" id=\"qss\"><div class=\"qss-me\" id=\"qss-me\" hidden><h3 id=\"qss-hi\"><\/h3><p>Tap the button when nobody else is looking.<\/p><div class=\"qt-row\" style=\"justify-content:center\"><button type=\"button\" class=\"qt-btn qt-btn-big\" id=\"qss-show\">Show who I am buying for<\/button><\/div><div id=\"qss-mebox\" hidden><div class=\"qss-who\" id=\"qss-who\"><\/div><p id=\"qss-extra\"><\/p><\/div><p class=\"qt-small\" style=\"margin-top:10px\">Want to run your own draw? Use the tool below.<\/p><\/div><p class=\"qt-label\" style=\"font-size:1.15em;margin:0 0 10px\"><strong>Step 1:<\/strong> Enter everyone's name, one per line<\/p><textarea id=\"qss-names\" class=\"qt-prose\" style=\"min-height:170px\" placeholder=\"Anna&#10;Ben&#10;Chloe&#10;David&#10;Ella\" aria-label=\"Names, one per line\"><\/textarea><p class=\"qt-small\" id=\"qss-count\" style=\"text-align:left\">0 people<\/p><p class=\"qt-label\" style=\"font-size:1.15em;margin:18px 0 10px\"><strong>Step 2 (optional):<\/strong> Rules, budget and date<\/p><div class=\"qt-field\"><label for=\"qss-excl\">People who must not draw each other (couples, housemates): one group per line, names separated by commas<\/label><textarea id=\"qss-excl\" class=\"qt-prose\" style=\"min-height:80px\" placeholder=\"Anna, Ben&#10;Chloe, David, Ella\" aria-label=\"Exclusion groups\"><\/textarea><\/div><div class=\"qt-grid\"><div class=\"qt-field\"><label for=\"qss-budget\">Budget<\/label><input type=\"text\" id=\"qss-budget\" maxlength=\"30\" placeholder=\"e.g. $25\"><\/div><div class=\"qt-field\"><label for=\"qss-date\">Gift exchange date<\/label><input type=\"date\" id=\"qss-date\"><\/div><\/div><div class=\"qt-field\" style=\"margin-top:10px\"><label for=\"qss-msg\">Note for everyone (optional)<\/label><input type=\"text\" id=\"qss-msg\" maxlength=\"140\" placeholder=\"e.g. Office party, wrap your gift and bring it by 5 pm\"><\/div><div class=\"qt-grid\"><label class=\"qt-check\"><input type=\"checkbox\" id=\"qss-noswap\" checked> No two people draw each other<\/label><\/div><p class=\"qt-label\" style=\"font-size:1.15em;margin:18px 0 10px\"><strong>Step 3:<\/strong> Press Draw names<\/p><button type=\"button\" class=\"qt-btn qt-btn-big\" id=\"qss-go\" style=\"width:100%\">Draw names<\/button><p class=\"qt-status\" id=\"qss-status\" aria-live=\"polite\"><\/p><div id=\"qss-out\" hidden><p class=\"qt-label\" style=\"font-size:1.15em;margin:18px 0 6px\"><strong>Step 4:<\/strong> Tell everyone who they are buying for<\/p><p class=\"qt-small\" style=\"text-align:left\">Choose one option. Each way keeps the names secret from everyone else.<\/p><div class=\"qt-tabs\" role=\"tablist\" id=\"qss-tabs\"><button type=\"button\" role=\"tab\" aria-selected=\"true\" data-t=\"links\">Option 1: Private links<\/button><button type=\"button\" role=\"tab\" aria-selected=\"false\" data-t=\"phone\">Option 2: Pass the phone<\/button><button type=\"button\" role=\"tab\" aria-selected=\"false\" data-t=\"list\">Option 3: Organiser list<\/button><\/div><div id=\"qss-p-links\"><p class=\"qt-small\" style=\"text-align:left\">Copy each person's own link and send it to them alone (text, email or chat). Their link opens this page and shows only their match.<\/p><ul class=\"qss-list\" id=\"qss-links\"><\/ul><div class=\"qss-warn\">Send each link only to that person. Anyone who opens a link can see that one match.<\/div><\/div><div id=\"qss-p-phone\" hidden><p class=\"qt-small\" style=\"text-align:left\">Hand the phone round. Each person taps their own name, reads it, then presses Hide before passing it on.<\/p><ul class=\"qss-list\" id=\"qss-phone\"><\/ul><div class=\"qss-reveal\" id=\"qss-rv\" hidden><p id=\"qss-rvname\" style=\"font-weight:700\"><\/p><div class=\"qss-who\" id=\"qss-rvwho\"><\/div><button type=\"button\" class=\"qt-btn\" id=\"qss-hide\">Hide and pass on<\/button><\/div><\/div><div id=\"qss-p-list\" hidden><p class=\"qt-small\" style=\"text-align:left\">Only for an organiser who is not taking part, or who does not mind knowing everyone's match.<\/p><div class=\"qt-row\"><button type=\"button\" class=\"qt-btn qt-btn-ghost\" id=\"qss-showall\">Show the full list<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost\" id=\"qss-dl\">Download the list (.txt)<\/button><\/div><div id=\"qss-all\" hidden><\/div><\/div><div class=\"qt-row\"><button type=\"button\" class=\"qt-btn qt-btn-ghost qtx-nomark\" id=\"qss-again\">&#8634; Draw again<\/button><\/div><\/div><p class=\"qt-note\"><strong>Private by design:<\/strong> the draw happens in your own browser. Names are never sent to QuickOnlineTips or stored, and no sign-up or email is needed. A private link carries its one match after the # sign, a part of the address that browsers do not send to any server.<\/p><\/div>\n<script>(function () { function qtReady(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } function qtCopy(text, statusEl, okMsg) { function done(ok) { if (statusEl) { statusEl.textContent = ok ? (okMsg || 'Copied to clipboard.') : 'Press Ctrl+C (or Cmd+C) to copy.'; } } function fallback() { var ta = document.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.top = '-1000px'; document.body.appendChild(ta); ta.select(); var ok = false; try { ok = document.execCommand('copy'); } catch (e) { ok = false; } document.body.removeChild(ta); done(ok); } if (navigator.clipboard) { if (window.isSecureContext) { navigator.clipboard.writeText(text).then(function () { done(true); }, fallback); return; } } fallback(); } function qtSave(blob, name) { var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = name; document.body.appendChild(a); a.click(); setTimeout(function () { URL.revokeObjectURL(a.href); a.remove(); }, 1500); } function qtRand32() { var c = window.crypto || window.msCrypto; if (c) { if (c.getRandomValues) { var a = new Uint32Array(1); c.getRandomValues(a); return a[0]; } } return Math.floor(Math.random() * 4294967296); } function qtRandInt(range) { var limit = Math.floor(4294967296 \/ range) * range; var x = qtRand32(); while (x >= limit) { x = qtRand32(); } return x % range; } qtReady(function () { var root = document.getElementById('qss'); if (!root) { return; } function $(id) { return document.getElementById('qss-' + id); } var res = null, people = [], MN = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; function el(tag, cls, text) { var e = document.createElement(tag); if (cls) { e.className = cls; } if (text !== undefined) { e.textContent = text; } return e; } function clear(e) { while (e.firstChild) { e.removeChild(e.firstChild); } } function enc(obj) { var bytes = new TextEncoder().encode(JSON.stringify(obj)), s = '', i; for (i = 0; bytes.length > i; i++) { s += String.fromCharCode(bytes[i]); } return btoa(s).split('+').join('-').split('\/').join('_').split('=').join(''); } function dec(str) { var b = str.split('-').join('+').split('_').join('\/'); while (b.length % 4) { b += '='; } var s = atob(b), arr = new Uint8Array(s.length), i; for (i = 0; s.length > i; i++) { arr[i] = s.charCodeAt(i); } return JSON.parse(new TextDecoder().decode(arr)); } function niceDate(v) { if (!v) { return ''; } var p = v.split('-'); if (p.length !== 3) { return ''; } return Number(p[2]) + ' ' + MN[Number(p[1]) - 1] + ' ' + p[0]; } function extraText(o) { var t = []; if (o.b) { t.push('Budget: ' + o.b); } if (o.d) { t.push('Gift exchange: ' + niceDate(o.d)); } if (o.m) { t.push(o.m); } return t.join('. '); } function parseNames() { var seen = {}, out = [], dup = []; $('names').value.split(\/\\n\/).forEach(function (line) { var n = line.trim().slice(0, 40); if (!n) { return; } var k = n.toLowerCase(); if (seen[k]) { dup.push(n); return; } seen[k] = 1; out.push(n); }); return { list: out.slice(0, 200), dup: dup }; } function upd() { var p = parseNames(); $('count').textContent = p.list.length + (p.list.length === 1 ? ' person' : ' people') + (p.dup.length ? ' (duplicate names ignored: ' + p.dup.join(', ') + ')' : ''); } $('names').addEventListener('input', upd); function excl(list) { var idx = {}, bad = {}, unknown = []; list.forEach(function (n, i) { idx[n.toLowerCase()] = i; }); $('excl').value.split(\/\\n\/).forEach(function (line) { var g = []; line.split(',').forEach(function (x) { var k = x.trim().toLowerCase(); if (!k) { return; } if (idx[k] === undefined) { unknown.push(x.trim()); return; } g.push(idx[k]); }); g.forEach(function (a) { g.forEach(function (b) { if (a !== b) { bad[a + '-' + b] = 1; } }); }); }); return { bad: bad, unknown: unknown }; } function draw(n, bad, noswap) { var tries, i; for (tries = 0; 20000 > tries; tries++) { var p = []; for (i = 0; n > i; i++) { p.push(i); } for (i = n - 1; i > 0; i--) { var j = qtRandInt(i + 1), x = p[i]; p[i] = p[j]; p[j] = x; } var ok = true; for (i = 0; n > i; i++) { if (p[i] === i) { ok = false; break; } if (bad[i + '-' + p[i]]) { ok = false; break; } if (noswap) { if (p[p[i]] === i) { ok = false; break; } } } if (ok) { return p; } } return null; } function link(i) { var o = { g: people[i], r: people[res[i]] }; if ($('budget').value.trim()) { o.b = $('budget').value.trim().slice(0, 30); } if ($('date').value) { o.d = $('date').value; } if ($('msg').value.trim()) { o.m = $('msg').value.trim().slice(0, 140); } return location.href.split('#')[0] + '#ss=' + enc(o); } function showTab(t) { Array.prototype.forEach.call($('tabs').getElementsByTagName('button'), function (b) { b.setAttribute('aria-selected', b.getAttribute('data-t') === t ? 'true' : 'false'); }); ['links', 'phone', 'list'].forEach(function (k) { $('p-' + k).hidden = k !== t; }); $('rv').hidden = true; } Array.prototype.forEach.call($('tabs').getElementsByTagName('button'), function (b) { b.addEventListener('click', function () { showTab(b.getAttribute('data-t')); }); }); function render() { var L = $('links'), P = $('phone'); clear(L); clear(P); clear($('all')); $('all').hidden = true; $('showall').textContent = 'Show the full list'; people.forEach(function (n, i) { var li = el('li'); li.appendChild(el('b', '', n)); var cb = el('button', 'qt-btn qt-btn-sm', 'Copy ' + (n.length > 14 ? 'link' : n + \"'s link\")); cb.type = 'button'; cb.addEventListener('click', function () { qtCopy(link(i), $('status'), 'Copied the private link for ' + n + '. Send it only to ' + n + '.'); cb.textContent = 'Copied'; }); li.appendChild(cb); L.appendChild(li); var li2 = el('li'), pb = el('button', 'qt-btn qt-btn-ghost', n); pb.type = 'button'; pb.style.flex = '1 1 auto'; pb.addEventListener('click', function () { $('rvname').textContent = n + ', you are the Secret Santa for:'; $('rvwho').textContent = people[res[i]]; $('rv').hidden = false; $('rv').scrollIntoView({ block: 'nearest' }); }); li2.appendChild(pb); P.appendChild(li2); }); } $('hide').addEventListener('click', function () { $('rv').hidden = true; $('rvwho').textContent = ''; $('status').textContent = 'Hidden. Pass the phone to the next person.'; }); $('showall').addEventListener('click', function () { var A = $('all'); if (!A.hidden) { A.hidden = true; $('showall').textContent = 'Show the full list'; return; } clear(A); people.forEach(function (n, i) { A.appendChild(el('p', 'qss-pair', n + ' buys for ' + people[res[i]])); }); A.hidden = false; $('showall').textContent = 'Hide the full list'; }); $('dl').addEventListener('click', function () { var t = 'Secret Santa draw\\n'; var ex = extraText({ b: $('budget').value.trim(), d: $('date').value, m: $('msg').value.trim() }); if (ex) { t += ex + '\\n'; } t += '\\n'; people.forEach(function (n, i) { t += n + ' buys for ' + people[res[i]] + '\\n'; }); t += '\\nMade with the free Secret Santa Generator at quickonlinetips.com\\n'; qtSave(new Blob([t], { type: 'text\/plain' }), 'secret-santa-list.txt'); }); function go() { var st = $('status'), p = parseNames(); st.classList.remove('qt-error'); if (3 > p.list.length) { st.textContent = 'Step 1 first: enter at least 3 names, one per line.'; st.classList.add('qt-error'); $('out').hidden = true; return; } var ex = excl(p.list), noswap = $('noswap').checked; if (3 > p.list.length) { noswap = false; } var r = draw(p.list.length, ex.bad, noswap); if (!r) { if (noswap) { r = draw(p.list.length, ex.bad, false); } } if (!r) { st.textContent = 'No fair draw is possible with these rules. Remove some names from the \"must not draw each other\" box and try again.'; st.classList.add('qt-error'); $('out').hidden = true; return; } people = p.list; res = r; render(); showTab('links'); $('out').hidden = false; st.textContent = 'Done! ' + people.length + ' names drawn. Nobody draws themselves' + (ex.unknown.length ? '. Not found in the list, so ignored in the rules: ' + ex.unknown.join(', ') : '') + '.'; $('out').scrollIntoView({ block: 'start', behavior: 'smooth' }); } $('go').addEventListener('click', go); $('again').addEventListener('click', go); function fromHash() { var h = location.hash; if (h.indexOf('#ss=') !== 0) { return; } var o; try { o = dec(h.slice(4)); } catch (e) { return; } if (!o) { return; } if (typeof o.g !== 'string') { return; } if (typeof o.r !== 'string') { return; } $('hi').textContent = 'Hi ' + o.g.slice(0, 40) + '! Your Secret Santa match is ready'; $('who').textContent = o.r.slice(0, 40); var ex = extraText({ b: typeof o.b === 'string' ? o.b.slice(0, 30) : '', d: typeof o.d === 'string' ? o.d.slice(0, 10) : '', m: typeof o.m === 'string' ? o.m.slice(0, 140) : '' }); $('extra').textContent = ex; $('me').hidden = false; $('show').addEventListener('click', function () { $('mebox').hidden = false; $('show').hidden = true; }); } fromHash(); upd(); }); })();<\/script>\n<div class=\"qt-next\"><p class=\"qt-next-h\">Try another free tool<\/p><div class=\"qt-next-g\"><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/gift-idea-generator\/\">Gift Idea Generator<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/days-until-christmas\/\">Days Until Christmas<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/random-team-generator\/\">Random Team Generator<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/spin-the-wheel\/\">Spin the Wheel<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/games\/christmas-trivia\/\">Christmas Trivia Quiz<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/games\/charades-generator\/\">Charades Generator<\/a><\/div><\/div>\n<p><strong>Quick answer:<\/strong> Type each person&#8217;s name on its own line, add any pairs who must not draw each other, then press <strong>Draw names<\/strong>. Send everyone their own private link (Option 1), pass one phone around (Option 2), or download the full list if you are organising but not taking part (Option 3).<\/p>\n<h2>How to draw names for Secret Santa<\/h2>\n<ol>\n<li><strong>Enter the names.<\/strong> One name per line, at least 3 people. Use first names plus an initial if two people share a name.<\/li>\n<li><strong>Add rules if you need them.<\/strong> Put couples, housemates or anyone who should not draw each other on one line, separated by commas. Leave <strong>No two people draw each other<\/strong> ticked so you never get A buying for B and B buying for A.<\/li>\n<li><strong>Set the budget and date.<\/strong> Both are shown on each person&#8217;s private link, so nobody can say they did not know.<\/li>\n<li><strong>Press Draw names<\/strong> and share the results.<\/li>\n<\/ol>\n<h2>Three ways to share the results<\/h2>\n<ul>\n<li><strong>Private links:<\/strong> copy each person&#8217;s link and send it to them alone by text, email or chat. When they open it, they press a button to see their match. Do not post all the links in one group chat.<\/li>\n<li><strong>Pass the phone:<\/strong> great at a family dinner. Each person taps their name, reads their match and presses Hide before passing the phone on.<\/li>\n<li><strong>Organiser list:<\/strong> shows or downloads the full list. Only use this if you are not in the draw, or do not mind knowing everyone&#8217;s match.<\/li>\n<\/ul>\n<h2>Secret Santa tips<\/h2>\n<ul>\n<li>Agree a budget everyone is comfortable with before you draw, and put it in the budget box.<\/li>\n<li>Ask everyone to add a few gift ideas to a shared list, or try our <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/gift-idea-generator\/\">gift idea generator<\/a>.<\/li>\n<li>Set the swap date a week or two before Christmas so nobody is shopping on Christmas Eve. See the <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/days-until-christmas\/\">days until Christmas<\/a> countdown.<\/li>\n<li>Need teams for party games instead? Use the <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/random-team-generator\/\">random team generator<\/a>.<\/li>\n<\/ul>\n<h2>FAQ<\/h2>\n<h3>Is the draw random and fair?<\/h3>\n<p>Yes. Names are shuffled with your browser&#8217;s secure random number generator until everyone has someone else and every rule is met. Nobody ever draws their own name.<\/p>\n<h3>Do I need everyone&#8217;s email address?<\/h3>\n<p>No. There is no sign-up and no email. You share the private links yourself in whatever app you already use.<\/p>\n<h3>Can someone see other people&#8217;s matches?<\/h3>\n<p>Each private link holds only one match. The person who sends the links could open them, so if the organiser is also playing, use Pass the phone or let each person open only their own link.<\/p>\n<h3>What if the draw says it is not possible?<\/h3>\n<p>Too many rules can make a fair draw impossible, for example if three people out of three must not draw each other. Remove a rule or add more people and press Draw names again.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This free Secret Santa generator draws names for your office, family or friends gift exchange in seconds. Add everyone&#8217;s name, keep couples from drawing each other, set a budget and date, then send each person a private link that shows only who they are buying for. No sign-up, no emails collected, and the draw happens&#8230;<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":65595,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-69989","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/69989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/comments?post=69989"}],"version-history":[{"count":0,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/69989\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/65595"}],"wp:attachment":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/media?parent=69989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}