img#mv-trellis-img-1::before{padding-top:66.6015625%; }img#mv-trellis-img-1{display:block;}img#mv-trellis-img-2::before{padding-top:76.26953125%; }img#mv-trellis-img-2{display:block;}img#mv-trellis-img-3::before{padding-top:67.96875%; }img#mv-trellis-img-3{display:block;}img#mv-trellis-img-4::before{padding-top:77.24609375%; }img#mv-trellis-img-4{display:block;}img#mv-trellis-img-5::before{padding-top:100%; }img#mv-trellis-img-5{display:block;}img#mv-trellis-img-6::before{padding-top:100%; }img#mv-trellis-img-6{display:block;}img#mv-trellis-img-7::before{padding-top:65.0390625%; }img#mv-trellis-img-7{display:block;}The golden age of grabbing your passport and just going is officially over. For years, American travelers have enjoyed visa-free access to a huge portion of the planet, but a major global shift is underway. The world of travel has changed, and a new, often confusing, layer of bureaucracy and fees is becoming the new normal for almost every trip.
Here at Travel Off Path, we’re all about giving you the real, on-the-ground intel to travel smarter. We’ve been tracking this trend, and the list of countries requiring Americans to pay for some form of electronic travel pass has exploded. And with Europe’s long-delayed ETIAS system now on the horizon, that number is about to get a whole lot bigger. The full list is long and confusing, but don’t worry—at the end of this article, we’ve created a simple Fee Finder tool where you can check all 68 destinations in seconds.
It’s Not Just Visas Anymore
First, let’s be clear: we’re not talking about traditional, complicated visas that require embassy appointments. We’re talking about a growing web of online applications, from Electronic Travel Authorizations (ETAs) and eVisas to regional “tourist taxes” that are all mandatory and must be paid before you travel.
This trend has now gone beyond just countries. Even specific regions within popular, visa-free destinations are adding their own fees. Two of Americans’ absolute favorite vacation spots are now on the list:
What Happens If You Don’t Pay?
This isn’t something you can just ignore and deal with at the airport. The consequences are real and can ruin your trip.
For national-level requirements like an ETA or eVisa (which are now required for countries like the UK, Australia, Brazil, and Kenya), the consequence is simple and brutal: you will be denied boarding at your departure airport in the U.S. No pass, no flight. The airline staff will check for your authorization before they even let you on the plane.
For regional tourist taxes like the one in Cancun, the enforcement has been inconsistent but is getting stricter. Travelers have reported being pulled aside by officials before their departure flight home and hassled for proof of payment, causing stress and potential delays. The bottom line: these fees are not optional, and ignoring them is a huge gamble for your vacation.
The ETIAS Game-Changer: Europe Joins The List
The biggest change on the horizon is the long-delayed ETIAS (European Travel Information and Authorization System). After years of being pushed back, the recent rollout of the new EES fingerprinting system at European borders means the ETIAS is now highly likely to launch in the last quarter of 2026, as planned. This is the final piece of the puzzle.
Here’s the critical, updated information you need to know:
- What it is: A mandatory online travel authorization for Americans visiting the 30 countries in Europe’s Schengen Zone. It is NOT a visa.
- The Cost: The official fee has been updated and is now €20 (approximately $22 USD). Don’t be fooled by scam websites charging more.
- The Process: It will be a simple online application that should only take a few minutes to complete.
Once the ETIAS goes live, a huge chunk of Europe that was previously “just go” will now require a pre-approved travel pass, just like the UK and Australia do.
The Full List is Massive (And Confusing)
When you combine the countries that already have mandatory ETAs, eVisas, and tourist taxes with the 29 new countries that will be added under the ETIAS system, the grand total comes to a staggering 68 destinations.
From the UK to Australia, Brazil to Egypt, and soon, almost all of continental Europe, paying for an online travel pass is the new reality. It’s a critical new step in the travel planning process that savvy travelers can no longer afford to ignore.
To help you cut through the confusion and find out exactly what you need for your next trip, we’ve launched our proprietary Fee Finder tool below. Just type in your destination to see what you need to pay for before you fly.
@import url(‘https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap’);
#fee-finder-v47 {
font-family: ‘Poppins’, sans-serif;
background-color: #FFFFFF;
border: 1px solid #EAEAEA;
border-radius: 18px;
margin: 2em auto;
padding: 32px;
max-width: 550px;
box-shadow: 0 8px 30px rgba(0,0,0,0.08);
text-align: center;
overflow: hidden;
}
.ff-h3 { font-size: 1.5rem; font-weight: 700; color: #1f2937; margin: 0 0 8px 0; text-wrap: balance; }
.ff-last-updated { font-size: 0.8rem; color: #6b7280; margin-bottom: 24px; }
.ff-p { font-size: 1.1rem; color: #4b5563; margin: 0 auto 24px auto; max-width: 480px; line-height: 1.6; text-wrap: pretty; }
.ff-button {
display: block;
box-sizing: border-box;
width: 100%;
max-width: 300px;
margin-left: auto;
margin-right: auto;
border: none;
background-color: #8255b6;
color: #fff !important;
padding: 14px 28px;
font-size: 1rem;
font-weight: 700;
border-radius: 12px;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
text-align: center;
}
.ff-button:hover {
transform: translateY(-2px);
background-color: #6a4595;
box-shadow: 0 6px 12px rgba(130, 85, 182, 0.2);
}
.ff-back-button { background-color: #e5e7eb; color: #4b5563 !important; box-shadow: none; }
.ff-back-button:hover { background-color: #d1d5db; transform:none; box-shadow: none; }
.ff-input { width: 100%; padding: 1rem; font-size: 1.1rem; border: 1px solid #d1d5db; border-radius: 12px; margin-bottom: 1rem; box-sizing: border-box; background: #fff; }
.ff-country-list { min-height: 30vh; max-height: 40vh; overflow-y: auto; text-align: left; border: 1px solid #e5e7eb; border-radius: 12px; background: #fff; }
.ff-list-item { padding: 0.9rem 1.2rem; font-weight: 500; cursor: pointer; transition: background-color 0.15s ease-in-out, color 0.15s ease-in-out; border-bottom: 1px solid #e5e7eb; }
.ff-list-item:last-child { border-bottom: none; }
.ff-list-item:hover { background-color: #8255b6; color: #fff; }
.ff-region-grid { display: flex; flex-direction: column; gap: 0.75rem; margin-bottom: 1rem; }
.ff-region-button { background-color: #fff; border: 1px solid #d1d5db; width: 100%; padding: 1rem; border-radius: 12px; font-size: 1.1rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; text-align: left; box-shadow: 0 1px 2px rgba(0,0,0,0.05); color: #111827; }
.ff-region-button:hover { border-color: #8255b6; background-color: #f5f3ff; color: #111827; }
.ff-region-subtext { font-size: 0.9rem; color: #6b7280; font-weight: 400; padding-left: 0.25rem; }
/* — CRITICAL FIX: Replaced fragile ‘flex’ with robust ‘grid’ layout — */
.ff-result-card {
display: grid;
grid-template-columns: 48px 1fr; /* Fixed column for icon, flexible column for details */
align-items: flex-start;
gap: 1rem;
background-color: #ffffff;
border: 1px solid #e5e7eb;
padding: 1.5rem;
border-radius: 16px;
margin-bottom: 1rem;
text-align: left;
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
}
.ff-fee-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 1rem; font-weight: 700; background-color: #f3f4f6; color: #4b5563; }
.ff-fee-details { /* No longer needs flex properties */ }
.ff-fee-name { font-size: 1.25rem; font-weight: 700; color: #111827; margin: 0; text-wrap: balance; }
.ff-fee-cost { font-size: 1.1rem; font-weight: 600; color: #8255b6; margin: 0.25rem 0; }
.ff-fee-notes { font-size: 0.95rem; line-height: 1.5; color: #4b5563; margin: 0.5rem 0 0 0; text-wrap: pretty; }
.ff-notice-card { text-align: center; background-color: #ffffff; border: 1px solid #e5e7eb; padding: 1.5rem; border-radius: 16px; margin-bottom: 1rem; box-shadow: 0 1px 3px rgba(0,0,0,0.05); }
.ff-notice-title { color: #16a34a; margin-top: 0 !important; }
.ff-etias-notice { background-color: #fefce8; color: #854d0e; border: 1px solid #fde047; border-radius: 8px; padding: 1rem; margin-top: 1rem; text-align: left; line-height: 1.5; }
.ff-etias-notice strong { font-weight: 700; }
.ff-etias-notice a { color: #854d0e; font-weight: 700; text-decoration: underline; }
.view-container { animation: fadeIn 0.3s ease-in-out; }
.ff-powered-by, .ff-feedback-link { text-align: center; margin-top: 1.5rem; font-size: 0.8rem; color: #a0aec0; }
.ff-powered-by a, .ff-feedback-link a { color: #718096; text-decoration: none; font-weight: 600; }
.ff-powered-by a:hover, .ff-feedback-link a:hover { text-decoration: underline; }
.ff-actions-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
margin-top: 1rem;
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
document.addEventListener(‘DOMContentLoaded’, function() {
(function() { // Anonymous function to prevent conflicts with other scripts
const container = document.getElementById(‘fee-finder-v47’); // Updated ID
if (!container) return;
// — CONFIG & DATA —
const config = {
lastUpdated: ‘October 19, 2025’
};
const data = {
icons: { ETA: ‘ETA’, eVisa: ‘VISA’, ‘Tourism Levy’: ‘FEE’ },
feeDatabase: { “Australia”: { fees: [{ feeName: “Electronic Travel Authority (ETA)”, type: “ETA”, cost: “~$13 USD”, notes: “Application is exclusively via the official mobile app. For tourism or business visits up to 3 months.”, url: “https://immi.homeaffairs.gov.au/visas/getting-a-visa/visa-listing/electronic-travel-authority-601” }] }, “Azerbaijan”: { fees: [{ feeName: “ASAN Visa”, type: “eVisa”, cost: “~$29 USD”, notes: “Standard processing is 3 working days. Single entry, valid for 30 days.”, url: “https://evisa.gov.az/en/” }] }, “Bahrain”: { fees: [{ feeName: “eVisa”, type: “eVisa”, cost: “~$25 – $116 USD”, “notes”: “Cost depends on visa type (e.g., 2-week single entry vs. 1-year multiple entry).”, “url”: “https://www.evisa.gov.bh/” }] }, “Benin”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “~$60 – $120 USD”, “notes”: “Cost depends on visa duration and single vs. multiple entry.”, “url”: “http://evisa.bj/” }] }, “Bhutan”: { fees: [{ feeName: “Sustainable Development Fee (SDF)”, type: “Tourism Levy”, cost: “$100 USD per person, per night”, notes: “Core of Bhutan’s ‘High-Value, Low-Impact’ tourism policy.”, “url”: “https://bhutan.travel/” }] }, “Bolivia”: { “fees”: [{ “feeName”: “Tourist Visa on Arrival”, “type”: “eVisa”, “cost”: “$160 USD”, “notes”: “Payable upon arrival. It is strongly recommended to have the exact amount in crisp, new U.S. dollar bills.”, “url”: “” }] }, “Bonaire”: { fees: [{ feeName: “Visitor Entry Tax”, type: “Tourism Levy”, cost: “$75 USD”, notes: “Replaced previous room and car taxes. Payable online or on arrival.”, url: “https://tourismtax.bonairegov.com/” }] }, “Botswana”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$30 – $50 USD”, notes: “Allow at least 21 working days for processing. Requires tour plan and bookings.”, “url”: “https://evisa.gov.bw/” }] }, “Brazil”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “~$81 USD”, notes: “Required for citizens of Australia, Canada, and the USA starting April 10, 2025.”, “url”: “https://brazil.vfsevisa.com/” }] }, “Cambodia”: { fees: [{ feeName: “Tourist e-Visa (Type T)”, type: “eVisa”, cost: “$36 USD”, notes: “For tourism purposes only. Single entry, 30-day stay.”, “url”: “https://www.evisa.gov.kh/” }] }, “Cape Verde”: { fees: [{ feeName: “E.A.S.E. (Pre-registration)”, type: “ETA”, cost: “~$34 USD”, notes: “Mandatory online pre-registration and payment of airport security tax before travel.”, “url”: “https://www.ease.gov.cv/” }] }, “Ecuador”: { “requiresRegion”: true, “regions”: { “Galapagos Islands”: { “mainName”: “Galapagos Islands”, “subName”: “”, “fees”: [{ “feeName”: “Galapagos National Park Entrance Fee”, “type”: “Tourism Levy”, “cost”: “$100 USD”, “notes”: “Paid in cash upon arrival in the Galapagos.”, “url”: “” }, { “feeName”: “Transit Control Card (TCT)”, “type”: “Tourism Levy”, “cost”: “$20 USD”, “notes”: “Paid in cash at the airport on the mainland before departing for the islands.”, “url”: “” }] }, “Anywhere Else”: { “mainName”: “Anywhere Else in Ecuador”, “subName”: “”, “fees”: [] } } }, “Egypt”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$25 – $60 USD”, notes: “Apply at least 7 days before departure. For tourism purposes, 30-day stay.”, url: “https://www.visa2egypt.gov.eg/eVisa/” }] }, “El Salvador”: { fees: [{ feeName: “Tourist Card”, type: “Tourism Levy”, cost: “$12 USD”, notes: “A mandatory tourist card fee for visitors from many countries, including the U.S. Payable in cash upon arrival.”, url: “” }] }, “Ethiopia”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$52 – $72 USD”, notes: “For tourism purposes only. Must enter via Addis Ababa Bole International Airport.”, “url”: “https://www.evisa.gov.et/” }] }, “India”: { fees: [{ feeName: “e-Tourist Visa”, type: “eVisa”, cost: “$10 – $80 USD”, notes: “Fees vary significantly by nationality and season. Options for 30-day, 1-year, or 5-year visas.”, “url”: “https://indianvisaonline.gov.in/” }] }, “Indonesia”: { fees: [{ feeName: “Bali Tourist Levy”, type: “Tourism Levy”, cost: “~$10 USD”, notes: “A one-time provincial fee per entry into Bali. This is separate from the national visa fee.”, “url”: “https://lovebali.baliprov.go.id/” }, { feeName: “e-Visa on Arrival (e-VOA)”, type: “eVisa”, cost: “~$32 USD”, notes: “For tourism and business. Single entry, valid for 30 days, extendable once.”, “url”: “https://evisa.imigrasi.go.id/” }] }, “Israel”: { fees: [{ feeName: “Electronic Travel Authorization (ETA-IL)”, type: “ETA”, cost: “~$7 USD”, notes: “Mandatory for visitors from visa-exempt countries, including the U.S. Must be obtained online prior to travel.”, url: “https://israel-entry.piba.gov.il/” }] }, “Italy”: { requiresRegion: true, “regions”: { “Venice”: { mainName: “Venice”, subName: “(Day-trip only)”, fees: [{ feeName: “Venice Access Fee”, type: “Tourism Levy”, cost: “~$5.50 USD”, notes: “For day-trippers on designated peak days. Price can vary. Overnight hotel guests are exempt but must still register for a QR code.”, url: “https://cda.ve.it/” }] }, “Anywhere Else”: { mainName: “Anywhere Else in Italy”, subName: “”, fees: [] } } }, “Japan”: { fees: [{ feeName: “eVISA”, type: “eVisa”, cost: “~$20 USD”, notes: “For short-term tourism (up to 90 days). Available to specific nationalities including USA, UK, Canada.”, url: “https://www.evisa.mofa.go.jp/index” }] }, “Jordan”: { fees: [{ feeName: “e-Visa (via Jordan Pass)”, type: “Tourism Levy”, cost: “~$99 – $113 USD”, notes: “The visa fee is waived if you purchase a ‘Jordan Pass’ before arrival, which includes entry to sites like Petra. This is the most common method for tourists.”, “url”: “https://www.jordanpass.jo/” }] }, “Kenya”: { fees: [{ feeName: “Electronic Travel Authorisation (ETA)”, type: “ETA”, cost: “~$34 USD”, notes: “Replaced the visa system in January 2024 for all foreign visitors.”, “url”: “https://www.etakenya.go.ke/” }] }, “Laos”: { fees: [{ feeName: “eVisa”, type: “eVisa”, cost: “$52 USD”, notes: “For tourist purposes, single entry, 30-day stay.”, “url”: “https://laoevisa.gov.la/” }] }, “Mexico”: { requiresRegion: true, “regions”: { “Quintana Roo”: { mainName: “Quintana Roo”, subName: “(Cancun, Tulum, etc.)”, fees: [{ feeName: “VisiTAX”, type: “Tourism Levy”, cost: “~$12 USD”, notes: “A state tourism tax for international tourists arriving by air.”, “url”: “https://www.visitax.gob.mx/” }] }, “Baja California Sur”: { mainName: “Baja California Sur”, subName: “(Los Cabos, La Paz, etc.)”, fees: [{ feeName: “EmbraceIt”, type: “Tourism Levy”, cost: “~$28 USD”, notes: “A mandatory tourism contribution for visitors staying more than 24 hours.”, url: “https://embrace.bcs.gob.mx/” }] }, “Anywhere Else”: { mainName: “Somewhere Else in Mexico”, subName: “”, fees: [] } } }, “New Zealand”: { fees: [{ feeName: “NZeTA”, type: “ETA”, cost: “~$10 – $14 USD”, notes: “The mandatory Electronic Travel Authority. Price depends on if you use the app or website.” }, { feeName: “IVL (Tourism Levy)”, type: “Tourism Levy”, cost: “~$61 USD”, notes: “The International Visitor Conservation and Tourism Levy. Both NZeTA and IVL are paid in a single transaction.”, “url”: “https://www.immigration.govt.nz/new-zealand-visas/apply-for-a-visa/about-visa/nzeta” }] }, “Nicaragua”: { fees: [{ feeName: “Tourist Card”, type: “Tourism Levy”, cost: “$10 USD”, notes: “A mandatory tourist card fee, payable in cash upon arrival at the airport.”, url: “” }] }, “Oman”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “~$52 USD for 30 days”, notes: “Available for many nationalities. U.S. citizens can also enter visa-free for up to 14 days.”, “url”: “https://evisa.rop.gov.om/” }] }, “Pakistan”: { fees: [{ feeName: “Visa in Your Inbox”, type: “eVisa”, cost: “$35+ USD”, notes: “Cost varies by nationality and visa type. Online tourist visa system is available.”, “url”: “https://visa.nadra.gov.pk/” }] }, “Paraguay”: { “fees”: [{ “feeName”: “Visa on Arrival”, “type”: “eVisa”, “cost”: “$160 USD”, “notes”: “Payable in cash only upon arrival at the airport.”, “url”: “” }] }, “Rwanda”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$50 USD”, notes: “U.S. citizens and others can also obtain a visa on arrival for the same price.”, url: “https://irembo.gov.rw/home/citizen/all_services” }] }, “Saint Kitts and Nevis”: { fees: [{ feeName: “Arrival Tax”, type: “Tourism Levy”, cost: “$25 USD”, notes: “A mandatory arrival tax for visitors, tied to the online immigration and customs form.”, url: “https://www.knatravelform.kn/” }] }, “Saudi Arabia”: { fees: [{ feeName: “Tourist e-Visa”, type: “eVisa”, cost: “~$142 USD”, notes: “Online application for tourist visas, includes mandatory health insurance for your trip.”, “url”: “https://www.visitsaudi.com/en/travel-regulations” }] }, “Seychelles”: { fees: [{ feeName: “Travel Authorisation”, type: “ETA”, cost: “~$11 – $33 USD”, notes: “Mandatory for all foreign nationals. Fee depends on processing speed (standard vs. express).”, “url”: “https://seychelles.govtas.com/” }] }, “Suriname”: { “fees”: [{ “feeName”: “Entry Fee”, “type”: “eVisa”, “cost”: “$25 USD + €25 service fee (~$52 total)”, “notes”: “This must be paid online through the Suriname E-Visa website before travel.”, “url”: “https://suriname.vfsevisa.com/” }] }, “Tanzania”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$100 USD (for US citizens)”, notes: “The fee for U.S. citizens is higher due to reciprocity and is for a multiple-entry visa. Other nationalities pay $50.”, “url”: “https://visa.immigration.go.tz/” }] }, “Thailand”: { fees: [{ feeName: “Tourism Fee”, type: “Tourism Levy”, cost: “Not Yet Active”, notes: “The proposed 300 baht (~$9) tourism fee for air arrivals has been repeatedly delayed. As of mid-2025, there is no official start date and it is not being collected.”, url: “” }] }, “Turkey”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$50 USD (for US citizens)”, notes: “Cost varies by nationality. Must be obtained online before travel.”, “url”: “https://www.evisa.gov.tr/en/” }] }, “Uganda”: { fees: [{ feeName: “e-Visa”, type: “eVisa”, cost: “$50 USD”, notes: “Online application required for all visa types before travel.”, “url”: “https://visas.immigration.go.ug/” }] }, “United Kingdom”: { fees: [{ feeName: “Electronic Travel Authorisation (ETA)”, type: “ETA”, cost: “~$13 USD”, notes: “A new requirement for many visitors, including U.S. and Canadian citizens, who do not need a visa for short stays.”, url: “https://apply-for-an-eta.homeoffice.gov.uk/apply/electronic-travel-authorisation/easier-on-the-app” }] }, “Vietnam”: { “fees”: [{ “feeName”: “e-Visa”, “type”: “eVisa”, “cost”: “$25 – $50 USD”, “notes”: “Valid for up to 90 days. The online application is required before travel.”, url: “https://evisa.gov.vn/” }] } },
etiasCountries: [“Austria”, “Belgium”, “Bulgaria”, “Croatia”, “Cyprus”, “Czech Republic”, “Denmark”, “Estonia”, “Finland”, “France”, “Germany”, “Greece”, “Hungary”, “Iceland”, “Italy”, “Latvia”, “Liechtenstein”, “Lithuania”, “Luxembourg”, “Malta”, “Netherlands”, “Norway”, “Poland”, “Portugal”, “Romania”, “Slovakia”, “Slovenia”, “Spain”, “Sweden”, “Switzerland”],
masterCountryList: [“Afghanistan”, “Albania”, “Algeria”, “Andorra”, “Angola”, “Antigua and Barbuda”, “Argentina”, “Armenia”, “Australia”, “Austria”, “Azerbaijan”, “Bahamas”, “Bahrain”, “Bangladesh”, “Barbados”, “Belarus”, “Belgium”, “Belize”, “Benin”, “Bhutan”, “Bolivia”, “Bonaire”, “Bosnia and Herzegovina”, “Botswana”, “Brazil”, “Brunei”, “Bulgaria”, “Burkina Faso”, “Burundi”, “Cabo Verde”, “Cambodia”, “Cameroon”, “Canada”, “Central African Republic”, “Chad”, “Chile”, “China”, “Colombia”, “Comoros”, “Congo, Democratic Republic of the”, “Congo, Republic of the”, “Costa Rica”, “Cote d’Ivoire”, “Croatia”, “Cuba”, “Cyprus”, “Czech Republic”, “Denmark”, “Djibouti”, “Dominica”, “Dominican Republic”, “Ecuador”, “Egypt”, “El Salvador”, “Equatorial Guinea”, “Eritrea”, “Estonia”, “Eswatini”, “Ethiopia”, “Fiji”, “Finland”, “France”, “Gabon”, “Gambia”, “Georgia”, “Germany”, “Ghana”, “Greece”, “Grenada”, “Guatemala”, “Guinea”, “Guinea-issau”, “Guyana”, “Haiti”, “Honduras”, “Hungary”, “Iceland”, “India”, “Indonesia”, “Iran”, “Iraq”, “Ireland”, “Israel”, “Italy”, “Jamaica”, “Japan”, “Jordan”, “Kazakhstan”, “Kenya”, “Kiribati”, “Kuwait”, “Kyrgyzstan”, “Laos”, “Latvia”, “Lebanon”, “Lesotho”, “Liberia”, “Libya”, “Liechtenstein”, “Lithuania”, “Luxembourg”, “Madagascar”, “Malawi”, “Malaysia”, “Maldives”, “Mali”, “Malta”, “Marshall Islands”, “Mauritania”, “Mauritius”, “Mexico”, “Micronesia”, “Moldova”, “Monaco”, “Mongolia”, “Montenegro”, “Morocco”, “Mozambique”, “Myanmar”, “Namibia”, “Nauru”, “Nepal”, “Netherlands”, “New Zealand”, “Nicaragua”, “Niger”, “Nigeria”, “North Korea”, “North Macedonia”, “Norway”, “Oman”, “Pakistan”, “Palau”, “Palestine State”, “Panama”, “Papua New Guinea”, “Paraguay”, “Peru”, “Philippines”, “Poland”, “Portugal”, “Qatar”, “Romania”, “Russia”, “Rwanda”, “Saint Kitts and Nevis”, “Saint Lucia”, “Saint Vincent and the Grenadines”, “Samoa”, “San Marino”, “Sao Tome and Principe”, “Saudi Arabia”, “Senegal”, “Serbia”, “Seychelles”, “Sierra Leone”, “Singapore”, “Slovakia”, “Slovenia”, “Solomon Islands”, “Somalia”, “South Africa”, “South Korea”, “South Sudan”, “Spain”, “Sri Lanka”, “Sudan”, “Suriname”, “Sweden”, “Switzerland”, “Syria”, “Taiwan”, “Tajikistan”, “Tanzania”, “Thailand”, “Timor-Leste”, “Togo”, “Tonga”, “Trinidad and Tobago”, “Tunisia”, “Turkey”, “Turkmenistan”, “Tuvalu”, “Uganda”, “Ukraine”, “United Arab Emirates”, “United Kingdom”, “United States of America”, “Uruguay”, “Uzbekistan”, “Vanuatu”, “Vatican City”, “Venezuela”, “Vietnam”, “Yemen”, “Zambia”, “Zimbabwe”].sort()
};
let state = {
country: null,
searchTerm: ”
};
const injectStyles = () => {
// Styles are in a static tag, so this is not needed.
// Kept for structural consistency with other tools if needed.
};
const loadFonts = () => {
if (document.querySelector(‘link[href*=”Poppins”]’)) return;
const link = document.createElement(‘link’);
link.href = ‘https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap’;
link.rel = ‘stylesheet’;
document.head.appendChild(link);
};
const buildElement = (tag, options = {}) => {
const el = document.createElement(tag);
Object.assign(el, options);
return el;
};
const clearContainer = () => {
container.innerHTML = ”;
};
const renderView = (viewBuilder, params = {}) => {
clearContainer();
const viewContent = viewBuilder(params);
container.appendChild(viewContent);
};
const handleInteraction = (viewBuilder, params = {}) => {
container.scrollIntoView({ behavior: ‘smooth’, block: ‘start’ });
renderView(viewBuilder, params);
};
const buildStartView = () => {
const view = buildElement(‘div’, { className: ‘view-container’ });
view.appendChild(buildElement(‘h3’, { className: ‘ff-h3’, textContent: ‘The Global Traveler Fee Finder’ }));
view.appendChild(buildElement(‘p’, { className: ‘ff-last-updated’, textContent: `Last Updated: ${config.lastUpdated}` }));
view.appendChild(buildElement(‘p’, { className: ‘ff-p’, textContent: ‘Confusing tourist taxes, ETAs, and eVisas are everywhere. Get a simple, clear list of mandatory fees for your trip in seconds.’ }));
view.appendChild(buildElement(‘button’, { className: ‘ff-button’, textContent: ‘Check Your Destination’, onclick: () => handleInteraction(buildCountryView) }));
const poweredBy = buildElement(‘div’, { className: ‘ff-powered-by’ });
const link = buildElement(‘a’, { textContent: ‘Powered by Travel Off Path’, href: ‘https://www.traveloffpath.com’, target: ‘_blank’, rel: ‘noopener’ });
poweredBy.appendChild(link);
view.appendChild(poweredBy);
return view;
};
const buildCountryView = (params = {}) => {
const view = buildElement(‘div’, { className: ‘view-container’ });
view.appendChild(buildElement(‘h3’, { className: ‘ff-h3’, textContent: ‘Which country are you traveling to?’ }));
const searchTerm = params.searchTerm || ”;
const input = buildElement(‘input’, { className: ‘ff-input’, type: ‘text’, placeholder: ‘Type to find your country…’, value: searchTerm });
view.appendChild(input);
const list = buildElement(‘div’, { className: ‘ff-country-list’ });
const renderList = (filter) => {
list.innerHTML = ”;
const filtered = data.masterCountryList.filter(c => c.toLowerCase().includes(filter.toLowerCase()));
filtered.forEach(countryName => {
const item = buildElement(‘div’, { className: ‘ff-list-item’, textContent: countryName, onclick: () => {
state.country = countryName;
const countryData = data.feeDatabase[countryName];
if (countryData && countryData.requiresRegion) {
handleInteraction(buildRegionView, { country: countryName });
} else {
handleInteraction(buildResultView, { country: countryName });
}
}});
list.appendChild(item);
});
};
input.onkeyup = () => {
state.searchTerm = input.value;
renderList(input.value);
};
view.appendChild(list);
renderList(searchTerm);
return view;
};
const buildRegionView = (params) => {
const view = buildElement(‘div’, { className: ‘view-container’ });
const countryName = params.country;
const countryData = data.feeDatabase[countryName];
view.appendChild(buildElement(‘h3’, { className: ‘ff-h3’, textContent: `You’re going to ${countryName}! Where exactly?` }));
const grid = buildElement(‘div’, { className: ‘ff-region-grid’ });
Object.keys(countryData.regions).forEach(key => {
const region = countryData.regions[key];
const button = buildElement(‘button’, { className: ‘ff-region-button’, onclick: () => handleInteraction(buildResultView, { country: countryName, regionKey: key }) });
button.appendChild(document.createTextNode(region.mainName));
if (region.subName) {
button.appendChild(buildElement(‘span’, { className: ‘ff-region-subtext’, textContent: region.subName }));
}
grid.appendChild(button);
});
view.appendChild(grid);
view.appendChild(buildElement(‘button’, { className: ‘ff-button ff-back-button’, textContent: ‘Go Back’, onclick: () => handleInteraction(buildCountryView, { searchTerm: state.searchTerm }) }));
return view;
};
const buildResultView = (params) => {
const view = buildElement(‘div’, { className: ‘view-container’ });
const { country, regionKey } = params;
const countryData = data.feeDatabase[country];
const isEtias = data.etiasCountries.includes(country);
let feesToShow = [];
let resultHeaderTxt = `Results for ${country}`;
if (regionKey) {
feesToShow = countryData.regions[regionKey].fees;
resultHeaderTxt = `Results for ${countryData.regions[regionKey].mainName}, ${country}`;
} else if (countryData) {
feesToShow = countryData.fees || [];
}
view.appendChild(buildElement(‘h3’, { className: ‘ff-h3’, textContent: resultHeaderTxt }));
const actionsContainer = buildElement(‘div’, { className: ‘ff-actions-container’ });
if (feesToShow.length > 0) {
feesToShow.forEach(fee => {
const card = buildElement(‘div’, { className: ‘ff-result-card’ });
card.appendChild(buildElement(‘div’, { className: ‘ff-fee-icon’, textContent: data.icons[fee.type] || ‘FEE’ }));
const details = buildElement(‘div’, { className: ‘ff-fee-details’ });
details.appendChild(buildElement(‘h4’, { className: ‘ff-fee-name’, textContent: fee.feeName }));
details.appendChild(buildElement(‘p’, { className: ‘ff-fee-cost’, textContent: fee.cost }));
details.appendChild(buildElement(‘p’, { className: ‘ff-fee-notes’, textContent: fee.notes }));
if (fee.url) {
const officialSiteButton = buildElement(‘a’, { className: ‘ff-button’, textContent: ‘Go to Official Site’, href: fee.url, target: ‘_blank’, rel: ‘noopener’ });
details.appendChild(officialSiteButton); // Append button to details
}
card.appendChild(details);
view.appendChild(card);
});
} else {
const noticeCard = buildElement(‘div’, { className: ‘ff-notice-card’ });
noticeCard.appendChild(buildElement(‘h3’, { className: ‘ff-h3 ff-notice-title’, textContent: ‘Good to Go!’ }));
noticeCard.appendChild(buildElement(‘p’, { className: ‘ff-p’, textContent: `As of today, ${country} has no mandatory electronic entry fees or tourist taxes we could find.` }));
view.appendChild(noticeCard);
}
if (isEtias) {
const etiasNotice = buildElement(‘div’, { className: ‘ff-etias-notice’ });
etiasNotice.appendChild(buildElement(‘strong’, { textContent: ‘HEADS UP: ‘ }));
etiasNotice.appendChild(document.createTextNode(‘Before the end of 2026, you will likely be required to apply online for a mandatory ‘));
const link = buildElement(‘a’, {
textContent: ‘ETIAS’,
href: ‘https://travel-europe.europa.eu/etias_en’,
target: ‘_blank’,
rel: ‘noopener’
});
etiasNotice.appendChild(link);
etiasNotice.appendChild(document.createTextNode(‘ travel authorization to visit. This will cost 20 Euros (approx. $22 USD).’));
view.appendChild(etiasNotice);
}
const checkAnotherButton = buildElement(‘button’, { className: ‘ff-button ff-back-button’, textContent: ‘Check Another Destination’, onclick: () => {
state = { country: null, searchTerm: ” };
handleInteraction(buildStartView);
}});
actionsContainer.appendChild(checkAnotherButton);
const feedbackDiv = buildElement(‘div’, {className: ‘ff-feedback-link’});
const mailtoHref = `mailto:tips@traveloffpath.com?subject=Fee Finder Suggestion: ${country}`;
const feedbackLink = buildElement(‘a’, { textContent: ‘Think we missed a fee? Let us know.’, href: mailtoHref });
feedbackDiv.appendChild(feedbackLink);
actionsContainer.appendChild(feedbackDiv);
view.appendChild(actionsContainer);
const poweredBy = buildElement(‘div’, { className: ‘ff-powered-by’ });
const poweredByLink = buildElement(‘a’, { textContent: ‘Powered by Travel Off Path’, href: ‘https://www.traveloffpath.com’, target: ‘_blank’, rel: ‘noopener’ });
poweredBy.appendChild(poweredByLink);
view.appendChild(poweredBy);
return view;
};
// — INITIALIZATION —
injectStyles();
loadFonts();
renderView(buildStartView);
})();
});
But remember, fees are only one part of the pre-travel puzzle. Now that you know the costs, it’s time for the final, critical step. Before you book, launch our flagship 1 Minute Trip Check to instantly verify all the latest travel advisories and any other entry requirements for your destination in seconds.
Travel Smarter.
The Travel Off Path Advantage: Your Travel Toolkit
/* Scoped Styles for the Promo Box to prevent theme conflicts */
.top-promo-wrapper-v2 {
font-family: ‘Poppins’, sans-serif;
max-width: 896px;
margin: 2.5rem auto;
background-color: #ffffff;
padding: 2rem;
border-radius: 1.5rem; /* Increased for a softer look */
box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1);
border: 1px solid #e5e7eb;
}
.top-promo-grid-v2 {
display: grid;
grid-template-columns: repeat(1, minmax(0, 1fr));
gap: 1.5rem;
}
.top-promo-card-v2 {
display: block;
padding: 1.5rem;
border-radius: 1rem;
text-align: center;
border-width: 1px;
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
text-decoration: none !important; /* FIX: Added !important to override theme styles */
}
.top-promo-card-v2:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
text-decoration: none !important; /* FIX: Ensure no underline on hover */
}
.top-promo-card-v2 .icon-container {
display: flex;
justify-content: center;
margin-bottom: 0.75rem;
}
.top-promo-card-v2 .icon-circle {
width: 3rem;
height: 3rem;
border-radius: 9999px;
display: flex;
align-items: center;
justify-content: center;
}
.top-promo-card-v2 .icon-svg {
width: 1.5rem;
height: 1.5rem;
color: #ffffff;
}
.top-promo-card-v2 .icon-svg-fb {
width: 1.75rem;
height: 1.75rem;
color: #ffffff;
}
.top-promo-card-v2 h3 {
font-size: 1.25rem;
line-height: 1.75rem;
font-weight: 700;
margin: 0;
text-decoration: none !important; /* FIX: Prevent underline on child elements */
}
.top-promo-card-v2 p {
font-size: 0.9rem;
line-height: 1.4rem;
margin-top: 0.5rem;
color: #4b5563;
text-wrap: pretty;
text-decoration: none !important; /* FIX: Prevent underline on child elements */
}
/* Specific colors */
.top-promo-card-v2.purple { background-color: #faf5ff; border-color: #e9d5ff; }
.top-promo-card-v2.purple:hover { border-color: #c084fc; }
.top-promo-card-v2.purple .icon-circle { background-color: #7e22ce; }
.top-promo-card-v2.purple h3 { color: #5b21b6; }
/* Responsive grid for larger screens */
@media (min-width: 768px) {
.top-promo-grid-v2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
/* Make the first card span the full width */
.top-promo-grid-v2 > a:first-child {
grid-column: span 2 / span 2;
}
}
Subscribe To Our Latest Posts
Enter your email address to subscribe to Travel Off Path’s latest breaking travel news, straight to your inbox.
Appeared first on: traveloffpath.com




