Free Travel Planning Tools

Budget your trip, build your packing list, estimate pet travel costs, and plan your itinerary — all free, no signup required.

Tool #1

Travel Budget Calculator

Use the 40/25/20/15 rule to allocate your vacation budget. Adjust the sliders and share your plan.

40%
25%
20%
15%
Accommodation
Food & Drink
Activities
Buffer
$1,200
$750
$600
$450

Per Person: $1,500/trip

Total: $3,000 for 2 travelers

Tool #2

Packing Checklist Generator

Select your destination type, season, and trip length. Get a complete categorized checklist you can check off and share.

Tool #3 — NEW

Pet Travel Cost Estimator

Flying your dog or cat internationally? Estimate your total cost based on pet size, destination, and airline type.

Tool #4

Trip Itinerary Builder

Drag activities to each day to build your trip plan. Add custom activities and organize your perfect vacation.

Drag activities into your day plan:

📅 Day 1

📅 Day 2

📅 Day 3

Ready to start planning?

Read our destination guides with real prices, honest reviews, and insider tips.

Explore DreamVacati Guides →
'); w.document.close(); w.print(); } // ═══════════════════════════════════════════════════ // PET TRAVEL COST ESTIMATOR // ═══════════════════════════════════════════════════ function calcPetCost(){ const type = document.getElementById('pet-type').value; const dest = document.getElementById('pet-dest').value; const cabin = document.getElementById('pet-cabin').value; const container = document.getElementById('pet-results'); container.style.display = 'block'; const isLarge = type==='dog-lg'||type==='dog-md'; const isCat = type==='cat'; // Costs database const costs = { microchip: {low:45,high:75,label:'Microchip (ISO 11784/11785)',icon:'💉',bg:'var(--teal-light)'}, rabies: {low:25,high:50,label:'Rabies Vaccine',icon:'💊',bg:'var(--coral-light)'}, healthcert: {low:100,high:250,label:dest==='eu'?'EU Health Certificate + USDA Endorsement':'Health Certificate',icon:'📄',bg:'var(--sand-light)'}, crate: {low:isLarge?150:isCat?50:75, high:isLarge?350:isCat?100:150, label:'IATA-Approved Carrier/Crate',icon:'📦',bg:'var(--teal-light)'}, airline: {low:cabin==='cabin'?100:200, high:cabin==='cabin'?250:500, label:`Airline Fee (${cabin==='cabin'?'In-Cabin':'Cargo'})`,icon:'✈️',bg:'var(--coral-light)'}, extras: {low:40,high:100,label:'Calming spray, bedding, water dispenser',icon:'🧴',bg:'var(--sand-light)'} }; // Add tapeworm for EU if(dest==='eu'||dest==='uk'){ costs.tapeworm = {low:20,high:50,label:'Tapeworm Treatment (EU/UK requirement)',icon:'💊',bg:'var(--teal-light)'}; } let totalLow=0, totalHigh=0; let rows = ''; Object.values(costs).forEach(c=>{ totalLow += c.low; totalHigh += c.high; rows += `
${c.icon}
${c.label}
$${c.low}–$${c.high}
`; }); // Destination-specific tips const tips = { eu:'Microchip must come BEFORE rabies vaccine (EU law). After rabies shot, wait 21 days before traveling. Health cert valid for 4 months of intra-EU travel.', uk:'UK requires a tapeworm treatment 1-5 days before entry. The UK is no longer part of the EU pet passport system post-Brexit.', ca:'Canada requires a current rabies vaccination certificate. No quarantine for dogs from the US if paperwork is in order.', mx:'Mexico requires a health certificate issued within 72 hours of travel. Much simpler than EU requirements.', other:'Requirements vary widely. Start 3+ months early and contact your destination country\'s embassy for exact requirements.' }; const shareText = `Planning to fly my ${type.replace('-',' ')} to ${dest==='eu'?'Europe':dest==='uk'?'the UK':dest==='ca'?'Canada':dest==='mx'?'Mexico':'abroad'}.\n\nEstimated cost: $${totalLow}–$${totalHigh}\n\n${Object.values(costs).map(c=>`${c.icon} ${c.label}: $${c.low}–$${c.high}`).join('\n')}\n\nFree pet travel cost calculator at dreamvacati.com\nFull guide: dreamvacati.com/blog-elmo.html`; container.innerHTML = `
${rows}
Estimated Total Cost $${totalLow.toLocaleString()} – $${totalHigh.toLocaleString()}
💡 Key Tip: ${tips[dest]}

