That’s why the Room Blocks by Engine Wedding Itinerary Template is designed as a guest-facing roadmap, not a behind-the-scenes vendor timeline.
Free wedding itinerary template
Your master weekend roadmap
A wedding is not a day, it is an experience. Give your guests a clear guide from rehearsal to brunch so nobody misses a moment. Try the timeline below, then download the kit.
Interactive preview
The complete wedding weekend
23 events from Friday rehearsal to Sunday brunch. Check off events as they happen.
All days 23
Friday 3
Saturday 18
Sunday 2
Download as CSV
Print
Reset itinerary
Itinerary vs timeline
Two documents, two purposes
A vendor timeline is minute-by-minute. A guest itinerary is high level and logistics-heavy. You need both, but they are not the same.
Internal
The vendor timeline
Detailed, minute-by-minute, vendor-focused. Load-in times, mic checks, soundcheck windows, plate-out times. Lives with the planner and key vendors only.
Public
The guest itinerary
High level, guest-focused, logistics-heavy. Shuttle times, dress codes, addresses, where to be and when. Shared via welcome bags, email, and the wedding website.
Inside the download
Three itinerary types for three audiences
The kit includes a tailored format for each group involved in the weekend.
01
Guest welcome itinerary
A beautiful, printable card for welcome bags. Locations, times, dress codes, and shuttle pickups.
02
Wedding party VIP guide
A granular, minute-by-minute schedule for bridesmaids and groomsmen. Hair times, transport, photo windows.
03
Weekend overview
A one-page summary for the wedding website covering Friday through Sunday at a glance.
Before you share
15 considerations for the perfect itinerary
Cover these before you print or post. Your progress saves automatically.
(function() {
'use strict';
var STORAGE_KEY = 'rb-iti-preview-v1';
var EVENTS = [
{ day: 'fri', label: 'Friday', time: '2:00 PM', name: 'Rehearsal setup and decor drop-off', loc: 'Venue ceremony area', who: 'Wedding planner', notes: 'All centerpiece boxes dropped off', done: true },
{ day: 'fri', label: 'Friday', time: '4:00 PM', name: 'Wedding ceremony rehearsal', loc: 'Venue ceremony area', who: 'Officiant and planner', notes: 'Wedding party, parents, readers', done: true },
{ day: 'fri', label: 'Friday', time: '6:00 PM', name: 'Rehearsal dinner', loc: 'Restaurant: The Bistro', who: "Parents of groom", notes: 'Includes speeches prep', done: false },
{ day: 'sat', label: 'Saturday', time: '8:00 AM', name: 'Hair and makeup team arrival', loc: 'Bridal suite', who: 'Bella Bridal Beauty', notes: 'Start with bridesmaids 1 and 2', done: true },
{ day: 'sat', label: 'Saturday', time: '10:00 AM', name: 'Photographer and videographer arrive', loc: 'Bridal suite and groom suite', who: 'Lens and Light Photography', notes: 'Detail shots: rings, dress, invites', done: true },
{ day: 'sat', label: 'Saturday', time: '11:30 AM', name: 'Lunch delivered to bridal suite', loc: 'Bridal suite', who: 'Caterer', notes: 'Light sandwiches and fruit', done: true },
{ day: 'sat', label: 'Saturday', time: '1:00 PM', name: 'Groom and groomsmen photos', loc: 'Venue gardens', who: 'Lens and Light Photography', notes: 'Wear boutonnieres', done: false },
{ day: 'sat', label: 'Saturday', time: '2:00 PM', name: 'Bride gets dressed', loc: 'Bridal suite', who: 'Helper or Mom', notes: 'Planner to monitor timing', done: true },
{ day: 'sat', label: 'Saturday', time: '2:30 PM', name: 'First look (optional)', loc: 'Designated spot (gazebo)', who: 'Photographer and videographer', notes: 'Wedding party to remain unseen', done: false },
{ day: 'sat', label: 'Saturday', time: '3:30 PM', name: 'Guests begin arriving', loc: 'Ceremony entrance', who: 'Ushers', notes: 'Welcome drinks available', done: true },
{ day: 'sat', label: 'Saturday', time: '4:00 PM', name: 'Ceremony start', loc: 'Venue ceremony area', who: 'Officiant', notes: 'Music starts at 3:45 PM', done: true },
{ day: 'sat', label: 'Saturday', time: '4:45 PM', name: 'Cocktail hour begins', loc: 'Venue terrace', who: 'Catering and bar staff', notes: 'Appetizers passed', done: true },
{ day: 'sat', label: 'Saturday', time: '5:00 PM', name: 'Family photos', loc: 'Venue portrait studio', who: 'Photographer', notes: 'Priority list provided to assistant', done: false },
{ day: 'sat', label: 'Saturday', time: '6:30 PM', name: 'Guests move to reception', loc: 'Ballroom entrance', who: 'Planner', notes: 'Announcer directs traffic', done: true },
{ day: 'sat', label: 'Saturday', time: '6:45 PM', name: 'Grand entrance and first dance', loc: 'Ballroom', who: 'DJ and MC', notes: 'Song: At Last', done: true },
{ day: 'sat', label: 'Saturday', time: '7:00 PM', name: 'Dinner service begins', loc: 'Ballroom', who: 'Catering', notes: 'Head table served first', done: true },
{ day: 'sat', label: 'Saturday', time: '8:00 PM', name: 'Toasts and speeches', loc: 'Ballroom stage', who: 'MC, Best Man, MOH', notes: 'Limit 3 speakers, 3 minutes each', done: false },
{ day: 'sat', label: 'Saturday', time: '8:30 PM', name: 'Cake cutting', loc: 'Ballroom', who: 'Baker', notes: 'Save top tier', done: true },
{ day: 'sat', label: 'Saturday', time: '8:45 PM', name: 'Open dance floor', loc: 'Ballroom', who: 'DJ', notes: 'Music requests start', done: false },
{ day: 'sat', label: 'Saturday', time: '10:30 PM', name: 'Late night snack service', loc: 'Bar area', who: 'Catering', notes: 'Mini pizzas and sliders', done: true },
{ day: 'sat', label: 'Saturday', time: '11:45 PM', name: 'Last dance announced', loc: 'Ballroom', who: 'DJ', notes: '', done: true },
{ day: 'sun', label: 'Sunday', time: '12:00 AM', name: 'Sparkler exit and grand departure', loc: 'Venue exit', who: 'Coordinator', notes: 'Designated photographer position', done: true },
{ day: 'sun', label: 'Sunday', time: '10:00 AM', name: 'Post-wedding brunch', loc: 'Hotel breakfast hall', who: 'Hotel coordinator', notes: 'For out-of-town guests', done: false }
];
var CHECKS = [
'Shuttle pickup and drop-off times listed for every hotel block location.',
'Specific dress code listed for each individual event.',
'Physical address for every venue clearly written or hyperlinked.',
'Buffer time between ceremony and cocktail hour for guest travel.',
'Recommended local coffee shops or landmarks included for downtime.',
'Invite Only events clearly identified vs. All Guest events.',
'Specific emergency Point of Contact listed so guests do not call the couple.',
'Indoor vs outdoor venues marked so guests choose appropriate footwear.',
'Specific timing for the Group Photo so all family members are present.',
'Wedding website URL or QR code included for real-time updates.',
'Different time zones accounted for if this is a destination wedding.',
'Last Call or Grand Exit time clearly marked for transportation planning.',
'Day Of instructions for the wedding party separate from guest itinerary.',
'Welcome Note included to set the tone for the festivities.',
'Font size and layout optimized for mobile viewing.'
];
var state = loadState();
function loadState() {
try {
var raw = localStorage.getItem(STORAGE_KEY);
if (raw) return JSON.parse(raw);
} catch (e) {}
var s = { done: {}, filter: 'all', checks: {} };
EVENTS.forEach(function(e, i) { s.done[i] = !!e.done; });
return s;
}
function saveState() {
try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (e) {}
}
function escapeHtml(s) {
if (s == null) return '';
return String(s).replace(/[&<>"']/g, function(c) {
return { '&':'&','<':'<','>':'>','"':'"',"'":''' }[c];
});
}
function renderTimeline() {
var c = document.getElementById('rb-timeline');
var html = '';
var lastLabel = null;
EVENTS.forEach(function(e, i) {
if (state.filter !== 'all' && state.filter !== e.day) return;
var done = !!state.done[i];
if (state.filter === 'all' && e.label !== lastLabel) {
html += '
' + escapeHtml(e.label) + '
';
lastLabel = e.label;
}
html += '
' +
'
' +
'
' + escapeHtml(e.time) + '
' +
'
' +
'
' + escapeHtml(e.name) + '
' +
'
' +
'' + escapeHtml(e.loc) + '' +
'' + escapeHtml(e.who) + '' +
'
' +
(e.notes ? '
' + escapeHtml(e.notes) + '
' : '') +
'
' +
'' +
'
' +
'
';
});
if (!html) html = '
No events for this day.
';
c.innerHTML = html;
}
function renderStats() {
var done = 0;
EVENTS.forEach(function(e, i) { if (state.done[i]) done += 1; });
var pct = Math.round((done / EVENTS.length) * 100);
document.getElementById('rb-stat-done').textContent = done;
document.getElementById('rb-stat-pct').textContent = pct + '%';
}
function renderChecks() {
var c = document.getElementById('rb-checks');
var html = '';
CHECKS.forEach(function(t, i) {
var done = !!state.checks[i];
html += '
' +
'' +
'' + escapeHtml(t) + '' +
'';
});
c.innerHTML = html;
}
function attachEvents() {
document.getElementById('rb-timeline').addEventListener('change', function(e) {
if (e.target.classList.contains('rb-event-check')) {
var i = e.target.getAttribute('data-event');
state.done[i] = e.target.checked;
saveState();
var ev = e.target.closest('.rb-event');
if (ev) ev.classList.toggle('is-done', e.target.checked);
renderStats();
}
});
document.getElementById('rb-day-tabs').addEventListener('click', function(e) {
var btn = e.target.closest('.rb-day-tab');
if (!btn) return;
state.filter = btn.getAttribute('data-day');
saveState();
document.querySelectorAll('.rb-day-tab').forEach(function(b){ b.classList.remove('is-active'); });
btn.classList.add('is-active');
renderTimeline();
});
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-download-csv').addEventListener('click', exportCSV);
document.getElementById('rb-print').addEventListener('click', function() { window.print(); });
document.getElementById('rb-reset').addEventListener('click', function() {
if (confirm('Reset itinerary to defaults?')) {
try { localStorage.removeItem(STORAGE_KEY); } catch (e) {}
state = loadState();
document.querySelectorAll('.rb-day-tab').forEach(function(b){ b.classList.remove('is-active'); });
document.querySelector('.rb-day-tab[data-day="all"]').classList.add('is-active');
renderTimeline();
renderStats();
renderChecks();
}
});
}
function exportCSV() {
var rows = [['Day','Time','Event','Location','Responsible','Notes','Completed']];
EVENTS.forEach(function(e, i) {
rows.push([e.label, e.time, e.name, e.loc, e.who, e.notes, state.done[i] ? '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-itinerary.csv';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(function() { URL.revokeObjectURL(url); }, 100);
}
renderTimeline();
renderStats();
renderChecks();
attachEvents();
})();
Couples often confuse these two, but they serve very different purposes.
This is for vendors and planners. It’s detailed, minute-by-minute, and includes production logistics like setup times, cues, and transitions.
This is what your guests and wedding party actually need. It focuses on:
A smooth, stress-free wedding weekend where everyone knows where to be without needing constant updates.
The template is structured to hold all of this information cleanly in one place.
It’s designed as a clean, spreadsheet-style layout that’s easy to update and easy to share.
You can keep one master version and share simplified views as needed.
This single, editable Wedding Itinerary Template gives you one organized source of truth for your entire weekend. It helps ensure:
Whether you’re planning a one-day celebration or a full weekend wedding schedule, this template keeps everything clear, calm, and coordinated.