The wedding is over, the honeymoon was amazing, and now you’re staring at a stack of 150 blank cards. Don’t let thank-you note paralysis set in.
Showing gratitude should feel. This template helps you track every gift, contribution, and guest appearance, making your 'thank yous' as sincere and beautiful as your wedding.
Free thank you card template
The script and tracking kit for every note
Don't let post-wedding card paralysis set in. Five plug-and-play scripts plus a tracker so no guest is left un-thanked. Try the kit below.
Interactive preview
Thank you tracker
Log every guest, their gift, and the note status. Stats update in real time.
| Guest |
Gift or reason |
Status |
Date sent |
Notes |
Mailed |
|
+ Add note
Download as CSV
Print
Reset tracker
Modular scripts
Five scripts to copy and paste
Adapt each script with names and specifics. The full download has 20+ tailored by scenario.
Before you mail
15 considerations checklist
The details that turn a thank you note from generic to genuine.
(function() {
'use strict';
var STORAGE_KEY = 'rb-ty-preview-v1';
var DEFAULTS = [
{ guest: 'Suzanne Quincy', gift: 'KitchenAid mixer', status: 'Sent', dateSent: '2027-02-15', notes: 'Mentioned the lavender color', mailed: true },
{ guest: 'Marcus and Lara Allen', gift: 'Cash gift, $200', status: 'Drafted', dateSent: '', notes: 'For honeymoon flights', mailed: false },
{ guest: 'Jordan and Riley Patel', gift: 'Travel voucher', status: 'Drafted', dateSent: '', notes: 'Tahiti reference', mailed: false },
{ guest: 'Ava Reyes', gift: 'Attended only', status: 'Sent', dateSent: '2027-02-10', notes: 'Thanked for the toast', mailed: true },
{ guest: 'Dev Singh', gift: 'Wine set', status: 'Not started', dateSent: '', notes: '', mailed: false },
{ guest: 'Lens & Light Photography', gift: 'Vendor service', status: 'Sent', dateSent: '2027-01-25', notes: 'Tipped and reviewed', mailed: true },
{ guest: 'The Anderson Family', gift: 'Crystal vase', status: 'Not started', dateSent: '', notes: '', mailed: false }
];
var SCRIPTS = [
{
tag: 'Wedding gift',
title: 'For a registry or physical gift',
text: 'Dear [Name],\n\nThank you so much for the [gift]. We absolutely love it and will [how you will use it]. Your thoughtfulness means more to us than you know. Having you there to celebrate with us made the day even more special.\n\nWith love,\n[Your Names]'
},
{
tag: 'Cash or check',
title: 'When the gift is money',
text: "Dear [Name],\n\nThank you for your incredibly generous gift. We're putting it toward [honeymoon, new home, etc.] and it's going to make such a difference. We're so grateful to have you in our corner.\n\nWith love,\n[Your Names]"
},
{
tag: 'Attended only',
title: 'No gift, just their presence',
text: "Dear [Name],\n\nHaving you at our wedding meant everything to us. Your presence, your energy, and [specific memory] made the day complete. We're so lucky to share our lives with people like you.\n\nWith love,\n[Your Names]"
},
{
tag: 'Vendor',
title: 'For your photographer, planner, florist',
text: "Dear [Name],\n\nWe wanted to take a moment to thank you for [what they did]. Your professionalism and care made a stressful day feel easy. We'll recommend you to anyone who asks.\n\nWarmly,\n[Your Names]"
},
{
tag: 'Non-registry',
title: 'For unexpected or unique gifts',
text: "Dear [Name],\n\nThank you for the [gift]. It is so uniquely you, and we love that we have a piece of your personality in our home. It will remind us of your friendship every time we [use, see, enjoy] it.\n\nWith love,\n[Your Names]"
}
];
var CHECKS = [
'Note specifically mentions the gift by name to show genuine appreciation.',
'Personalized sentence about a specific moment shared with the guest at the wedding.',
'Clear plan for using a cash gift (down payment, honeymoon excursion, etc.).',
'Thank you sent to long-distance guests, even without a physical gift.',
'Note addressed to every person on the original invitation including plus-ones.',
'Batching schedule kept to mail all notes within three months of the wedding.',
'Tracker logs when each note is written, stamped, and physically mailed.',
'Professional thank you sent to vendors who went above and beyond.',
'Stationery consistent with the overall design of the wedding suite.',
'Mailing address verified as current for guests who may have moved.',
'Handwriting legible and written in a quality pen that does not smudge.',
'Wedding photo or digital gallery link included as a special extra.',
'Wording for group gifts personalized to each individual who contributed.',
'Postage cost accounted for in the final post-wedding budget.',
'Note expresses excitement about seeing the guest again soon.'
];
var state = loadState();
function loadState() {
try {
var raw = localStorage.getItem(STORAGE_KEY);
if (raw) {
var p = JSON.parse(raw);
if (p && p.notes) return p;
}
} catch (e) {}
return { notes: JSON.parse(JSON.stringify(DEFAULTS)), checks: {} };
}
function saveState() { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (e) {} }
function esc(s) { if (s == null) return ''; return String(s).replace(/[&<>"']/g, function(c) { return { '&':'&','<':'<','>':'>','"':'"',"'":''' }[c]; }); }
function renderRows() {
var tbody = document.getElementById('rb-rows');
var html = '';
state.notes.forEach(function(n, i) {
html += '
' +
' | ' +
' | ' +
'Not startedDraftedSent | ' +
' | ' +
' | ' +
' | ' +
'× | ' +
'
';
});
if (!html) html = '
| No notes tracked yet. |
';
tbody.innerHTML = html;
}
function renderStats() {
var total = state.notes.length;
var sent = state.notes.filter(function(n){return n.status==='Sent';}).length;
var draft = state.notes.filter(function(n){return n.status==='Drafted';}).length;
var none = state.notes.filter(function(n){return n.status==='Not started';}).length;
document.getElementById('rb-stat-total').textContent = total;
document.getElementById('rb-stat-sent').textContent = sent;
document.getElementById('rb-stat-draft').textContent = draft;
document.getElementById('rb-stat-none').textContent = none;
}
function renderScripts() {
var c = document.getElementById('rb-scripts');
var html = '';
SCRIPTS.forEach(function(s, i) {
html += '
' +
'
' + esc(s.tag) + '' +
'
' + esc(s.title) + '
' +
'
' + esc(s.text) + '
' +
'' +
'' +
'
Copy' +
'' +
'
';
});
c.innerHTML = html;
}
function renderChecks() {
var c = document.getElementById('rb-checks');
var html = '';
CHECKS.forEach(function(t, i) {
var done = !!state.checks[i];
html += '
' +
'' +
'' + esc(t) + '' +
'';
});
c.innerHTML = html;
}
function copyText(idx, btn) {
var text = SCRIPTS[idx].text;
var fallback = function() {
var ta = document.createElement('textarea');
ta.value = text; ta.style.position = 'fixed'; ta.style.opacity = '0';
document.body.appendChild(ta); ta.select();
try { document.execCommand('copy'); } catch (e) {}
document.body.removeChild(ta);
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).catch(fallback);
} else { fallback(); }
btn.classList.add('is-copied');
var label = btn.querySelector('.rb-copy-label');
if (label) label.textContent = 'Copied!';
setTimeout(function() {
btn.classList.remove('is-copied');
if (label) label.textContent = 'Copy';
}, 1800);
}
function attach() {
var tbody = document.getElementById('rb-rows');
tbody.addEventListener('input', onInput);
tbody.addEventListener('change', onInput);
tbody.addEventListener('click', function(e) {
var btn = e.target.closest('[data-del]');
if (btn) {
state.notes.splice(Number(btn.getAttribute('data-del')), 1);
saveState();
renderRows();
renderStats();
}
});
document.getElementById('rb-add').addEventListener('click', function() {
state.notes.push({ guest: '', gift: '', status: 'Not started', dateSent: '', notes: '', mailed: false });
saveState();
renderRows();
renderStats();
});
document.getElementById('rb-scripts').addEventListener('click', function(e) {
var btn = e.target.closest('[data-copy]');
if (btn) copyText(Number(btn.getAttribute('data-copy')), btn);
});
document.getElementById('rb-checks').addEventListener('change', function(e) {
var c = e.target.closest('[data-check]');
if (c) {
var i = Number(c.getAttribute('data-check'));
state.checks[i] = c.checked;
saveState();
var li = c.closest('.rb-check-item');
if (li) li.classList.toggle('is-done', c.checked);
}
});
document.getElementById('rb-csv').addEventListener('click', function() {
var rows = [['Guest','Gift','Status','Date sent','Notes','Mailed']];
state.notes.forEach(function(n) {
rows.push([n.guest, n.gift, n.status, n.dateSent, n.notes, n.mailed?'Yes':'No']);
});
var csv = rows.map(function(r) {
return r.map(function(c) {
var s = String(c == null ? '' : c);
if (s.indexOf(',') !== -1 || s.indexOf('"') !== -1 || s.indexOf('\n') !== -1) return '"' + s.replace(/"/g,'""') + '"';
return s;
}).join(',');
}).join('\n');
var blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'wedding-thank-yous.csv';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(function() { URL.revokeObjectURL(url); }, 100);
});
document.getElementById('rb-print').addEventListener('click', function() { window.print(); });
document.getElementById('rb-reset').addEventListener('click', function() {
if (confirm('Reset thank you tracker?')) {
try { localStorage.removeItem(STORAGE_KEY); } catch (e) {}
state = loadState();
renderRows();
renderStats();
renderChecks();
}
});
}
function onInput(e) {
var t = e.target;
var tr = t.closest('tr[data-i]');
if (!tr) return;
var i = Number(tr.getAttribute('data-i'));
var f = t.getAttribute('data-field');
if (!f || !state.notes[i]) return;
var v = t.type === 'checkbox' ? t.checked : t.value;
state.notes[i][f] = v;
saveState();
if (f === 'status') {
renderStats();
} else {
renderStats();
}
}
renderRows();
renderStats();
renderScripts();
renderChecks();
attach();
})();
Writing wedding thank you notes doesn’t have to feel overwhelming. Using a Google Doc turns a traditionally tedious task into a manageable system.
You and your partner can work on the document at the same time, splitting the guest list and drafting notes together, even if you’re in different locations.
With modular scripts for different scenarios, you’re not rewriting the same sentences 150 times. You simply personalize each note while keeping your tone consistent.
Draft notes digitally, mark them as “final,” then hand-write them into your physical cards. No more guessing which version you meant to send.
For couples balancing post-wedding life, a Google Docs thank you card template saves time without sacrificing sincerity.
Your wedding should be all about the 'I do,' not the to-do list! Finish your notes faster, stay organized, and send messages that actually feel meaningful.