📖 Read our complete guide with airline comparisons and step-by-step checklist: Flying Your Dog to Europe →

Share on X:

${shareText}
`; } // ═══════════════════════════════════════════════════ // ITINERARY BUILDER // ═══════════════════════════════════════════════════ const defaultActivities = ['Beach Day','Museum Visit','City Walking Tour','Local Food Tour','Sunset Cruise','Hiking Trail','Shopping District','Spa Day','Snorkeling/Diving','Cooking Class','Wine Tasting','Night Market']; let dayCount = 3; function renderPool(){ const pool = document.getElementById('activity-pool'); pool.innerHTML = ''; defaultActivities.forEach(a=>{ const chip = document.createElement('div'); chip.className = 'activity-chip'; chip.draggable = true; chip.textContent = a; chip.ondragstart = ev=>ev.dataTransfer.setData('text/plain',a); pool.appendChild(chip); }); } renderPool(); function addCustomActivity(){ const input = document.getElementById('custom-activity'); const name = input.value.trim(); if(!name)return; if(!defaultActivities.includes(name)) defaultActivities.push(name); renderPool(); input.value = ''; } function e(ev){ev.preventDefault();ev.currentTarget.classList.add('drag-over')} function dl(ev){ev.currentTarget.classList.remove('drag-over')} function dropDay(ev){ ev.preventDefault(); ev.currentTarget.classList.remove('drag-over'); const activity = ev.dataTransfer.getData('text/plain'); const item = document.createElement('div'); item.className = 'scheduled-item'; item.innerHTML = `${activity}`; ev.currentTarget.appendChild(item); updateItinShare(); } function addDay(){ dayCount++; const grid = document.getElementById('days-grid'); const col = document.createElement('div'); col.className = 'day-column'; col.dataset.day = dayCount; col.ondragover = e; col.ondragleave = dl; col.ondrop = dropDay; col.innerHTML = `

📅 Day ${dayCount}

`; grid.appendChild(col); } function updateItinShare(){ const shareBox = document.getElementById('itin-share'); const days = document.querySelectorAll('.day-column'); let hasItems = false; let text = 'My trip itinerary:\n'; days.forEach(day=>{ const items = day.querySelectorAll('.scheduled-item span:first-child'); if(items.length){ hasItems = true; text += `\n📅 Day ${day.dataset.day}:\n`; items.forEach(it=>text+=` • ${it.textContent}\n`); } }); if(hasItems){ text += '\nBuilt with the free itinerary planner at dreamvacati.com'; document.getElementById('itin-share-text').textContent = text; shareBox.style.display = 'block'; } else { shareBox.style.display = 'none'; } } // ═══════════════════════════════════════════════════ // SHARE UTILITIES // ═══════════════════════════════════════════════════ function shareToX(tool){ const textEl = document.getElementById(tool==='budget'?'budget-share-text':tool==='pack'?'pack-share-text':tool==='pet'?'pet-share-text':'itin-share-text'); const text = textEl.textContent; const url = `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}`; window.open(url,'_blank','width=600,height=400'); } function copyText(id){ const text = document.getElementById(id).textContent; navigator.clipboard.writeText(text).then(()=>{ const btn = event.target; const orig = btn.textContent; btn.textContent = '✓ Copied!'; setTimeout(()=>btn.textContent=orig,2000); }); } // NAV active state const observer = new IntersectionObserver(entries=>{ entries.forEach(en=>{ if(en.isIntersecting){ document.querySelectorAll('.tool-link').forEach(l=>l.classList.remove('active')); const lin