1<!doctype html> 2<html lang="en" data-edition="ch"> 3<head> 4
4<script> 5(function (window) { 6 var contract = {"contract_version":1,"authoritative_vendor":"inmobi_choice","authoritative_source":"native_app","required_timing":"Consent must be provided before consent-dependent web scripts initialize.","statuses":["applied","missing","invalid","refresh_required"],"required_fields":["cmp_vendor","consent_source","consent_available","tc_string","addtl_consent","consent_collected_at","consent_required"],"optional_fields":["gpp_string","us_privacy_string","cmp_version","contract_version"],"stale_conditions":["contract_version_mismatch","consent_required_without_available_signal"],"globals":{"contract":"__TLConsentHandoverContract","bootstrap":"__TLConsentHandover","state":"__TLConsentHandoverState","preload_payload":"__TL_NATIVE_CONSENT__","apply_function":"__TLApplyNativeConsent"},"events":{"state":"tl:consent-handover:state"},"transports":[{"name":"preload_global","mode":"script_injection","description":"Native sets window.__TL_NATIVE_CONSENT__ before WebView article scripts execute."},{"name":"apply_function","mode":"javascript_bridge","description":"Native calls window.__TLApplyNativeConsent(payload) as soon as the bridge is ready."}]}; 7 var globalNames = contract.globals || {}; 8 var contractGlobalName = globalNames.contract || '__TLConsentHandoverContract'; 9 var bootstrapGlobalName = globalNames.bootstrap || '__TLConsentHandover'; 10 var stateGlobalName = globalNames.state || '__TLConsentHandoverState'; 11 var preloadGlobalName = globalNames.preload_payload || '__TL_NATIVE_CONSENT__'; 12 var applyFunctionName = globalNames.apply_function || '__TLApplyNativeConsent'; 13 var stateEventName = contract.events && contract.events.state ? contract.events.state : 'tl:consent-handover:state'; 14 15 window[contractGlobalName] = contract; 16 17 var clone = function (value) { 18 try { 19 return JSON.parse(JSON.stringify(value)); 20 } catch (error) { 21 return value; 22 } 23 }; 24 25 var dispatchState = function () { 26 if (typeof window.dispatchEvent !== 'function' || typeof window.CustomEvent !== 'function') { 27 return; 28 } 29 30 window.dispatchEvent(new CustomEvent(stateEventName, { 31 detail: clone(window[stateGlobalName]), 32 })); 33 }; 34 35 var normalizeString = function (value) { 36 if (typeof value !== 'string') { 37 return null; 38 } 39 40 var normalized = value.trim(); 41 42 return normalized === '' ? '' : normalized; 43 }; 44 45 var parseTimestamp = function (value) { 46 if (typeof value !== 'string') { 47 return null; 48 } 49 50 var trimmed = value.trim(); 51 if (trimmed === '') { 52 return null; 53 } 54 55 var timestamp = Date.parse(trimmed); 56 57 if (Number.isNaN(timestamp)) { 58 return null; 59 } 60 61 return new Date(timestamp).toISOString(); 62 }; 63 64 var evaluatePayload = function (payload) { 65 if (!payload || typeof payload !== 'object' || Array.isArray(payload)) { 66 return { 67 status: 'missing', 68 ready: false, 69 errors: ['payload_missing'], 70 payload: null, 71 }; 72 } 73 74 var normalizedPayload = { 75 cmp_vendor: normalizeString(payload.cmp_vendor), 76 consent_source: normalizeString(payload.consent_source), 77 consent_available: typeof payload.consent_available === 'boolean' ? payload.consent_available : null, 78 tc_string: normalizeString(payload.tc_string), 79 addtl_consent: normalizeString(payload.addtl_consent), 80 gpp_string: normalizeString(payload.gpp_string), 81 us_privacy_string: normalizeString(payload.us_privacy_string), 82 consent_collected_at: parseTimestamp(payload.consent_collected_at), 83 cmp_version: normalizeString(payload.cmp_version), 84 consent_required: typeof payload.consent_required === 'boolean' ? payload.consent_required : null, 85 contract_version: Number.isInteger(payload.contract_version) ? payload.contract_version : contract.contract_version, 86 }; 87 88 var errors = []; 89 if (normalizedPayload.cmp_vendor !== contract.authoritative_vendor) { 90 errors.push('unsupported_cmp_vendor'); 91 } 92 if (normalizedPayload.consent_source !== contract.authoritative_source) { 93 errors.push('unsupported_consent_source'); 94 } 95 if (normalizedPayload.consent_available === null) { 96 errors.push('consent_available_missing'); 97 } 98 if (normalizedPayload.consent_required === null) { 99 errors.push('consent_required_missing'); 100 } 101 if (normalizedPayload.consent_collected_at === null) { 102 errors.push('consent_collected_at_invalid'); 103 } 104 if (normalizedPayload.addtl_consent === null) { 105 errors.push('addtl_consent_missing'); 106 } 107 108 if (normalizedPayload.contract_version !== contract.contract_version) { 109 return { 110 status: 'refresh_required', 111 ready: true, 112 errors: ['contract_version_mismatch'], 113 payload: normalizedPayload, 114 }; 115 } 116 117 if (normalizedPayload.consent_required === true && normalizedPayload.consent_available === false) { 118 return { 119 status: 'refresh_required', 120 ready: true, 121 errors: ['consent_refresh_required'], 122 payload: normalizedPayload, 123 }; 124 } 125 126 if (normalizedPayload.consent_available === true && normalizedPayload.tc_string === '') { 127 errors.push('tc_string_missing'); 128 } 129 130 if (errors.length > 0) { 131 return {
132 status: 'invalid', 133 ready: true, 134 errors: errors, 135 payload: normalizedPayload, 136 }; 137 } 138 139 return { 140 status: 'applied', 141 ready: true, 142 errors: [], 143 payload: normalizedPayload, 144 }; 145 }; 146 147 var updateState = function (nextState) { 148 window[stateGlobalName] = { 149 contract_version: contract.contract_version, 150 status: nextState.status, 151 ready: nextState.ready, 152 errors: nextState.errors || [], 153 payload: nextState.payload || null, 154 transport: nextState.transport || null, 155 updated_at: new Date().toISOString(), 156 }; 157 158 dispatchState(); 159 160 return clone(window[stateGlobalName]); 161 }; 162 163 if (!window[stateGlobalName]) { 164 window[stateGlobalName] = { 165 contract_version: contract.contract_version, 166 status: 'missing', 167 ready: false, 168 errors: [], 169 payload: null, 170 transport: null, 171 updated_at: null, 172 }; 173 } 174 175 window[bootstrapGlobalName] = window[bootstrapGlobalName] || { 176 version: contract.contract_version, 177 statuses: contract.statuses, 178 requiredTiming: contract.required_timing, 179 getContract: function () { 180 return clone(contract); 181 }, 182 getState: function () { 183 return clone(window[stateGlobalName]); 184 }, 185 applyPayload: function (payload, metadata) { 186 var evaluated = evaluatePayload(payload); 187 188 return updateState({ 189 status: evaluated.status, 190 ready: evaluated.ready, 191 errors: evaluated.errors, 192 payload: evaluated.payload, 193 transport: metadata && metadata.transport ? metadata.transport : 'javascript_bridge', 194 }); 195 }, 196 markMissing: function (metadata) { 197 return updateState({ 198 status: 'missing', 199 ready: true, 200 errors: ['payload_missing'], 201 payload: null, 202 transport: metadata && metadata.transport ? metadata.transport : 'missing', 203 }); 204 }, 205 onStateChange: function (callback) { 206 if (typeof callback !== 'function' || typeof window.addEventListener !== 'function') { 207 return function () { 208 }; 209 } 210 211 var listener = function (event) { 212 callback(event.detail); 213 }; 214 215 window.addEventListener(stateEventName, listener); 216 217 return function () { 218 if (typeof window.removeEventListener === 'function') { 219 window.removeEventListener(stateEventName, listener); 220 } 221 }; 222 }, 223 }; 224 225 window[applyFunctionName] = function (payload) { 226 return window[bootstrapGlobalName].applyPayload(payload, { 227 transport: 'javascript_bridge', 228 }); 229 }; 230 231 if ( 232 Object.prototype.hasOwnProperty.call(window, preloadGlobalName) 233 && window[preloadGlobalName] 234 ) { 235 window[bootstrapGlobalName].applyPayload(window[preloadGlobalName], { 236 transport: 'script_injection', 237 }); 238 } else { 239 dispatchState(); 240 } 241})(window); 242</script>
242<script> 243(function (window) { 244 var legacyCookieNames = [ 245 'OptanonConsent', 246 'OptanonAlertBoxClosed', 247 'OnetrustActiveGroups', 248 'cmapi_cookie_privacy', 249 'cmapi_cookie_privacy_custom', 250 'cmapi_gtm_bl', 251 'cmapi_gtm_privacy', 252 ]; 253 var legacyCookiePrefixes = ['__cmp', 'cmapi_']; 254 var legacyGlobalNames = [ 255 '__cmp', 256 '__dsa', 257 '__gpp', 258 '__tcfapi', 259 '__dsaLocator', 260 '__gppLocator', 261 '__tcfapiLocator', 262 'Optanon', 263 'OptanonWrapper', 264 'cmp_addFrame', 265 'cmp_dsastub', 266 'cmp_gpp_ping', 267 'cmp_gppstub', 268 'cmp_msghandler', 269 'cmp_rc', 270 'cmp_setGppStub', 271 'cmp_setStub', 272 'cmp_stub', 273 ]; 274 var legacyStorageKeys = [ 275 'OptanonConsent', 276 'OptanonAlertBoxClosed', 277 'OnetrustActiveGroups', 278 ]; 279 280 var clearCookieAcrossScopes = function (cookieName) { 281 if (typeof cookieName !== 'string' || cookieName === '') { 282 return; 283 } 284 285 var hostname = window.location.hostname || ''; 286 var parts = hostname.split('.').filter(Boolean); 287 var domains = ['']; 288 289 if (parts.length > 2) { 290 domains.push('.' + parts.slice(1).join('.')); 291 } 292 293 domains.forEach(function (domain) { 294 var domainPart = domain ? ';domain=' + domain : ''; 295 window.document.cookie = cookieName + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/' + domainPart; 296 }); 297 }; 298 299 var clearStorageValue = function (storage, key) { 300 try { 301 if (storage && typeof storage.removeItem === 'function') { 302 storage.removeItem(key); 303 } 304 } catch (error) { 305 } 306 }; 307 308 var clearPrefixedCookies = function () { 309 var cookies = window.document.cookie ? window.document.cookie.split(';') : []; 310 311 cookies.forEach(function (rawCookie) { 312 var separatorIndex = rawCookie.indexOf('='); 313 var cookieName = (separatorIndex >= 0 ? rawCookie.slice(0, separatorIndex) : rawCookie).trim(); 314 315 if (!cookieName) { 316 return; 317 } 318 319 if (!legacyCookiePrefixes.some(function (prefix) { 320 return cookieName.indexOf(prefix) === 0; 321 })) { 322 return; 323 } 324 325 clearCookieAcrossScopes(cookieName); 326 }); 327 }; 328 329 window.__TLClearLegacyConsentArtifacts = window.__TLClearLegacyConsentArtifacts || function () { 330 legacyCookieNames.forEach(function (cookieName) { 331 clearCookieAcrossScopes(cookieName); 332 }); 333 334 clearPrefixedCookies(); 335 336 legacyStorageKeys.forEach(function (storageKey) { 337 clearStorageValue(window.localStorage, storageKey); 338 clearStorageValue(window.sessionStorage, storageKey); 339 }); 340 341 legacyGlobalNames.forEach(function (globalName) { 342 try { 343 if (Object.prototype.hasOwnProperty.call(window, globalName)) { 344 delete window[globalName]; 345 return; 346 } 347 } catch (error) { 348 } 349 350 try { 351 window[globalName] = undefined; 352 } catch (error) { 353 } 354 }); 355 }; 356 357 window.__TLClearLegacyConsentArtifacts(); 358})(window); 359</script>
359<script> 360(function (window) { 361 var contract = window.__TLConsentHandoverContract || {}; 362 var bootstrap = window.__TLConsentHandover || null; 363 var stateGlobalName = '__TLArticleConsentBootstrapState'; 364 var diagnosticsGlobalName = '__TLArticleConsentDiagnosticsState'; 365 var preloadGlobalName = '__TL_NATIVE_CONSENT__'; 366 var applyFunctionName = '__TLApplyNativeConsent'; 367 var stateEventName = 'tl:article-consent-bootstrap:state'; 368 var diagnosticsEventName = 'tl:consent-handover:diagnostics'; 369 var bootstrapTimeoutMs = 250; 370 var timeoutId = null; 371 var tcfEventListeners = []; 372 var gppEventListeners = []; 373 374 var clone = function (value) { 375 try { 376 return JSON.parse(JSON.stringify(value)); 377 } catch (error) { 378 return value; 379 } 380 }; 381 382 var hasOwn = function (object, key) { 383 return !!object && Object.prototype.hasOwnProperty.call(object, key); 384 }; 385 386 var safeStateSnapshot = function (state) { 387 var currentState = state || {}; 388 var payload = currentState.payload || {}; 389 390 return { 391 status: typeof currentState.status === 'string' ? currentState.status : 'missing', 392 ready: currentState.ready === true, 393 transport: typeof currentState.transport === 'string' ? currentState.transport : null, 394 errors: Array.isArray(currentState.errors) ? currentState.errors.slice() : [], 395 payload_present: !!currentState.payload, 396 payload_summary: { 397 consent_available: typeof payload.consent_available === 'boolean', 398 consent_required: typeof payload.consent_required === 'boolean', 399 tc_string_present: typeof payload.tc_string === 'string' && payload.tc_string !== '', 400 gpp_string_present: typeof payload.gpp_string === 'string' && payload.gpp_string !== '', 401 us_privacy_string_present: typeof payload.us_privacy_string === 'string' && payload.us_privacy_string !== '', 402 }, 403 updated_at: typeof currentState.updated_at === 'string' ? currentState.updated_at : null, 404 }; 405 }; 406 407 var buildDiagnosticsDecision = function (decision) { 408 var currentDecision = decision || {}; 409 410 return { 411 surface: typeof currentDecision.surface === 'string' && currentDecision.surface !== '' 412 ? currentDecision.surface 413 : null, 414 consumer: typeof currentDecision.consumer === 'string' && currentDecision.consumer !== '' 415 ? currentDecision.consumer 416 : null, 417 allowed: typeof currentDecision.allowed === 'boolean' ? currentDecision.allowed : null, 418 reason: typeof currentDecision.reason === 'string' && currentDecision.reason !== '' 419 ? currentDecision.reason 420 : null, 421 event: typeof currentDecision.event === 'string' && currentDecision.event !== '' 422 ? currentDecision.event 423 : null, 424 }; 425 }; 426 427 var buildDiagnosticsSnapshot = function (decision) { 428 return { 429 contract_version: contract.contract_version || 1, 430 handover: safeStateSnapshot(window.__TLConsentHandoverState || null), 431 bootstrap: safeStateSnapshot(window[stateGlobalName] || null), 432 preload_present: hasOwn(window, preloadGlobalName) && !!window[preloadGlobalName], 433 decision: buildDiagnosticsDecision(decision), 434 updated_at: new Date().toISOString(), 435 }; 436 }; 437 438 var dispatchDiagnostics = function () { 439 if (typeof window.dispatchEvent !== 'function' || typeof window.CustomEvent !== 'function') { 440 return; 441 } 442 443 window.dispatchEvent(new CustomEvent(diagnosticsEventName, { 444 detail: clone(window[diagnosticsGlobalName]), 445 })); 446 }; 447 448 var publishDiagnostics = function (decision) { 449 window[diagnosticsGlobalName] = buildDiagnosticsSnapshot(decision); 450 dispatchDiagnostics(); 451 452 return clone(window[diagnosticsGlobalName]); 453 }; 454 455 if (typeof window.__TLClearLegacyConsentArtifacts === 'function') { 456 window.__TLClearLegacyConsentArtifacts(); 457 } 458 459 window[diagnosticsGlobalName] = window[diagnosticsGlobalName] || buildDiagnosticsSnapshot({ 460 surface: 'bootstrap', 461 consumer: 'article_bootstrap',
462 allowed: false, 463 reason: 'awaiting_consent', 464 event: 'initial_state', 465 }); 466 467 var dispatchState = function () { 468 if (typeof window.dispatchEvent !== 'function' || typeof window.CustomEvent !== 'function') { 469 return; 470 } 471 472 window.dispatchEvent(new CustomEvent(stateEventName, { 473 detail: clone(window[stateGlobalName]), 474 })); 475 }; 476 477 var publishState = function (nextState) { 478 window[stateGlobalName] = { 479 contract_version: contract.contract_version || 1, 480 status: nextState.status || 'missing', 481 ready: !!nextState.ready, 482 errors: Array.isArray(nextState.errors) ? nextState.errors.slice() : [], 483 payload: nextState.payload || null, 484 transport: nextState.transport || null, 485 updated_at: new Date().toISOString(), 486 }; 487 488 dispatchState(); 489 publishDiagnostics({ 490 surface: 'bootstrap', 491 consumer: 'article_bootstrap', 492 allowed: window[stateGlobalName].status === 'applied', 493 reason: window[stateGlobalName].status === 'applied' 494 ? 'consent_applied' 495 : window[stateGlobalName].status, 496 event: 'state_update', 497 }); 498 499 return clone(window[stateGlobalName]); 500 }; 501 502 var buildTcfData = function () { 503 var state = window[stateGlobalName] || {}; 504 var payload = state.payload || {}; 505 var consentGranted = state.status === 'applied' && state.ready === true; 506 var tcString = typeof payload.tc_string === 'string' ? payload.tc_string : ''; 507 var gppString = typeof payload.gpp_string === 'string' ? payload.gpp_string : ''; 508 var usPrivacyString = typeof payload.us_privacy_string === 'string' ? payload.us_privacy_string : ''; 509 var eventStatus = consentGranted ? 'tcloaded' : 'cmpuishown'; 510 511 return { 512 gdprApplies: consentGranted, 513 tcString: tcString, 514 eventStatus: eventStatus, 515 cmpStatus: consentGranted ? 'loaded' : 'stub', 516 cmpLoaded: consentGranted, 517 listenerId: 0, 518 purpose: { 519 consents: { 520 1: consentGranted, 521 }, 522 }, 523 tcData: { 524 tcString: tcString, 525 gppString: gppString, 526 usPrivacyString: usPrivacyString, 527 }, 528 }; 529 }; 530 531 var notifyListeners = function () { 532 var tcfData = buildTcfData(); 533 534 tcfEventListeners.slice().forEach(function (listener) { 535 try { 536 listener(tcfData, true); 537 } catch (error) { 538 } 539 }); 540 541 gppEventListeners.slice().forEach(function (listener) { 542 try { 543 listener(tcfData, true); 544 } catch (error) { 545 } 546 }); 547 }; 548 549 var installConsentApis = function () { 550 if (typeof window.__tcfapi !== 'function') { 551 window.__tcfapi = function (command, version, callback, parameter) { 552 var tcfData = buildTcfData(); 553 554 if (command === 'ping') { 555 if (typeof callback === 'function') { 556 callback({ 557 gdprApplies: tcfData.gdprApplies, 558 cmpLoaded: tcfData.cmpLoaded, 559 cmpStatus: tcfData.cmpStatus, 560 }, true); 561 } 562 563 return; 564 } 565 566 if (command === 'addEventListener' && typeof callback === 'function') { 567 tcfEventListeners.push(callback); 568 callback(tcfData, true); 569 return tcfEventListeners.length; 570 } 571 572 if (command === 'removeEventListener') { 573 tcfEventListeners = tcfEventListeners.filter(function (listener) { 574 return listener !== callback; 575 }); 576 577 if (typeof callback === 'function') { 578 callback(true, true); 579 } 580 581 return true; 582 } 583 584 if (command === 'getTCData' && typeof callback === 'function') { 585 callback(tcfData, true); 586 return; 587 } 588 589 if (command === 'displayConsentUi' && typeof callback === 'function') { 590 callback(true, true); 591 return; 592 } 593 594 if (typeof callback === 'function') { 595 callback(tcfData, true); 596 } 597 }; 598 } 599 600 if (typeof window.__gpp !== 'function') { 601 window.__gpp = function (command, callback, parameter, version) { 602 var tcfData = buildTcfData(); 603 604 if (command === 'ping') { 605 if (typeof callback === 'function') { 606 callback({ 607 gppVersion: '1.1', 608 cmpStatus: tcfData.cmpStatus, 609 cmpDisplayStatus: tcfData.gdprApplies ? 'visible' : 'hidden', 610 signalStatus: tcfData.gdprApplies ? 'ready' : 'not ready',
611 supportedAPIs: ['2:tcfeuv2', '6:uspv1', '7:usnatv1'], 612 cmpId: 10, 613 sectionList: [], 614 applicableSections: [-1], 615 gppString: tcfData.tcData.gppString, 616 parsedSections: {}, 617 }, true); 618 } 619 620 return; 621 } 622 623 if (command === 'addEventListener' && typeof callback === 'function') { 624 gppEventListeners.push(callback); 625 callback({ 626 eventName: 'listenerRegistered', 627 listenerId: gppEventListeners.length, 628 data: true, 629 pingData: { 630 gppVersion: '1.1', 631 cmpStatus: tcfData.cmpStatus, 632 cmpDisplayStatus: tcfData.gdprApplies ? 'visible' : 'hidden', 633 signalStatus: tcfData.gdprApplies ? 'ready' : 'not ready',
634 supportedAPIs: ['2:tcfeuv2', '6:uspv1', '7:usnatv1'], 635 cmpId: 10, 636 sectionList: [], 637 applicableSections: [-1], 638 gppString: tcfData.tcData.gppString, 639 parsedSections: {}, 640 }, 641 }, true); 642 return gppEventListeners.length; 643 } 644 645 if (command === 'removeEventListener' && typeof callback === 'function') { 646 gppEventListeners = gppEventListeners.filter(function (listener) { 647 return listener !== callback; 648 }); 649 650 callback({ 651 eventName: 'listenerRemoved', 652 listenerId: parameter, 653 data: true, 654 }, true); 655 return true; 656 } 657 658 if (typeof callback === 'function') { 659 callback(tcfData, true); 660 } 661 }; 662 } 663 }; 664 665 var mirrorContractState = function () { 666 if (!window.__TLConsentHandoverState) { 667 return null; 668 } 669 670 return publishState(window.__TLConsentHandoverState); 671 }; 672 673 var clearBootstrapTimeout = function () { 674 if (timeoutId) { 675 window.clearTimeout(timeoutId); 676 timeoutId = null; 677 } 678 }; 679 680 var settleMissing = function () { 681 var currentState = window.__TLConsentHandoverState || {}; 682 683 if (currentState.ready && currentState.status !== 'missing') { 684 clearBootstrapTimeout(); 685 return mirrorContractState(); 686 } 687 688 if (!bootstrap || typeof bootstrap.markMissing !== 'function') { 689 clearBootstrapTimeout(); 690 publishDiagnostics({ 691 surface: 'bootstrap', 692 consumer: 'article_bootstrap', 693 allowed: false, 694 reason: 'consent_missing', 695 event: 'timeout_missing', 696 }); 697 return mirrorContractState(); 698 } 699 700 clearBootstrapTimeout(); 701 702 var nextState = publishState(bootstrap.markMissing({ 703 transport: 'article_bootstrap', 704 })); 705 706 publishDiagnostics({ 707 surface: 'bootstrap', 708 consumer: 'article_bootstrap', 709 allowed: false, 710 reason: nextState.status === 'missing' ? 'consent_missing' : nextState.status, 711 event: 'timeout_missing', 712 }); 713 714 return nextState; 715 }; 716 717 var syncNativeConsent = function () { 718 if (!bootstrap) { 719 return false; 720 } 721 722 if ( 723 Object.prototype.hasOwnProperty.call(window, preloadGlobalName) 724 && window[preloadGlobalName] 725 && typeof window[applyFunctionName] === 'function' 726 ) { 727 clearBootstrapTimeout(); 728 publishState(window[applyFunctionName](window[preloadGlobalName])); 729 return true; 730 } 731 732 if (window.__TLConsentHandoverState && window.__TLConsentHandoverState.ready) { 733 clearBootstrapTimeout(); 734 mirrorContractState(); 735 return true; 736 } 737 738 return false; 739 }; 740 741 window[stateGlobalName] = window[stateGlobalName] || { 742 contract_version: contract.contract_version || 1, 743 status: 'missing', 744 ready: false, 745 errors: [], 746 payload: null, 747 transport: null, 748 updated_at: null, 749 }; 750 751 window.__TLArticleConsentBootstrap = window.__TLArticleConsentBootstrap || { 752 version: contract.contract_version || 1, 753 getState: function () { 754 return clone(window[stateGlobalName]); 755 }, 756 shouldSuppressWebCmp: function () { 757 var state = window[stateGlobalName] || {}; 758 759 return state.ready === true && state.status === 'applied'; 760 }, 761 refresh: function () { 762 return syncNativeConsent(); 763 }, 764 }; 765 766 window.__TLArticleConsentDiagnostics = window.__TLArticleConsentDiagnostics || { 767 version: contract.contract_version || 1, 768 getState: function () { 769 return clone(window[diagnosticsGlobalName]); 770 }, 771 record: function (decision) { 772 return publishDiagnostics(decision); 773 }, 774 }; 775 776 window.__TLRecordArticleConsentDiagnostics = window.__TLRecordArticleConsentDiagnostics || function (decision) { 777 return publishDiagnostics(decision); 778 }; 779 780 if (!bootstrap || typeof bootstrap.onStateChange !== 'function') { 781 syncNativeConsent(); 782 timeoutId = window.setTimeout(settleMissing, bootstrapTimeoutMs); 783 return; 784 } 785 786 bootstrap.onStateChange(function (state) { 787 if (!state) { 788 return; 789 } 790 791 if (state.ready && state.status !== 'missing') { 792 clearBootstrapTimeout(); 793 if (state.status === 'applied') { 794 installConsentApis(); 795 notifyListeners(); 796 } 797 } 798 799 publishState(state); 800 }); 801 802 if (!syncNativeConsent()) { 803 timeoutId = window.setTimeout(settleMissing, bootstrapTimeoutMs); 804 } else if (window[stateGlobalName] && window[stateGlobalName].status === 'applied') { 805 installConsentApis(); 806 notifyListeners(); 807 } 808 809 window.addEventListener('pagehide', function () { 810 if (timeoutId) { 811 window.clearTimeout(timeoutId); 812 } 813 }, { once: true }); 814})(window); 815</script>
815<script> 816(function (window) { 817 var eventName = 'tl:article-consent-bootstrap:state'; 818 var diagnosticsFunctionName = '__TLRecordArticleConsentDiagnostics'; 819 var diagnosticsDefaultSurface = 'consent_gate'; 820 821 var recordDiagnostics = function (state, metadata, allowed, reason) { 822 var diagnostics = typeof window[diagnosticsFunctionName] === 'function' 823 ? window[diagnosticsFunctionName] 824 : null; 825 826 if (!diagnostics) { 827 return; 828 } 829 830 diagnostics({ 831 surface: metadata && typeof metadata.surface === 'string' && metadata.surface !== '' 832 ? metadata.surface 833 : diagnosticsDefaultSurface, 834 consumer: metadata && typeof metadata.consumer === 'string' && metadata.consumer !== '' 835 ? metadata.consumer 836 : null, 837 allowed: typeof allowed === 'boolean' ? allowed : null, 838 reason: typeof reason === 'string' && reason !== '' 839 ? reason 840 : null, 841 event: 'consent_gate', 842 state: state && typeof state.status === 'string' ? state.status : null, 843 }); 844 }; 845 846 var reasonFromState = function (currentState) { 847 if (!currentState) { 848 return 'consent_missing'; 849 } 850 851 if (currentState.status === 'applied') { 852 return 'consent_applied'; 853 } 854 855 if (currentState.status === 'refresh_required') { 856 return 'consent_refresh_required'; 857 } 858 859 if (currentState.status === 'invalid') { 860 return 'consent_invalid'; 861 } 862 863 if (currentState.status === 'missing') { 864 return 'consent_missing'; 865 } 866 867 return 'awaiting_consent'; 868 }; 869 870 window.__TLExecuteWhenArticleConsentReady = window.__TLExecuteWhenArticleConsentReady || function (callback, metadata) { 871 var bootstrap = window.__TLArticleConsentBootstrap || null; 872 var state = bootstrap && typeof bootstrap.getState === 'function' 873 ? bootstrap.getState() 874 : window.__TLArticleConsentBootstrapState || null; 875 876 var canRun = function (currentState) { 877 return !!currentState && currentState.ready === true && currentState.status === 'applied'; 878 }; 879 880 var isSettled = function (currentState) { 881 return !!currentState && currentState.ready === true; 882 }; 883 884 if (typeof callback !== 'function') { 885 return false; 886 } 887 888 if (canRun(state)) { 889 recordDiagnostics(state, metadata, true, 'consent_applied'); 890 callback(state); 891 return true; 892 } 893 894 if (isSettled(state)) { 895 recordDiagnostics(state, metadata, false, reasonFromState(state)); 896 return false; 897 } 898 899 recordDiagnostics(state, metadata, null, 'awaiting_consent'); 900 var listener = function (event) { 901 var nextState = event && event.detail ? event.detail : null; 902 903 if (!isSettled(nextState)) { 904 return; 905 } 906 907 window.removeEventListener(eventName, listener); 908 909 if (canRun(nextState)) { 910 recordDiagnostics(nextState, metadata, true, 'consent_applied'); 911 callback(nextState); 912 } else { 913 recordDiagnostics(nextState, metadata, false, reasonFromState(nextState)); 914 } 915 }; 916 917 window.addEventListener(eventName, listener); 918 919 return null; 920 }; 921})(window); 922</script>
922<!-- InMobi Choice. Consent Manager Tag v3.0 (for TCF 2.3) --> 923<link rel="preload" as="script" href="https://cmp.inmobi.com/choice/Uznnx7uFLxujG/www.thelocal.ch/choice.js?tag_version=V3">
924<script type="text/javascript"> 925(function() { 926window.__TLWebCmpOwner = 'application'; 927var articleConsentBootstrap = window.__TLArticleConsentBootstrap || null; 928 929if (articleConsentBootstrap && typeof articleConsentBootstrap.shouldSuppressWebCmp === 'function' && articleConsentBootstrap.shouldSuppressWebCmp()) { 930 return; 931} 932 933var uspTries = 0; 934var uspTriesLimit = 3; 935 936function makeStub() { 937var TCF_LOCATOR_NAME = '__tcfapiLocator'; 938var queue = []; 939var win = window; 940var cmpFrame; 941 942function addFrame() { 943var doc = win.document; 944var otherCMP = !!(win.frames[TCF_LOCATOR_NAME]); 945 946if (!otherCMP) { 947if (doc.body) { 948var iframe = doc.createElement('iframe'); 949 950iframe.style.cssText = 'display:none'; 951iframe.name = TCF_LOCATOR_NAME; 952doc.body.appendChild(iframe); 953} else { 954setTimeout(addFrame, 5); 955} 956} 957return !otherCMP; 958} 959 960function tcfAPIHandler() { 961var gdprApplies; 962var args = arguments; 963 964if (!args.length) { 965return queue; 966} else if (args[0] === 'setGdprApplies') { 967if ( 968args.length > 3 && 969args[2] === 2 && 970typeof args[3] === 'boolean' 971) { 972gdprApplies = args[3]; 973if (typeof args[2] === 'function') { 974args[2]('set', true); 975} 976} 977} else if (args[0] === 'ping') { 978var retr = { 979gdprApplies: gdprApplies, 980cmpLoaded: false, 981cmpStatus: 'stub' 982}; 983 984if (typeof args[2] === 'function') { 985args[2](retr); 986} 987} else { 988if (args[0] === 'init' && typeof args[3] === 'object') { 989args[3] = Object.assign(args[3], { tag_version: 'V3' }); 990} 991queue.push(args); 992} 993} 994 995function postMessageEventHandler(event) { 996var msgIsString = typeof event.data === 'string'; 997var json = {}; 998 999try { 1000if (msgIsString) { 1001json = JSON.parse(event.data); 1002} else { 1003json = event.data; 1004} 1005} catch (ignore) {} 1006 1007var payload = json.__tcfapiCall; 1008 1009if (payload) { 1010window.__tcfapi( 1011payload.command, 1012payload.version, 1013function(retValue, success) { 1014var returnMsg = { 1015 __tcfapiReturn: { 1016 returnValue: retValue, 1017 success: success, 1018 callId: payload.callId 1019 } 1020}; 1021if (msgIsString) { 1022 returnMsg = JSON.stringify(returnMsg); 1023} 1024if (event && event.source && event.source.postMessage) { 1025 event.source.postMessage(returnMsg, '*'); 1026} 1027}, 1028payload.parameter 1029); 1030} 1031} 1032 1033while (win) { 1034try { 1035if (win.frames[TCF_LOCATOR_NAME]) { 1036cmpFrame = win; 1037break; 1038} 1039} catch (ignore) {} 1040 1041if (win === window.top) { 1042break; 1043} 1044win = win.parent; 1045} 1046if (!cmpFrame) { 1047addFrame(); 1048win.__tcfapi = tcfAPIHandler; 1049win.addEventListener('message', postMessageEventHandler, false); 1050} 1051} 1052 1053makeStub(); 1054 1055function makeGppStub() { 1056const CMP_ID = 10; 1057const SUPPORTED_APIS = [ 1058'2:tcfeuv2', 1059'6:uspv1', 1060'7:usnatv1', 1061'8:usca', 1062'9:usvav1', 1063'10:uscov1', 1064'11:usutv1', 1065'12:usctv1' 1066]; 1067 1068window.__gpp_addFrame = function (n) { 1069if (!window.frames[n]) { 1070if (document.body) { 1071var i = document.createElement('iframe'); 1072i.style.cssText = 'display:none'; 1073i.name = n; 1074document.body.appendChild(i); 1075} else { 1076window.setTimeout(window.__gpp_addFrame, 10, n); 1077} 1078} 1079}; 1080window.__gpp_stub = function () { 1081var b = arguments; 1082__gpp.queue = __gpp.queue || []; 1083__gpp.events = __gpp.events || []; 1084 1085if (!b.length || (b.length == 1 && b[0] == 'queue')) { 1086return __gpp.queue; 1087} 1088 1089if (b.length == 1 && b[0] == 'events') { 1090return __gpp.events; 1091} 1092 1093var cmd = b[0]; 1094var clb = b.length > 1 ? b[1] : null; 1095var par = b.length > 2 ? b[2] : null; 1096if (cmd === 'ping') { 1097clb( 1098{ 1099gppVersion: '1.1', 1100cmpStatus: 'stub', 1101cmpDisplayStatus: 'hidden', 1102signalStatus: 'not ready', 1103supportedAPIs: SUPPORTED_APIS, 1104cmpId: CMP_ID, 1105sectionList: [], 1106applicableSections: [-1], 1107gppString: '', 1108parsedSections: {}, 1109}, 1110true 1111); 1112} else if (cmd === 'addEventListener') { 1113if (!('lastId' in __gpp)) { 1114__gpp.lastId = 0; 1115} 1116__gpp.lastId++; 1117var lnr = __gpp.lastId; 1118__gpp.events.push({ 1119id: lnr, 1120callback: clb, 1121parameter: par, 1122}); 1123clb( 1124{ 1125eventName: 'listenerRegistered', 1126listenerId: lnr, 1127data: true, 1128pingData: { 1129 gppVersion: '1.1', 1130 cmpStatus: 'stub', 1131 cmpDisplayStatus: 'hidden', 1132 signalStatus: 'not ready', 1133 supportedAPIs: SUPPORTED_APIS, 1134 cmpId: CMP_ID, 1135 sectionList: [], 1136 applicableSections: [-1], 1137 gppString: '', 1138 parsedSections: {}, 1139}, 1140}, 1141true 1142); 1143} else if (cmd === 'removeEventListener') { 1144var success = false; 1145for (var i = 0; i < __gpp.events.length; i++) { 1146if (__gpp.events[i].id == par) { 1147__gpp.events.splice(i, 1); 1148success = true; 1149break; 1150} 1151} 1152clb( 1153{ 1154eventName: 'listenerRemoved', 1155listenerId: par, 1156data: success, 1157pingData: { 1158 gppVersion: '1.1', 1159 cmpStatus: 'stub', 1160 cmpDisplayStatus: 'hidden', 1161 signalStatus: 'not ready', 1162 supportedAPIs: SUPPORTED_APIS,
1163 cmpId: CMP_ID, 1164 sectionList: [], 1165 applicableSections: [-1], 1166 gppString: '', 1167 parsedSections: {}, 1168}, 1169}, 1170true 1171); 1172} else if (cmd === 'hasSection') { 1173clb(false, true); 1174} else if (cmd === 'getSection' || cmd === 'getField') { 1175clb(null, true); 1176} else { 1177__gpp.queue.push([].slice.apply(b)); 1178} 1179}; 1180window.__gpp_msghandler = function (event) { 1181var msgIsString = typeof event.data === 'string'; 1182try { 1183var json = msgIsString ? JSON.parse(event.data) : event.data; 1184} catch (e) { 1185var json = null; 1186} 1187if (typeof json === 'object' && json !== null && '__gppCall' in json) { 1188var i = json.__gppCall; 1189window.__gpp( 1190i.command, 1191function(retValue, success) { 1192var returnMsg = { 1193 __gppReturn: { 1194 returnValue: retValue, 1195 success: success, 1196 callId: i.callId, 1197 }, 1198}; 1199event.source.postMessage(msgIsString ? JSON.stringify(returnMsg) : returnMsg, '*'); 1200}, 1201'parameter' in i ? i.parameter : null, 1202'version' in i ? i.version : '1.1' 1203); 1204} 1205}; 1206if (!('__gpp' in window) || typeof window.__gpp !== 'function') { 1207window.__gpp = window.__gpp_stub; 1208window.addEventListener('message', window.__gpp_msghandler, false); 1209window.__gpp_addFrame('__gppLocator'); 1210} 1211} 1212 1213makeGppStub(); 1214 1215var uspStubFunction = function() { 1216var arg = arguments; 1217if (typeof window.__uspapi !== uspStubFunction) { 1218setTimeout(function() { 1219if (typeof window.__uspapi !== 'undefined') { 1220window.__uspapi.apply(window.__uspapi, arg); 1221} 1222}, 500); 1223} 1224}; 1225 1226var checkIfUspIsReady = function() { 1227uspTries++; 1228if (window.__uspapi === uspStubFunction && uspTries < uspTriesLimit) { 1229console.warn('USP is not accessible'); 1230} else { 1231clearInterval(uspInterval); 1232} 1233}; 1234 1235if (typeof window.__uspapi === 'undefined') { 1236window.__uspapi = uspStubFunction; 1237var uspInterval = setInterval(checkIfUspIsReady, 6000); 1238} 1239})(); 1240</script>
vendor: 1 bytes, line 1240
1240
1241<script type="text/javascript" src="https://cmp.inmobi.com/choice/Uznnx7uFLxujG/www.thelocal.ch/choice.js?tag_version=V3" fetchpriority="high"></script>
1241 1242<!-- End InMobi Choice. Consent Manager Tag v3.0 -->
1243<script async src="https://functions.adnami.io/api/macro/adsm.macro.thelocal.ch.js"></script>
1243 1244
1244<script> 1245 !(function(n){function t(e){n.addEventListener(e,B)}function o(e){n.removeEventListener(e,B)}function u(e,n,t){L?C(e,n):(t||u.lazy&&void 0===t?q:S).push(e,n)}function c(e){k.head.appendChild(e)}function i(e,n){z.call(e.attributes)[y](n)}function r(e,n,t,o){return o=(n?k.getElementById(n):o)||k.createElement(e),n&&(o.id=n),t&&(o.onload=t),o}function s(e,n,t){(t=e.src)&&((n=r(m)).rel="preload",n.as=h,n.href=t,(t=e[g](w))&&n[b](w,t),(t=e[g](x))&&n[b](x,t),c(n))}function a(e,n){return z.call((n||k).querySelectorAll(e))}function f(e,n){e.parentNode.replaceChild(n,e)}function l(t,e){a("source,img",t)[y](l),i(t,function(e,n){(n=/^data-(.+)/.exec(e.name))&&t[b](n[1],e.value)}),"string"==typeof e&&e&&(t.className+=" "+e),p in t&&t[p]()}function e(e,n,t){u(function(t){(t=a(e||N))[y](s),(function o(e,n){(e=t[E]())&&((n=r(e.nodeName)).text=e.text,i(e,function(e){"type"!=e.name&&n[b](e.name,e.value)}),n.src&&!n[g]("async")?(n.onload=n.onerror=o,f(e,n)):(f(e,n),o()))})()},n,t)}var d="Defer",m="link",h="script",p="load",v="pageshow",y="forEach",g="getAttribute",b="setAttribute",E="shift",w="crossorigin",x="integrity",A=["mousemove","keydown","touchstart","wheel"],I="on"+v in n?v:p,N=h+"[type=deferjs]",j=n.IntersectionObserver,k=n.document||n,C=n.setTimeout,L=/p/.test(k.readyState),S=[],q=[],z=S.slice,B=function(e,n){for(n=I==e.type?(o(I),L=u,A[y](t),S):(A[y](o),q);n[0];)C(n[E](),n[E]())};e(),u.all=e,u.dom=function(e,n,i,c,r){u(function(t){function o(e){c&&!1===c(e)||l(e,i)}t=!!j&&new j(function(e){e[y](function(e,n){e.isIntersecting&&(t.unobserve(n=e.target),o(n))})},r),a(e||"[data-src]")[y](function(e){e[d]!=u&&(e[d]=u,t?t.observe(e):o(e))})},n,!1)},u.css=function(n,t,e,o,i){u(function(e){(e=r(m,t,o)).rel="stylesheet",e.href=n,c(e)},e,i)},u.js=function(n,t,e,o,i){u(function(e){(e=r(h,t,o)).src=n,c(e)},e,i)},u.reveal=l,n[d]=u,L||t(I)})(this); 1246 </script>
1246 1247 <link rel="dns-prefetch" href="//cmp.inmobi.com"> 1248 <link rel="dns-prefetch" href="//experience.piano.io"> 1249 <link rel="preconnect" href="https://cmp.inmobi.com" crossorigin> 1250 <link rel="preconnect" href="https://experience.piano.io" crossorigin> 1251 <link rel="dns-prefetch" href="//cdnjs.cloudflare.com"> 1252 <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin> 1253 <link rel="dns-prefetch" href="//assets.thelocal.com"> 1254 <link rel="preconnect" href="https://assets.thelocal.com" crossorigin> 1255 1256 <link rel="preload" href="https://www.thelocal.ch/fonts/noto-sans-v27-latin-regular.woff2" as="font" type="font/woff2" crossorigin> 1257 <link rel="preload" href="https://www.thelocal.ch/fonts/noto-sans-v27-latin-700.woff2" as="font" type="font/woff2" crossorigin> 1258 <link rel="preload" href="https://www.thelocal.ch/fonts/eb-garamond-v26-latin-700.woff2" as="font" type="font/woff2" crossorigin> 1259 <style> 1260 .article-card__media { 1261 width: 100%; 1262 height: auto; 1263 overflow: hidden; 1264 aspect-ratio: var(--article-card-media-ratio, 300 / 190); 1265 } 1266 1267 .article-card--hero .article-card__media { 1268 max-height: 390px; 1269 } 1270 1271 .article-card--regular .article-card__media, 1272 .article-card--center .article-card__media { 1273 max-height: 190px; 1274 } 1275 1276 @media (max-width: 576px) { 1277 .hp-new__container .hp-new__article { 1278 min-width: 0; 1279 } 1280 1281 .hp-new__container .hp-new__article--mobileRight .article-card, 1282 .hp-new__container .hp-new__article--mobileRight .article-card__content { 1283 min-width: 0; 1284 } 1285 1286 .article-card--hero .article-card__media { 1287 max-height: 230px; 1288 } 1289 } 1290 </style> 1291 1292 <link 1293 rel="preload" 1294 as="image" 1295 href="https://assets.thelocal.com/cdn-cgi/rs:fit:850/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp" 1296 imagesrcset="https://assets.thelocal.com/cdn-cgi/rs:fit:450/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp 450w, https://assets.thelocal.com/cdn-cgi/rs:fit:850/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp 850w" 1297 imagesizes="(max-width: 576px) 92vw, (max-width: 1200px) 80vw, 850px" 1298 fetchpriority="high" 1299 > 1300 1301 1302 1303
1303<script type="tl-js"> 1304 document.cookie = "__adblocker=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; 1305 var setNptTechAdblockerCookie = function(adblocker) { 1306 var d = new Date(); 1307 d.setTime(d.getTime() + 60 * 5 * 1000); 1308 document.cookie = "__adblocker=" + (adblocker ? "true" : "false") + "; expires=" + d.toUTCString() + "; path=/"; 1309 }; 1310 var script = document.createElement("script"); 1311 script.setAttribute("async", true); 1312 script.setAttribute("src", "//www.npttech.com/advertising.js"); 1313 script.setAttribute("onerror", "setNptTechAdblockerCookie(true);"); 1314 document.getElementsByTagName("head")[0].appendChild(script); 1315 </script>
1315 1316 1317 <meta name="csrf-token" content="CaEiB5wNeoh1oBzX6E6AOn2szQWSFSLF9XgzqTqH"> 1318 <meta charset="utf-8"> 1319 <meta name="referrer" content="origin"> 1320 <meta name="viewport" content="width=device-width, initial-scale=1"> 1321 <meta name='robots' content='max-image-preview:large'/> 1322 <meta name="robots" content="max-snippet:-1"> 1323 <meta name="apple-mobile-web-app-capable" content="yes"> 1324 <meta name="apple-itunes-app" content="app-id=1078564301"> 1325 <meta name="p:domain_verify" content="8948a77d334a5a512e1a94f7df2371e4"/> 1326 <meta property="fb:pages" content="381700821924600" /> 1327 <meta property="fb:app_id" content="1722590698056362" /> 1328 <link rel="profile" href="https://gmpg.org/xfn/11"> 1329 <link rel="icon" href="/images/favicons/ch.ico" type="image/x-icon"/> 1330 <link rel="shortcut icon" href="/images/favicons/ch.ico"/> 1331 <link rel="apple-touch-icon" sizes="120x120" href="/images/ch/image/apple-touch-icon/120.png"> 1332 <link rel="apple-touch-icon" sizes="152x152" href="/images/ch/image/apple-touch-icon/152.png"> 1333 <link rel="apple-touch-icon" sizes="167x167" href="/images/ch/image/apple-touch-icon/167.png"> 1334 <link rel="apple-touch-icon" sizes="180x180" href="/images/ch/image/apple-touch-icon/180.png"> 1335 <meta name="theme-color" content="#EF6C00"/> 1336 1337 1338 <title>What Americans abroad need to know about the October 15th tax deadline</title> 1339 <meta property="news_keywords" content="by-myexpattaxes"/> 1340 <meta property="article:published_time" content="2026-08-26T09:11:29+02:00" /> 1341 <meta property="article:modified_time" content="2026-08-26T09:11:21+02:00"/> 1342 <meta name="cXenseParse:articleid" content="269231"/> 1343 <meta property="cXenseParse:image" content="https://assets.thelocal.com/cdn-cgi/rs:fit:1200/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp"/> 1344 <meta property="cXenseParse:url" content="https://www.thelocal.ch/20260826/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline"/> 1345 <meta property="og:article:author" content=""/> 1346 <meta property="og:locale" content="en_US" /> 1347 <meta property="og:type" content="article"/> 1348 <meta property="og:url" content="https://www.thelocal.ch/20260826/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline"/> 1349 <meta property="og:title" content="What Americans abroad need to know about the October 15th tax deadline"/> 1350 <meta property="og:description" content="A key tax deadline for Americans is coming up on October 15th. Our guide breaks down exactly what you need to know to avoid any nasty surprises."/> 1351 <meta property="og:image" content="https://assets.thelocal.com/cdn-cgi/rs:fit:1200/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/watermarks-logo-startupstockphotos-student-849825_1280.jpg@webp"/> 1352 <meta property="og:image:type" content="image/webp"> 1353 <meta property="og:site_name" content="The Local Switzerland" /> 1354 <meta name="twitter:card" content="summary_large_image" /> 1355 <meta name="twitter:site" content="@TheLocalSwitz" /> 1356 <meta name="twitter:title" content="What Americans abroad need to know about the October 15th tax deadline" /> 1357 <meta name="twitter:description" content="A key tax deadline for Americans is coming up on October 15th. Our guide breaks down exactly what you need to know to avoid any nasty surprises." /> 1358 <meta name="twitter:image" content="https://assets.thelocal.com/cdn-cgi/rs:fit:1200/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/watermarks-logo-startupstockphotos-student-849825_1280.jpg@webp" /> 1359 <meta name="twitter:label1" content="Written by"> 1360 <meta name="twitter:data1" content=""> 1361 <meta name="description" content="A key tax deadline for Americans is coming up on October 15th. Our guide breaks down exactly what you need to know to avoid any nasty surprises." /> 1362 <link rel="canonical" href="https://www.thelocal.com/20260826/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline" /> 1363 <meta name="googlebot" content="noindex"> 1364 <meta property="article:content_tier" content="free" /> 1365 <meta name="cXenseParse:tlo-articletype" content="sponsored"/> 1366 <!-- Styles --> 1367 <link href="/css/app.css?id=9ab2763b6c87721691374f36204319e4" rel="stylesheet"> 1368 <noscript><link rel="stylesheet" href="/css/app.css?id=9ab2763b6c87721691374f36204319e4"></noscript> 1369
1369<script> 1370 // All web analytics events enter GTM through this application-owned bridge. 1371 window.__TL_ANALYTICS__ = window.__TL_ANALYTICS__ || { 1372 push: function (event) { 1373 window.dataLayer = window.dataLayer || []; 1374 window.dataLayer.push(event); 1375 }, 1376 }; 1377 </script>
1377 1378
1378<script> 1379 window.__TL_ANALYTICS__.push({ 1380 'event': 'Pageview', 1381 'pagePath': 'https://www.thelocal.ch/20260826/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline', 1382 'pageTitle': 'What Americans abroad need to know about the October 15th tax deadline', 1383 'pageId': '872811', 1384 'pageTags': 'sponsored, by-myexpattaxes', 1385 'visitorType': 'free', 1386 'UID': '', 1387 }); 1388 1389 if(document.referrer !== '') { 1390 let prevUrl = new URL(document.referrer); 1391 if(prevUrl.pathname === '/') { 1392 window.__TL_ANALYTICS__.push({ ecommerce: null }); 1393 window.__TL_ANALYTICS__.push({ 1394 event: 'select_promotion', 1395 ecommerce: { 1396 promotion_name: 'Homepage', 1397 items: [ 1398 { 1399 item_id: '872811', 1400 item_name: 'What Americans abroad need to know about the October 15th tax deadline', 1401 item_category: 'by myexpattaxes' 1402 } 1403 ] 1404 } 1405 }); 1406 } 1407 } 1408 </script>
1408 1409
1409<script> 1410 (function(w,d,s,l,i){ 1411 var loadTagManager = function() { 1412 if (w.__TLGtmLoading) { 1413 return; 1414 } 1415 w.__TLGtmLoading = true; 1416 1417 if (w.__TLPerfMarks && typeof w.__TLPerfMarks.mark === 'function') { 1418 w.__TLPerfMarks.mark('tl:thirdparty:gtm:start'); 1419 } 1420 w[l]=w[l]||[]; 1421 w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'}); 1422 var f=d.getElementsByTagName(s)[0]; 1423 var j=d.createElement(s); 1424 var dl=l!='dataLayer' ? '&l='+l : ''; 1425 j.async=true; 1426 j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl; 1427 f.parentNode.insertBefore(j,f); 1428 1429 if (w.__TLPerfMarks && typeof w.__TLPerfMarks.measure === 'function') { 1430 w.__TLPerfMarks.mark('tl:thirdparty:gtm:end'); 1431 w.__TLPerfMarks.measure('tl:thirdparty:gtm', 'tl:thirdparty:gtm:start', 'tl:thirdparty:gtm:end'); 1432 } 1433 }; 1434 1435 var installCmpDuplicateGuard = function() { 1436 // The application owns InMobi; GTM must not bootstrap another CMP. 1437 if (w.__TLCmpDuplicateGuardInstalled || !w.Node || !w.Node.prototype) { 1438 return; 1439 } 1440 1441 var originalAppendChild = w.Node.prototype.appendChild; 1442 var originalInsertBefore = w.Node.prototype.insertBefore; 1443 var isDuplicateCmpNode = function(node) { 1444 if (w.__TLWebCmpOwner !== 'application' || !node) { 1445 return false; 1446 } 1447 1448 if ( 1449 node.tagName === 'SCRIPT' 1450 && typeof node.src === 'string' 1451 && node.src.indexOf('https://cmp.inmobi.com/choice/') === 0 1452 ) { 1453 return true; 1454 } 1455 1456 return node.tagName === 'IFRAME' 1457 && node.name === '__tcfapiLocator' 1458 && d.querySelector('iframe[name=__tcfapiLocator]') !== null; 1459 }; 1460 1461 w.Node.prototype.appendChild = function(node) { 1462 if (isDuplicateCmpNode(node)) { 1463 w.__TLCmpDuplicateBlocks = (w.__TLCmpDuplicateBlocks || 0) + 1; 1464 return node; 1465 } 1466 1467 return originalAppendChild.call(this, node); 1468 }; 1469 1470 w.Node.prototype.insertBefore = function(node, referenceNode) { 1471 if (isDuplicateCmpNode(node)) { 1472 w.__TLCmpDuplicateBlocks = (w.__TLCmpDuplicateBlocks || 0) + 1; 1473 return node; 1474 } 1475 1476 return originalInsertBefore.call(this, node, referenceNode); 1477 }; 1478 1479 w.__TLCmpDuplicateGuardInstalled = true; 1480 }; 1481 1482 var protectCmpApi = function() { 1483 if (w.__TLCmpApiProtected || typeof w.__tcfapi !== 'function') { 1484 return; 1485 } 1486 1487 var canonicalTcfApi = w.__tcfapi; 1488 Object.defineProperty(w, '__tcfapi', { 1489 configurable: true, 1490 get: function() { 1491 return canonicalTcfApi; 1492 }, 1493 set: function() { 1494 w.__TLCmpDuplicateBlocks = (w.__TLCmpDuplicateBlocks || 0) + 1; 1495 } 1496 }); 1497 w.__TLCmpApiProtected = true; 1498 }; 1499 1500 installCmpDuplicateGuard(); 1501 1502 var cmpWaitStartedAt = Date.now(); 1503 var waitForCmpBootstrap = function() { 1504 if (Date.now() - cmpWaitStartedAt >= 10000) { 1505 loadTagManager(); 1506 return; 1507 } 1508 1509 if (typeof w.__tcfapi !== 'function') { 1510 w.setTimeout(waitForCmpBootstrap, 25); 1511 return; 1512 } 1513 1514 var pingCompleted = false;
1515 var retry = function() { 1516 if (pingCompleted) { 1517 return; 1518 } 1519 1520 pingCompleted = true; 1521 w.setTimeout(waitForCmpBootstrap, 25); 1522 }; 1523 1524 try { 1525 w.__tcfapi('ping', 2, function(pingData, success) { 1526 if (pingCompleted) { 1527 return; 1528 } 1529 1530 pingCompleted = true; 1531 if (success !== false && pingData && pingData.cmpLoaded === true) { 1532 protectCmpApi(); 1533 loadTagManager(); 1534 return; 1535 } 1536 1537 w.setTimeout(waitForCmpBootstrap, 25); 1538 }); 1539 w.setTimeout(retry, 100); 1540 } catch (error) { 1541 retry(); 1542 } 1543 }; 1544 1545 waitForCmpBootstrap(); 1546 })(window,document,'script','dataLayer','GTM-NMLDXPL'); 1547 </script>
1547 1548
1548<script> 1549 try { 1550 // Piano can leave __utp behind after a logout, so this optimistic member styling 1551 // must not treat a leftover token as a session while a logout is still pending. 1552 const loggedOutAt = Math.max( 1553 Number(sessionStorage.getItem('tl-force-piano-logout-at') || 0), 1554 Number(localStorage.getItem('tl-force-piano-logout-at') || 0) 1555 ); 1556 const hasPendingLogout = loggedOutAt > 0 && (Date.now() - loggedOutAt) < 300000; 1557 1558 // Only the Piano access token proves a session. piano-uid is a cached identifier from 1559 // an earlier experience execution: it survives clearing cookies and logging out, so 1560 // trusting it hid the login button and showed member links to signed-out visitors. 1561 const hasPianoAccessToken = document.cookie.includes('__utp='); 1562 1563 if (!hasPianoAccessToken) { 1564 // The token is gone, so the cached uid is stale. Drop it before anything else 1565 // treats it as an identity, such as the account subscription banner lookup. 1566 localStorage.removeItem('piano-uid'); 1567 localStorage.removeItem('piano_uid'); 1568 } 1569 1570 if (hasPianoAccessToken && !hasPendingLogout) { 1571 document.documentElement.classList.add('has-piano-session'); 1572 } 1573 } catch (error) { 1574 // Storage can be unavailable in private browsing mode. 1575 } 1576 </script>
1576 1577
1577<script type="application/javascript" async defer src="https://experience.piano.io/xbuilder/experience/load?aid=0nYzKk1Epu"></script>
1577<script type="application/javascript" async defer src="https://cdn.cxense.com/cx.cce.js" data-vendor="iab:412"></script>
1577<script type='application/javascript' data-vendor="iab:412">var cX = window.cX = window.cX || {}; cX.callQueue = cX.callQueue || []; cX.options = cX.options || { compat: { c1x: { wait: 3000 } } };cX.CCE = cX.CCE || {}; cX.CCE.callQueue = cX.CCE.callQueue || [];cX.callQueue.push(['setSiteId', '1129593794869594600']);</script>
1577 1578 1579
1579<script> 1580 (function () { 1581 window.tp = window.tp || []; 1582 const tp = window.tp; 1583 const diagnosticsEnabled = false; 1584 1585 function recordPianoDiagnostic(name) { 1586 if (!diagnosticsEnabled) { 1587 return; 1588 } 1589 1590 const diagnostics = window.__TL_PIANO_DIAGNOSTICS__ = window.__TL_PIANO_DIAGNOSTICS__ || { 1591 pianoScriptLoads: 0, 1592 experienceInitializations: 0, 1593 pianoSyncRequests: 0, 1594 pianoSyncSuccesses: 0, 1595 pianoSyncFailures: 0, 1596 documentNavigations: 0, 1597 dataLayerEvents: {}, 1598 }; 1599 1600 if (name.startsWith('dataLayer:')) { 1601 const eventName = name.slice('dataLayer:'.length); 1602 diagnostics.dataLayerEvents[eventName] = (diagnostics.dataLayerEvents[eventName] || 0) + 1; 1603 return; 1604 } 1605 1606 diagnostics[name] = (diagnostics[name] || 0) + 1; 1607 } 1608 1609 window.__TL_RECORD_PIANO_DIAGNOSTIC__ = recordPianoDiagnostic; 1610 1611 document.querySelectorAll('script[src*="experience.piano.io"]').forEach((script) => { 1612 script.addEventListener('load', () => recordPianoDiagnostic('pianoScriptLoads'), { once: true }); 1613 }); 1614 1615 function createPianoAnalyticsBridge() { 1616 const emittedEventKeys = new Set(); 1617 1618 function claim(eventName, identifier) { 1619 const eventKey = [eventName, identifier || window.location.pathname].join(':'); 1620 if (emittedEventKeys.has(eventKey)) { 1621 return ''; 1622 } 1623 1624 emittedEventKeys.add(eventKey); 1625
1626 return eventKey; 1627 } 1628 1629 function track(eventName, parameters, identifier) { 1630 const eventKey = claim(eventName, identifier); 1631 if (!eventKey) { 1632 return false; 1633 } 1634 1635 window.__TL_ANALYTICS__.push({ 1636 event: eventName, 1637 edition: window.__EDITION__ || document.documentElement.dataset.edition || 'unknown', 1638 piano_event_key: eventKey, 1639 ...(parameters || {}), 1640 }); 1641 recordPianoDiagnostic(`dataLayer:${eventName}`); 1642 1643 return true; 1644 } 1645 1646 return { claim, track }; 1647 } 1648 1649 // This bridge is created before Composer executes so every Piano event reaches GTM 1650 // through one path. Composer's direct GA4 integration must remain disabled. 1651 window.__TL_PIANO_ANALYTICS__ = window.__TL_PIANO_ANALYTICS__ || createPianoAnalyticsBridge(); 1652 1653 const pianoSyncUrl = "https:\/\/www.thelocal.ch\/piano-sync"; 1654 const pianoSyncStorageKey = 'tl-piano-sync-token'; 1655 let pianoLoginInProgress = false; 1656 1657 function getPianoAccessToken() { 1658 const match = document.cookie.match(/(?:^|;\s*)__utp=([^;]+)/); 1659 1660 return match ? decodeURIComponent(match[1]) : ''; 1661 } 1662 1663 // The Vue layout recovers a missing Laravel session from the same token and reloads 1664 // when it succeeds. Claim the token here so a login reload cannot be followed by a 1665 // second recovery reload on the page it just loaded. 1666 function markPianoSessionSynced(accessToken) { 1667 if (!accessToken) { 1668 return; 1669 } 1670 1671 try { 1672 window.sessionStorage.setItem(pianoSyncStorageKey, accessToken); 1673 } catch (error) { 1674 // Storage can be unavailable in private browsing mode. 1675 } 1676 } 1677 1678 function createPianoWebSession(url, payload) { 1679 const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); 1680 1681 return fetch(url, { 1682 method: 'POST', 1683 credentials: 'same-origin', 1684 headers: { 1685 Accept: 'application/json', 1686 'Content-Type': 'application/json', 1687 'X-CSRF-TOKEN': csrfToken || '', 1688 }, 1689 body: JSON.stringify(payload), 1690 }).then((response) => response.json()); 1691 } 1692 1693 function shouldReloadAfterPianoLogin(loginEvent) { 1694 const source = loginEvent && typeof loginEvent.source === 'string' 1695 ? loginEvent.source.toUpperCase() 1696 : ''; 1697 1698 return source !== 'OFFER'; 1699 } 1700 1701 // This runs before Composer can display an offer. It must not wait for an async Vue 1702 // chunk, otherwise a paywall login can finish without creating the Laravel session. 1703 window.__TL_COMPLETE_PIANO_LOGIN__ = function (loginEvent, retrying = false) { 1704 if (pianoLoginInProgress) { 1705 return; 1706 } 1707 1708 pianoLoginInProgress = true; 1709 1710 const eventData = loginEvent && typeof loginEvent === 'object' ? loginEvent : {}; 1711 const accessToken = eventData.token || getPianoAccessToken(); 1712 1713 const sessionRequest = accessToken 1714 ? createPianoWebSession(pianoSyncUrl, { token: accessToken }) 1715 : null; 1716 1717 if (!sessionRequest) { 1718 if (!retrying) { 1719 // Composer can set __utp immediately after this callback. Retry once on 1720 // the next event-loop turn before treating the login event as incomplete. 1721 window.setTimeout(() => { 1722 pianoLoginInProgress = false;
1723 window.__TL_COMPLETE_PIANO_LOGIN__({ 1724 ...eventData, 1725 token: getPianoAccessToken(), 1726 }, true); 1727 }, 0); 1728 return; 1729 } 1730 1731 pianoLoginInProgress = false; 1732 return; 1733 } 1734 1735 window.__TL_PIANO_ANALYTICS__.track('login', {}, 'login'); 1736 recordPianoDiagnostic('pianoSyncRequests'); 1737 1738 sessionRequest 1739 .then((response) => { 1740 if (response && (response.message === 'Piano sync success' || response.message === 'User logged in successfully')) { 1741 recordPianoDiagnostic('pianoSyncSuccesses'); 1742 markPianoSessionSynced(accessToken || getPianoAccessToken()); 1743 1744 // Authentication inside an offer must return control to Piano so the 1745 // checkout can advance from registration to payment. Direct Piano ID 1746 // login still needs a reload to apply the new PHP session to this page. 1747 if (!shouldReloadAfterPianoLogin(eventData)) { 1748 pianoLoginInProgress = false; 1749 return; 1750 } 1751 1752 recordPianoDiagnostic('documentNavigations'); 1753 window.location.reload(); 1754 return; 1755 } 1756 1757 pianoLoginInProgress = false; 1758 recordPianoDiagnostic('pianoSyncFailures'); 1759 }) 1760 .catch(() => { 1761 pianoLoginInProgress = false; 1762 recordPianoDiagnostic('pianoSyncFailures'); 1763 }); 1764 }; 1765 1766 tp.push([ 1767 'addHandler', 1768 'loginSuccess', 1769 function (event) { 1770 window.__TL_COMPLETE_PIANO_LOGIN__(event); 1771 }, 1772 ]); 1773 1774 // Offers can render during the first experience execution, before Vue mounts. 1775 // Register this handler before calling tp.experience.init() so that event is not lost. 1776 tp.push([ 1777 'addHandler', 1778 'showOffer', 1779 function (event) { 1780 const offerId = event && event.offerId ? event.offerId : ''; 1781 window.__TL_PIANO_ANALYTICS__.track('piano_offer_view', { 1782 piano_offer_id: offerId, 1783 }, offerId || 'offer'); 1784 }, 1785 ]); 1786 1787 // The first experience execution also happens before the Vue chunk registers its own 1788 // callbacks, so the resolved uid was lost on a cold load. Persist it here and let the 1789 // layout react through the window event; the layout still owns account rendering. 1790 tp.push([ 1791 'addHandler', 1792 'experienceExecute', 1793 function (event) { 1794 const uid = event && event.user ? event.user.uid : ''; 1795 if (uid && uid !== 'anon') { 1796 try { 1797 window.localStorage.setItem('piano-uid', uid); 1798 } catch (error) { 1799 // Storage can be unavailable in private browsing mode. 1800 } 1801 } 1802 1803 window.__TL_PIANO_EXPERIENCE_EXECUTED__ = true; 1804 window.dispatchEvent(new CustomEvent('tl:piano-experience-execute', { detail: event })); 1805 }, 1806 ]); 1807 1808 function hasPendingForcedPianoLogout() { 1809 const key = 'tl-force-piano-logout-at'; 1810 const maxAgeMs = 5 * 60 * 1000; 1811 const readTimestamp = (storage, storageKey) => { 1812 try { 1813 if (!storage || typeof storage.getItem !== 'function') { 1814 return 0; 1815 } 1816 1817 return Number(storage.getItem(storageKey || key) || 0); 1818 } catch (error) { 1819 return 0; 1820 } 1821 }; 1822 1823 const lastMarkedAt = Math.max( 1824 readTimestamp(window.sessionStorage), 1825 readTimestamp(window.localStorage) 1826 ); 1827 1828 if (lastMarkedAt <= 0 || Date.now() - lastMarkedAt >= maxAgeMs) { 1829 return false;
1830 } 1831 1832 // The logout attempt needs an initialized Piano, so deferring the experience for 1833 // every load until the attempt succeeds could suppress Piano entirely. Defer once. 1834 return Math.max( 1835 readTimestamp(window.sessionStorage, 'tl-force-piano-logout-ran'), 1836 readTimestamp(window.localStorage, 'tl-force-piano-logout-ran') 1837 ) <= 0; 1838 } 1839 1840 tp.push([ 1841 'init', 1842 function () { 1843 if (window.__TL_PIANO_EXPERIENCE_STARTED__) { 1844 return; 1845 } 1846 1847 if (hasPendingForcedPianoLogout()) { 1848 window.__TL_PIANO_EXPERIENCE_DEFERRED__ = true; 1849 return; 1850 } 1851 1852 try { 1853 if (tp && tp.experience && typeof tp.experience.init === 'function') { 1854 window.__TL_PIANO_EXPERIENCE_STARTED__ = true; 1855 recordPianoDiagnostic('experienceInitializations'); 1856 tp.experience.init(); 1857 } 1858 } catch (error) { 1859 window.__TL_PIANO_EXPERIENCE_STARTED__ = false; 1860 } 1861 }, 1862 ]); 1863 })(); 1864 </script>
1864 1865
1865<script type="application/ld+json">{"@context":"https://schema.org","@type":"AdvertiserContentArticle","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.thelocal.ch/20260826/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline"},"headline":"What Americans abroad need to know about the October 15th tax deadline","datePublished":"2026-08-26T09:11:29+02:00","dateModified":"2026-08-26T09:11:21+02:00","description":"A key tax deadline for Americans is coming up on October 15th. Our guide breaks down exactly what you need to know to avoid any nasty surprises.","keywords":"Switzerland news, by-myexpattaxes","isAccessibleForFree":true,"author":{"@type":"Organization","name":"The Local","email":"[email protected]","url":"https://www.thelocal.ch"},"isPartOf":{"@type":["CreativeWork","Product"],"name":"The Local Switzerland","productID":"thelocal.ch:member"},"publisher":{"@type":"NewsMediaOrganization","name":"The Local Switzerland","keywords":"Switzerland's news in English","logo":{"@type":"ImageObject","url":"https://www.thelocal.ch/images/the-local-network-logo-300x60.png","width":300,"height":60}},"image":"https://assets.thelocal.com/cdn-cgi/rs:fit:1200/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp"}</script>
1865 1866
1866<script async type="tl-js" subscriptions-control="manual" src="https://news.google.com/swg/js/v1/swg.js"></script>
1866 1867 1868 1869
1869<script type="tl-js"> 1870 (function () { 1871 var endpoint = "https://www.thelocal.ch/beehiiv/article-embed-subscribe"; 1872 var messageTimeout; 1873 1874 function messageFromHtml(html) { 1875 var doc = new DOMParser().parseFromString(html, 'text/html'); 1876 var message = doc.querySelector('.tl-embed-message__text'); 1877 1878 return message ? message.textContent.trim() : ''; 1879 } 1880 1881 function setMessage(form, type, message) { 1882 var container = form.closest('.tl-newsletter-form'); 1883 var target = container ? container.querySelector('[data-beehiiv-signup-message]') : null; 1884 1885 if (! target) { 1886 if (typeof window.TheLocalNotify === 'function') { 1887 window.TheLocalNotify(type, message); 1888 } 1889 1890 return; 1891 } 1892 1893 target.textContent = message; 1894 target.className = 'tl-newsletter-form__message tl-newsletter-form__message--' + type; 1895 target.hidden = false; 1896 1897 return { container: container, target: target }; 1898 } 1899 1900 function showSuccessMessage(form, message) { 1901 var messageElements = setMessage(form, 'success', message); 1902 if (! messageElements) { 1903 return; 1904 } 1905 1906 window.clearTimeout(messageTimeout); 1907 1908 if (! form.querySelector('.tl-newsletter-form__input')) { 1909 form.remove(); 1910 messageTimeout = window.setTimeout(function () { 1911 messageElements.container.remove(); 1912 }, 5000); 1913 1914 return; 1915 } 1916 1917 messageTimeout = window.setTimeout(function () { 1918 messageElements.target.hidden = true; 1919 }, 5000); 1920 } 1921 1922 document.addEventListener('submit', function (event) { 1923 var form = event.target; 1924 1925 if (! form || ! form.matches || ! form.matches('[data-beehiiv-signup-form]')) { 1926 return; 1927 } 1928 1929 event.preventDefault(); 1930 1931 var button = form.querySelector('button[type="submit"]'); 1932 if (button) { 1933 button.disabled = true; 1934 } 1935 1936 fetch(form.action || endpoint, { 1937 method: 'POST', 1938 body: new FormData(form), 1939 headers: { 1940 'Accept': 'text/html', 1941 'X-Requested-With': 'XMLHttpRequest' 1942 } 1943 }).then(function (response) { 1944 return response.text().then(function (html) { 1945 var message = messageFromHtml(html); 1946 1947 if (! response.ok || ! message) { 1948 throw new Error(message || 'We could not subscribe you right now. Please try again later.'); 1949 } 1950 1951 form.reset(); 1952 showSuccessMessage(form, message || 'You have been subscribed successfully.'); 1953 }); 1954 }).catch(function (error) { 1955 setMessage(form, 'error', error.message || 'We could not subscribe you right now. Please try again later.'); 1956 }).finally(function () { 1957 if (button) { 1958 button.disabled = false; 1959 } 1960 }); 1961 }); 1962 })(); 1963</script>
1963 1964
1964<script> 1965 window.__EDITION__ = "ch"; 1966 </script>
1966 1967 1968 <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css' type='text/css' media='all' /> 1969 1970 1971 1972
1972<script type="tl-js"> 1973 window._taboola = window._taboola || []; 1974 _taboola.push({article:"auto"}); 1975 !function (e, f, u, i) { 1976 if (!document.getElementById(i)){ 1977 e.async = 1; 1978 e.src = u; 1979 e.id = i; 1980 f.parentNode.insertBefore(e, f); 1981 } 1982 }(document.createElement("script"), 1983 document.getElementsByTagName("script")[0], 1984 "//cdn.taboola.com/libtrc/thelocal-network/loader.js", 1985 "tb_loader_script"); 1986 if(window.performance && typeof window.performance.mark == "function") 1987 {window.performance.mark("tbl_ic");} 1988 </script>
1988 1989 1990 </head> 1991<body class="antialiased article-page article-page--commercial" data-auth="false">
vendor: 72 bytes, lines 1991-1992
1991 1992 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
1992GTM-NMLDXPL
vendor: 92 bytes, lines 1992-1994
1992" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 1993 1994
1994<div class="relative min-h-screen sm:pt-0" id="app"> 1995 <default-js :data="{"login_route":"https:\/\/www.thelocal.ch\/login","register_route":"https:\/\/www.thelocal.ch\/register","logout_route":"https:\/\/www.thelocal.ch\/logout","piano_sync_route":"https:\/\/www.thelocal.ch\/piano-sync","account_route":"https:\/\/www.thelocal.ch\/members\/account","account_path":"\/members\/account","piano_abandoned_cart_route":"https:\/\/www.thelocal.ch\/api\/v1\/piano\/abandoned-cart","home_route":"https:\/\/www.thelocal.ch","auth":false,"auth_paid":false}"></default-js> 1996 <header class="site-header"> 1997 <div class="container"> 1998 <nav class="navbar navbar--complex"> 1999 <div class="nav-spacer nav-spacer--toggler"> 2000 <button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasWithBackdrop" aria-controls="offcanvasWithBackdrop" aria-expanded="false" aria-label="Toggle navigation"> 2001 <span class="navbar-toggler-icon"></span> 2002 </button> 2003 </div> 2004 <a class="navbar-brand" href="https://www.thelocal.ch"> 2005 <img width="269" height="51" src="https://www.thelocal.ch/images/logo-ch.svg" alt="The Local"> 2006 </a> 2007 <div class="nav-spacer nav-spacer--menu" role="navigation" aria-label="Quick Links"> 2008 <div class="login-box tablet-login-box"></div> 2009 <ul class="secondary-menu navbar-nav"> 2010 <li class="nav-item dropdown"> 2011 <a class="nav-link dropdown-toggle" id="SwissNewsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2012 Swiss News 2013 </a> 2014 <ul class="dropdown-menu" aria-labelledby="SwissNewsDropdown"> 2015 <li> 2016 <a class="dropdown-item" href="https://www.thelocal.ch/category/switzerland-news">Latest news</a> 2017 2018 </li> 2019 <li> 2020 <a class="dropdown-item" href="https://www.thelocal.ch/tag/zurich">Zurich</a> 2021 2022 </li> 2023 <li> 2024 <a class="dropdown-item" href="https://www.thelocal.ch/tag/geneva">Geneva</a> 2025 2026 </li> 2027 <li> 2028 <a class="dropdown-item" href="https://www.thelocal.ch/tag/basel">Basel</a> 2029 2030 </li> 2031 <li> 2032 <a class="dropdown-item" href="https://www.thelocal.ch/tag/lausanne">lausanne</a> 2033 2034 </li> 2035 <li> 2036 <a class="dropdown-item" href="https://www.thelocal.ch/tag/cost-of-living">Cost of living</a> 2037 2038 </li> 2039 <li> 2040 <a class="dropdown-item" href="https://www.thelocal.ch/tag/travel-news">Travel news</a> 2041 2042 </li> 2043 </ul> 2044 </li> 2045 <li class="nav-item dropdown"> 2046 <a class="nav-link dropdown-toggle" id="PracticalhelpDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2047 Practical help 2048 </a> 2049 <ul class="dropdown-menu" aria-labelledby="PracticalhelpDropdown"> 2050 <li> 2051 <a class="dropdown-item" href="https://www.thelocal.ch/category/living-in-switzerland">Living in Switzerland</a> 2052 2053 </li> 2054 <li> 2055 <a class="dropdown-item" href="https://www.thelocal.ch/tag/moving-to-switzerland">Moving to Switzerland</a> 2056 2057 </li> 2058 <li> 2059 <a class="dropdown-item" href="https://www.thelocal.ch/tag/studying-in-switzerland">Studying in Switzerland</a> 2060 2061 </li> 2062 <li> 2063 <a class="dropdown-item" href="https://www.thelocal.ch/tag/money">Money</a> 2064 2065 </li> 2066 <li> 2067 <a class="dropdown-item" href="https://www.thelocal.ch/tag/v
2067isas">Visas</a> 2068 2069 </li> 2070 <li> 2071 <a class="dropdown-item" href="https://www.thelocal.ch/tag/swiss-citizenship">Swiss citizenship</a> 2072 2073 </li> 2074 <li> 2075 <a class="dropdown-item" href="https://www.thelocal.ch/tag/residency-permits">Residency permits</a> 2076 2077 </li> 2078 <li> 2079 <a class="dropdown-item" href="https://www.thelocal.ch/tag/taxes">Taxes</a> 2080 2081 </li> 2082 <li> 2083 <a class="dropdown-item" href="https://www.thelocal.ch/tag/question">Reader questions</a> 2084 2085 </li> 2086 </ul> 2087 </li> 2088 <li class="nav-item dropdown"> 2089 <a class="nav-link dropdown-toggle" id="LearnaboutSwitzerlandDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2090 Learn about Switzerland 2091 </a> 2092 <ul class="dropdown-menu" aria-labelledby="LearnaboutSwitzerlandDropdown"> 2093 <li> 2094 <a class="dropdown-item" href="/language-lessons">Language Lessons</a> 2095 2096 </li> 2097 <li> 2098 <a class="dropdown-item" href="https://www.thelocal.ch/category/switzerland-explained">Switzerland Explained</a> 2099 2100 </li> 2101 <li> 2102 <a class="dropdown-item" href="https://www.thelocal.ch/tag/discover-switzerland">Discover Switzerland</a> 2103 2104 </li> 2105 <li> 2106 <a class="dropdown-item" href="https://www.thelocal.ch/tag/food-drink">Food and Drink</a> 2107 2108 </li> 2109 </ul> 2110 </li> 2111 <li class="nav-item dropdown"> 2112 <a class="nav-link dropdown-toggle" id="HomesDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2113 Homes 2114 </a> 2115 <ul class="dropdown-menu" aria-labelledby="HomesDropdown"> 2116 <li> 2117 <a class="dropdown-item" href="https://www.thelocal.ch/tag/property">Property</a> 2118 2119 </li> 2120 <li> 2121 <a class="dropdown-item" href="https://www.thelocal.ch/tag/renting">Renting</a> 2122 2123 </li> 2124 <li> 2125 <a class="dropdown-item" href="/rentals">Find rentals</a> 2126 2127 </li> 2128 </ul> 2129 </li> 2130 <li class="nav-item dropdown"> 2131 <a class="nav-link dropdown-toggle" id="JobsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2132 Jobs 2133 </a> 2134 <ul class="dropdown-menu" aria-labelledby="JobsDropdown"> 2135 <li> 2136 <a class="dropdown-item" href="https://www.thelocal.ch/tag/working-in-switzerland">Working in Switzerland</a> 2137 2138 </li> 2139 <li> 2140 <a class="dropdown-item" href="https://www.thelocal.ch/tag/work-permits">Work permits</a> 2141 2142 </li> 2143 </ul> 2144 </li> 2145 <li class="nav-item"> 2146 <a href="/business-directory" class="nav-link">Local directory</a> 2147 </li> 2148 <li class="nav-item nav-item--btn login-box"></li> 2149 </ul> 2150 </div> 2151 <div class="search-nav-container"> 2152 <search-component-js :data='{"search_route":"\/search","api_search_route":"\/api\/search","api_popular_route":"\/api\/search\/popular","api_autocomplete_route":"\/api\/search\/autocomplete","api_click_route":"\/api\/search\/click","edition":"ch","popular_searches":["switzerland","residence permit","taxes","housing","travel"],"source":"header"}'></search-component-js> 2153 </div> 2154 2155 <div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasWithBackdrop" aria-labelledby="offcanvasWithBackdropLabel"> 2156 <div class="offcanvas-header"> 2157 <a href="https://www.thelocal.ch"> 2158 <img width="200" height="51" src="https://www.thelocal.ch/images/logo-ch.svg" alt="The Local"> 2159 </a> 2160 2161 <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button> 2162 </div> 2163 <div class="offcanvas-body"> 2164 <div class="login-box"></div> 2165 2166 <ul class="navbar-nav"> 2167 <h5>Topics</h5> 2168 <li class="nav-item dropdown"> 2169 <a class="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2170 Swiss News 2171 </a> 2172 <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> 2173 <li> 2174 <a class="dropdown-item" href="https://www.thelocal.ch/category/switzerland-news">Latest news</a> 2175 2176 </li> 2177 <li> 2178 <a class="dropdown-item" href="https://www.thelocal.ch/tag/zurich">Zurich</a> 2179 2180 </li> 2181 <li> 2182 <a class="dropdown-item" href="https://www.thelocal.ch/tag/geneva">Geneva</a> 2183 2184 </li> 2185 <li> 2186 <a class="dropdown-item" href="https://www.thelocal.ch/tag/basel">Basel</a> 2187 2188 </li> 2189 <li> 2190 <a class="dropdown-item" href="https://www.thelocal.ch/tag/lausanne">lausanne</a> 2191 2192 </li> 2193 <li> 2194 <a class="dropdown-item" href="https://www.thelocal.ch/tag/cost-of-living">Cost of living</a> 2195 2196 </li> 2197 <li> 2198 <a class="dropdown-item" href="https://www.thelocal.ch/tag/travel-news">Travel news</a> 2199 2200 </li> 2201 </ul> 2202 </li> 2203 <li class="nav-item dropdown"> 2204 <a class="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2205 Practical help 2206 </a> 2207 <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> 2208 <li> 2209 <a class="dropdown-item" href="https://www.thelocal.ch/category/living-in-switzerland">Living in Switzerland</a> 2210 2211 </li> 2212 <li> 2213 <a class="dropdown-item" href="https://www.thelocal.ch/tag/moving-to-switzerland">Moving to Switzerland</a> 2214 2215 </li> 2216 <li> 2217 <a class="dropdown-item" href="https://www.thelocal.ch/tag/studying-in-switzerland">Studying in Switzerland</a> 2218 2219 </li> 2220 <li> 2221 <a class="dropdown-item" href="https://www.thelocal.ch/tag/money">Money</a> 2222 2223 </li> 2224 <li> 2225 <a class="dropdown-item" href="https://www.thelocal.ch/tag/v
2225isas">Visas</a> 2226 2227 </li> 2228 <li> 2229 <a class="dropdown-item" href="https://www.thelocal.ch/tag/swiss-citizenship">Swiss citizenship</a> 2230 2231 </li> 2232 <li> 2233 <a class="dropdown-item" href="https://www.thelocal.ch/tag/residency-permits">Residency permits</a> 2234 2235 </li> 2236 <li> 2237 <a class="dropdown-item" href="https://www.thelocal.ch/tag/taxes">Taxes</a> 2238 2239 </li> 2240 <li> 2241 <a class="dropdown-item" href="https://www.thelocal.ch/tag/question">Reader questions</a> 2242 2243 </li> 2244 </ul> 2245 </li> 2246 <li class="nav-item dropdown"> 2247 <a class="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2248 Learn about Switzerland 2249 </a> 2250 <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> 2251 <li> 2252 <a class="dropdown-item" href="/language-lessons">Language Lessons</a> 2253 2254 </li> 2255 <li> 2256 <a class="dropdown-item" href="https://www.thelocal.ch/category/switzerland-explained">Switzerland Explained</a> 2257 2258 </li> 2259 <li> 2260 <a class="dropdown-item" href="https://www.thelocal.ch/tag/discover-switzerland">Discover Switzerland</a> 2261 2262 </li> 2263 <li> 2264 <a class="dropdown-item" href="https://www.thelocal.ch/tag/food-drink">Food and Drink</a> 2265 2266 </li> 2267 </ul> 2268 </li> 2269 <li class="nav-item dropdown"> 2270 <a class="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2271 Homes 2272 </a> 2273 <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> 2274 <li> 2275 <a class="dropdown-item" href="https://www.thelocal.ch/tag/property">Property</a> 2276 2277 </li> 2278 <li> 2279 <a class="dropdown-item" href="https://www.thelocal.ch/tag/renting">Renting</a> 2280 2281 </li> 2282 <li> 2283 <a class="dropdown-item" href="/rentals">Find rentals</a> 2284 2285 </li> 2286 </ul> 2287 </li> 2288 <li class="nav-item dropdown"> 2289 <a class="nav-link dropdown-toggle" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2290 Jobs 2291 </a> 2292 <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> 2293 <li> 2294 <a class="dropdown-item" href="https://www.thelocal.ch/tag/working-in-switzerland">Working in Switzerland</a> 2295 2296 </li> 2297 <li> 2298 <a class="dropdown-item" href="https://www.thelocal.ch/tag/work-permits">Work permits</a> 2299 2300 </li> 2301 </ul> 2302 </li> 2303 </ul> 2304 <ul class="navbar-nav"> 2305 <h5>Choose edition</h5> 2306 <li class="nav-item dropdown"> 2307 <a class="nav-link dropdown-toggle editorial-select text-capitalize" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 2308 switzerland 2309 </a> 2310 <ul class="dropdown-menu" aria-labelledby="navbarDropdown"> 2311 <li class="nav-item"> 2312 <a class="dropdown-item " aria-current="page" href="https://www.thelocal.com">All Editions</a> 2313 </li> 2314 <li class="nav-item"> 2315 <a class="dropdown-item " href="https://www.thelocal.at"> 2316 <div class="fflag fflag-AT ff-sm" title="Austria AT"></div> 2317 Austria 2318 </a> 2319 </li> 2320 <li class="nav-item"> 2321 <a class="dropdown-item " href="https://www.thelocal.dk"> 2322 <div class="fflag fflag-DK ff-sm" title="Denmark DK"></div> 2323 Denmark 2324 </a> 2325 </li> 2326 <li class="nav-item"> 2327 <a class="dropdown-item " href="https://www.thelocal.fr"> 2328 <div class="fflag fflag-FR ff-sm" title="France FR"></div> 2329 France 2330 </a> 2331 </li> 2332 <li class="nav-item"> 2333 <a class="dropdown-item " href="https://www.thelocal.de"> 2334 <div class="fflag fflag-DE ff-sm" title="Germany DE"></div> 2335 Germany 2336 </a> 2337 </li> 2338 <li class="nav-item"> 2339 <a class="dropdown-item " href="https://www.thelocal.it"> 2340 <div class="fflag fflag-IT ff-sm" title="Italy IT"></div> 2341 Italy 2342 </a> 2343 </li> 2344 <li class="nav-item"> 2345 <a class="dropdown-item " href="https://www.thelocal.no"> 2346 <div class="fflag fflag-NO ff-sm" title="Norway NO"></div> 2347 Norway 2348 </a> 2349 </li> 2350 <li class="nav-item"> 2351 <a class="dropdown-item " href="https://www.thelocal.es"> 2352 <div class="fflag fflag-ES ff-sm" title="Spain ES"></div> 2353 Spain 2354 </a> 2355 </li> 2356 <li class="nav-item"> 2357 <a class="dropdown-item " href="https://www.thelocal.se"> 2358 <div class="fflag fflag-SE ff-sm" title="Sweden SE"></div> 2359 Sweden 2360 </a> 2361 </li> 2362 <li class="nav-item"> 2363 <a class="dropdown-item active" href="https://www.thelocal.ch"> 2364 <div class="fflag fflag-CH ff-sm" title="Switzerland CH"></div> 2365 Switzerland 2366 </a> 2367 </li> 2368 </ul> 2369 </li> 2370</ul> <ul class="navbar-nav"> 2371 <h5>Membership</h5> 2372 <li class="nav-item"> 2373 <a class="nav-link" href="/membership-offer?tpcc=ch-menu"> 2374 <i class="fas fa-user"></i> Become a member 2375 </a> 2376 </li> 2377 <li class="nav-item"> 2378 <a class="nav-link" href="https://www.thelocal.ch/free-newsletter"> 2379 <i class="far fa-envelope"></i> Newsletters 2380 </a> 2381 </li> 2382 <li class="nav-item"> 2383 <a class="nav-link" href="https://thelocalhelp.zendesk.com/hc/en-us"> 2384 <i class="far fa-circle-question"></i> Help Centre 2385 </a> 2386 </li> 2387 <li class="nav-item"> 2388 <a class="nav-link" href="https://www.thelocal.ch/gift-voucher"> 2389 <i class="fas fa-gift"></i> Gift Vouchers 2390 </a> 2391 </li> 2392 <li class="nav-item"> 2393 <a class="nav-link" href="https://www.thelocal.ch/membership-student"> 2394 <i class="fas fa-user-graduate"></i> Educational Access 2395 </a> 2396 </li> 2397 <li class="nav-item"> 2398 <a class="nav-link" href="https://www.thelocal.ch/corporate-membership"> 2399 <i class="fas fa-shop"></i> Corporate Access 2400 </a> 2401 </li> 2402 2403</ul> 2404 <ul class="navbar-nav"> 2405 <h5>The Local</h5> 2406 <li class="nav-item"> 2407 <a class="nav-link " href="https://www.thelocal.ch/aboutus"> 2408 <svg width="19" height="21" viewBox="0 0 19 21" fill="none" xmlns="http://www.w3.org/2000/svg"> 2409 <path fill-rule="evenodd" clip-rule="evenodd" d="M10.8308 0.140769C12.1981 0.11446 13.3947 0.545022 14.4697 1.31952C15.7353 2.23134
240916.8409 3.33514 17.7224 4.66327C19.3268 7.08071 19.3926 9.64971 18.0746 12.1655C16.5195 15.1337 14.2777 17.4821 11.4716 19.1511C8.9412 20.6559 6.44941 20.4185 4.12068 18.5811C2.97483 17.677 1.98205 16.5975 1.17851 15.3519C-0.183885 13.2406 -0.384344 10.9492 0.677905 8.68117C2.32618 5.16019 4.89327 2.53048 8.21247 0.740604C9.03625 0.296567 9.94191 0.110995 10.8308 0.140769ZM5.89386 10.1305C5.89386 11.9832 5.89308 13.8359 5.89464 15.6885C5.89464 16.0886 5.96593 16.1658 6.34723 16.166C8.45369 16.1685 10.5604 16.1683 12.667 16.1663C13.06 16.166 13.1893 16.0309 13.1938 15.6164C13.1992 15.0853 13.199 14.5544 13.1938 14.0233C13.1896 13.6005 13.0926 13.4997 12.6988 13.4995C11.4213 13.4981 10.1436 13.4886 8.86679 13.5063C8.55971 13.5105 8.46343 13.4226 8.46575 13.0947C8.47902 11.2776 8.472 9.46015 8.472 7.64307C8.472 6.65168 8.47519 5.66056 8.46981 4.6693C8.46762 4.19074 8.36233 4.08564 7.91767 4.08422C7.42438 4.08255 6.93146 4.08306 6.43828 4.08397C5.93732 4.08474 5.89431 4.12876 5.89407 4.64325C5.89407 6.4724 5.89407 8.30142 5.89407 10.1304L5.89386 10.1305Z" fill="#666666"/> 2410 </svg> About Us 2411 </a> 2412 </li> 2413 <li class="nav-item"> 2414 <a class="nav-link " href="https://www.thelocal.ch/contact"> 2415 <i class="far fa-envelope"></i>Contact Us 2416 </a> 2417 </li> 2418 <li class="nav-item"> 2419 <a class="nav-link " href="https://www.thelocal.ch/news-archive"> 2420 <i class="fa-solid fa-box-archive"></i>News Archive 2421 </a> 2422 </li> 2423 <li class="nav-item"> 2424 <a class="nav-link " href="https://www.thelocal.ch/search"> 2425 <i class="fa-solid fa-magnifying-glass"></i>Search articles 2426 </a> 2427 </li> 2428 <li class="nav-item"> 2429 <a class="nav-link " href="https://www.thelocal.ch/topics"> 2430 <i class="fa-solid fa-newspaper"></i>All topics 2431 </a> 2432 </li> 2433 <li class="nav-item"> 2434 <a class="nav-link " href="https://www.thelocal.ch/advertise-with-us"> 2435 <i class="fas fa-tag"></i> Advertise with us 2436 </a> 2437 </li> 2438 <li class="nav-item"> 2439 <a class="nav-link " href="/business-directory"> 2440 <i class="fas fa-briefcase"></i> Local directory 2441 </a> 2442 </li> 2443 <li class="nav-item"> 2444 <a class="nav-link " href="https://jobs.thelocal.com/employers/"> 2445 <i class="fa-solid fa-clipboard-list"></i> Post a job ad 2446 </a> 2447 </li> 2448 </ul> <ul class="navbar-nav"> 2449 <div class="footer-badges"> 2450 <h5>Get The Local App</h5> 2451 <a href="https://apps.apple.com/app/the-local/id1078564301?ppid=87d73ebb-5099-4635-b188-9af5077c6013" target="_blank"> 2452 <img class="lazyload" data-src="https://www.thelocal.ch/images/App_Store_Badge__wht.svg" width="120" height="40" alt="App Store"> 2453 </a> 2454 2455 <a href="https://play.google.com/store/apps/details?id=com.thelocal.app" target="_blank"> 2456 <img class="lazyload" data-src="https://www.thelocal.ch/images/google-play-badge.webp" width="150" height="60" alt="Google Play Store"> 2457 </a> 2458 </div> 2459 2460 <ul class="footer-socialLinks"> 2461 <li> 2462 <a href="https://www.facebook.com/TheLocalSwitzerland" target="_blank"> 2463 <i class="fab fa-square-facebook"></i> 2464 </a> 2465 </li> 2466 <li> 2467 <a href="https://bsky.app/profile/thelocalswitz.bsky.social" target="_blank"> 2468 <i class="fab fa-square-bluesky"></i> 2469 </a> 2470 </li> 2471 <li> 2472 <a href="https://www.instagram.com/thelocalswitzerland" target="_blank"> 2473 <i class="fab fa-square-instagram"></i> 2474 </a> 2475 </li> 2476 <li> 2477 <a href="https://www.threads.net/@thelocalswitzerland" target="_blank"> 2478 <i class="fab fa-square-threads"></i> 2479 </a> 2480 </li> 2481 <li> 2482 <a href="https://www.linkedin.com/company/thelocaleurope/" target="_blank"> 2483 <i class="fab fa-linkedin"></i> 2484 </a> 2485 </li> 2486 </ul> 2487</ul> 2488 <div class="footer-column footer-column__general d-block d-md-none"> 2489 <img width="211" height="40" src="https://www.thelocal.ch/images/logo-ch.svg" alt="The Local" class="footer-logo"> 2490 <p class="footer-info">The Local Europe AB<br>Västmannagatan 43<br>113 25 Stockholm<br>Sweden</p> 2491 </div> 2492 2493 </div> 2494 </div> 2495 </nav> 2496</div>
2497<script> 2498 (function () { 2499 if (!document.documentElement.classList.contains('has-piano-session')) { 2500 return; 2501 } 2502 2503 const newsletterUrl = "https:\/\/www.thelocal.ch\/members\/newsletters"; 2504 const accountUrl = "https:\/\/www.thelocal.ch\/members\/account"; 2505 2506 document.querySelectorAll('.secondary-menu > .login-box').forEach((loginBox) => { 2507 const accountLink = loginBox.cloneNode(false); 2508 loginBox.classList.remove('login-box'); 2509 loginBox.classList.add('nav-item--member-link'); 2510 loginBox.innerHTML = `<a href="${newsletterUrl}" class="nav-link nav-link--member">Newsletters</a>`; 2511 accountLink.classList.remove('login-box', 'nav-item--btn'); 2512 accountLink.classList.add('nav-item--member-link'); 2513 accountLink.innerHTML = `<a href="${accountUrl}" class="nav-link nav-link--member">My account</a>`; 2514 loginBox.after(accountLink); 2515 }); 2516 2517 document.querySelectorAll('.login-box').forEach((loginBox) => { 2518 const isOffcanvasNavigation = loginBox.closest('.offcanvas-body'); 2519 loginBox.classList.remove('login-box'); 2520 loginBox.classList.add('member-navigation'); 2521 loginBox.innerHTML = isOffcanvasNavigation 2522 ? `<a href="${accountUrl}" class="nav-link">My Account</a><a href="${newsletterUrl}" class="nav-link">Newsletters</a>` 2523 : `<a href="${newsletterUrl}" class="nav-link nav-link--member">Newsletters</a><a href="${accountUrl}" class="nav-link nav-link--member">My account</a>`; 2524 }); 2525 2526 document.querySelectorAll('.offcanvas-body a[href*="membership-offer"], .offcanvas-body a[href*="free-newsletter"]').forEach((link) => { 2527 const isMembershipOffer = link.href.includes('membership-offer'); 2528 link.href = isMembershipOffer ? accountUrl : newsletterUrl; 2529 link.innerHTML = isMembershipOffer 2530 ? '<i class="fas fa-user"></i> My Account' 2531 : '<i class="far fa-envelope"></i> Newsletters'; 2532 }); 2533 })(); 2534</script>
2534 2535 </header> 2536 2537 <div id="pn-header" class="pn-header"></div> 2538 <div id="main" class="site"> 2539 <article-js :data="{"post_comment_route":"https:\/\/www.thelocal.ch\/comment\/save","comments_load_route":"https:\/\/www.thelocal.ch\/comment\/269231\/load","comments_load_token":"eyJhcnRpY2xlX2lkIjoyNjkyMzF9.30cff5f668b072e70df5785a339bf0e4e8cb18f8cf3030bcab2991571c8950a5","comments_page_size":5,"terms_url":"https:\/\/www.thelocal.ch\/terms-of-use","isCommercial":true}"></article-js> 2540<div class="article-single article-single--sponsored"> 2541 <div class="container-md"> 2542 <div class="row"> 2543 <div class="col-12 mobile-full-width"> 2544 <main class="article-single__main article-single__main--featured article--commercial " data-url="https://www.thelocal.ch/20260826/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline"> 2545 2546 <div class="tag-wrapper"> 2547 <a href="https://www.thelocal.ch/tag/by-myexpattaxes" class="tag">Presented by myexpattaxes</a> 2548 <img src="https://assets.thelocal.com/cdn-cgi/rs:fit:250/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/Screenshot-2026-08-21-105102.jpg@webp" alt="by myexpattaxes"> 2549 </div> 2550 <h1>What Americans abroad need to know about the October 15th tax deadline</h1> 2551 <p class="article-single__excerpt"> 2552 A key tax deadline for Americans is coming up on October 15th. Our guide breaks down exactly what you need to know to avoid any nasty surprises. 2553 </p> 2554 <div class="meta"> 2555 <div class="article-single__author"> 2556 <div> 2557 <span> 2558 Published: Wed 26 Aug 2026 09:11 CEST 2559 </span> 2560 </div> 2561 </div> 2562 <div class="article-single__social"> 2563 <div class="article-actions-bar"> 2564 <button class="copy article-action article-action--share" type="button">Share</button> 2565 <ul class="social-sharers article-actions"> 2566 <li class="social-sharers__save article-actions__item"> 2567 <save-article-js :data="{"currentEditorial":"ch","articleUrl":"https:\/\/www.thelocal.ch\/20260826\/what-americans-abroad-need-to-know-about-the-october-15th-tax-deadline","isCommercial":false,"save_article_route":"https:\/\/www.thelocal.ch\/api\/v1\/user\/save-article","saved_articles_route":"https:\/\/www.thelocal.ch\/members\/saved-articles","articleId":269231,"userId":null,"websitePlatform":"web","isArticleSavedByUser":false,"inSavedPage":false,"isPaidUser":false}"></save-article-js> 2568 </li> 2569 <li> 2570 <button class="social-share facebook" data-sharer="facebook" title="Facebook"> 2571 <i class="fab fa-facebook-f"></i> 2572 </button> 2573 </li> 2574 <li> 2575 <button class="social-share twitter" data-sharer="twitter" data-tweet="What Americans abroad need to know about the October 15th tax deadline" title="Twitter"> 2576 <i class="fab fa-twitter"></i> 2577 </button> 2578 </li> 2579 <li> 2580 <button class="social-share linkedin" data-sharer="linkedin" title="LinkedIn"> 2581 <i class="fab fa-linkedin-in"></i> 2582 </button> 2583 </li> 2584 </ul> 2585 </div> 2586 </div> 2587 </div> 2588 <button 2589 type="button" 2590 aria-label="Get the app" 2591 data-label="Get the app" 2592 data-ios-url="https://apps.apple.com/app/the-local/id1078564301?ppid=87d73ebb-5099-4635-b188-9af5077c6013" 2593 data-android-url="https://play.google.com/store/apps/details?id=com.thelocal.app" 2594 class="article-app-cta" 2595 ></button> 2596 <figure class="figure article-single__feature"> 2597 <img 2598 width="855" 2599 height="524" 2600 style="min-height: 250px;aspect-ratio: 855 / 524;" 2601 src="https://assets.thelocal.com/cdn-cgi/rs:fit:850/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp" 2602 srcset="https://assets.thelocal.com/cdn-cgi/rs:fit:450/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp 450w, https://assets.thelocal.com/cdn-cgi/rs:fit:850/quality:75/plain/https://apiwp.thelocal.com/wp-content/uploads/2026/08/startupstockphotos-student-849825_1280.jpg@webp 850w" 2603 sizes="(max-width: 576px) 92vw, (max-width: 1200px) 80vw, 850px" 2604 fetchpriority="high" 2605 loading="eager" 2606 decoding="async" 2607 class="figure-img img-fluid" 2608 alt="What Americans abroad need to know about the October 15th tax deadline" 2609 >
2610 <figcaption class="figure-caption">We explain what Americans living overseas need to know about the October 15th tax deadline. Image by <a href="https://pixabay.com/users/startupstockphotos-690514/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=849825">StartupStockPhotos</a> from <a href="https://pixabay.com//?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=849825">Pixabay</a></figcaption> 2611 </figure> 2612 <div class="article-single__content cXenseParse"> 2613 <p>Thursday, October 15th, 2026, is the last day for Americans abroad who requested additional time to file your 2025 federal tax return. If you also need to file an FBAR, it's due on the same date.</p> 2614<p>What trips up many US expats is what the extension actually covers: it gives you more time to file, no more time to pay.</p> 2615<p>In this guide, we break down what Americans abroad need to know about the October 15th deadline for both your tax return and your FBAR, why filing matters even if you owe nothing, and what happens if you don't file in time.</p> 2616<p><strong>What October 15th Covers</strong></p> 2617<p>The October 15th tax deadline is about filing, and only filing.</p> 2618<p>As a US citizen living abroad, you get an automatic two-month filing extension to June 15th, with no paperwork required. Filing Form 4868 by that date added another four months, moving your due date to October 15th.</p> 2619<p>Your FBAR is due the same day, although it's a separate filing that doesn't go to the IRS at all (more on FBARs below).</p> 2620<p><a target="_blank" rel="external noopener sponsored" href="https://www.myexpattaxes.com/?utm_source=thelocal&utm_medium=sponsored&utm_campaign=oct15-deadline-2025&utm_content=brand-link"><strong>Donât leave it until the deadline: start your return today</strong></a></p> 2621<p><strong>What the October 15th extension doesn't cover </strong></p> 2622<p>Living abroad doesn't move the payment date. Whatever you owed on your 2025 return was due April 15th, 2026, and both interest and the late-payment penalty run from that date, not from June 15th or October 15th.</p> 2623<p>Interest is compounded daily and continues to accrue on any unpaid tax until the balance is paid in full. For example, at the current rate of 7 percent a year, a $6,000 balance carried from April 15th to October 15th works out to a little over $200 in interest, and that's before any penalties.</p> 2624<p>The late payment penalty is separate: 0.5 percent of the unpaid tax for each month or part of a month it goes unpaid, up to a maximum of 25 percent. Form 4868 puts it plainly: "Form 4868 doesn't extend the time to pay taxes."</p> 2625<p>If you haven't paid, paying now stops the interest from growing. Use IRS Direct Pay, or apply for a payment plan if you can't pay in full.<br /> 2626<br /> 2627<a target="_blank" rel="external noopener sponsored" href="https://link.thelocal.com/55b2c3be"><strong>Still need to file? Get started before October 15th</strong></a></p> 2628<p><strong>October 15th is also the FBAR Deadline</strong></p> 2629<p>If the combined value of your foreign financial accounts exceeds $10,000 at any point in 2025, you may need to file the Report of Foreign Bank and Financial Accounts (FBAR).</p> 2630<p>This can include accounts you have signature or other authority over but donât own, such as certain business accounts, as well as accounts you closed during the year.</p> 2631<p>The FBAR is separate from your US tax return. It is filed electronically with the Financial Crimes Enforcement Network (FinCEN) through the BSA E-Filing System, rather than as part of your return to the IRS.</p> 2632<p>The good news is that the October 15th FBAR extension is automatic. If you missed the usual April 15th deadline, thereâs no additional form to submit or extension to request.</p> 2633<p>Missing it is expensive. The maximum penalty for a non-willful violation is $16,536, and since the Supreme Court's decision in the 2023 case, Bittner v. United States, it applies per report rather than per account.</p> 2634<p><strong>What happens if you miss the October 15th deadline?</strong></p> 2635<p>Your return is late, and the failure-to-file penalty is 5 percent of any unpaid tax for each month, or part of a month, that it remains outstanding, up to 25 percent.</p> 2636<p>For most Americans abroad, that may come to nothing, because expat tax breaks like the Foreign Tax Credit and the Foreign Earned Income Exclusion can significantly reduce what you owe, and in many cases bring it to zero.</p> 2637<p>But those benefits only apply if you claim them, and to claim them, you must file, even if you expect your US tax bill to be zero.</p> 2638<p>If October 15th hasn't arrived yet and you know you won't make it, you may have one more option.</p> 2639<p>Americans abroad can request a further extension to December 15th by writing to the IRS with the reason. It's discretionary, and you'll only hear back if it's refused.</p> 2640<p><strong>What if you didn't file Form 4868</strong><strong>?</strong></p> 2641<p>If you didn't file Form 4868, you can still file your return, and it's worth doing as soon as you can. Without the extension, your 2025 return was due June 15th, so it's already late, and if you have unpaid tax the failure-to-file penalty builds each month until it reaches 25 percent. Filing is what stop it.</p> 2642<p>
2642Fortunately, you may not be charged at all. The IRS now applies penalty relief automatically through a programme called Automatic Exemption from Penalty, which is replacing the old First-Time Abatement process and applies to eligible 2025 returns.</p> 2643<p>If you meet the eligibility requirements, including filing and paying on time for the three prior years, the relief applies automatically without a separate request. It doesn't cover penalties for the FBAR or other international information returns, which have their own procedures.</p> 2644<p>If you're behind on several years rather than one, the Streamlined Filing Compliance Procedures may offer a route back. You file the last three years of returns and six years of FBARs, certify that your non-compliance was non-willful, and if you qualify, the penalties are waived.</p> 2645<p><a target="_blank" rel="external noopener sponsored" href="https://link.thelocal.com/25bdf0d3"><strong>Ready to file? Create a free account</strong></a></p> 2646<p><strong>The bottom line</strong></p> 2647<p>October 15th is manageable if you start now, and remember: filing is how you claim the expat tax benefits that could reduce or eliminate your US tax bill.</p> 2648<p><a target="_blank" rel="external noopener sponsored" href="https://link.thelocal.com/55b2c3be" target="_blank" rel="noopener">MyExpatTaxes</a> was built by Americans living abroad, for Americans living abroad. You get the most affordable DIY expat tax software, plus flat-priced tax services with trusted tax professionals. File your return and your FBAR in one place.</p> 2649<p>See the <a target="_blank" rel="external noopener sponsored" href="https://link.thelocal.com/7f675998" target="_blank" rel="noopener">plans and prices,</a> or <a target="_blank" rel="external noopener sponsored" href="https://app.myexpattaxes.com/wizard/introduction/2025?utm_source=thelocal&utm_medium=sponsored&utm_campaign=oct15-deadline-2025&utm_content=free-account-cta" target="_blank" rel="noopener">create a free account</a> today to stay compliant and file your 2025 return without the stress.</p> </div> 2650 2651 <div class="member-container"></div> 2652 2653 <div class="article-single__tags"> 2654 <h3 class="block-title border-0">More</h3> 2655 <div class="tags-block"> 2656 <a href="https://www.thelocal.ch/tag/by-myexpattaxes">#by myexpattaxes</a> 2657 </div> 2658 </div> 2659 2660 <div class="sponsor-signoff"> 2661 <div class="article-single__author mb-1"> 2662 </div> 2663 <p>This content was paid for by an advertiser and produced by <b>The Local's Creative Studio</b>.</p> 2664 </div> 2665 2666 2667 <div class="article-single__worth"> 2668 2669 <h3 class="block-title">See Also</h3> 2670 <div class="read-also-recs"></div> 2671 </div> 2672 2673 </main> 2674 </div> 2675 </div> 2676 </div> 2677 2678</div> 2679
2680<script type="application/javascript"> 2681 window.tp = window.tp || []; 2682 2683 var tp = window.tp; 2684 2685 tp.push(["setContentCreated", "2026-08-26T09:11:29+02:00"]); 2686 tp.push(["setContentSection", "Sponsored Content"]); 2687 tp.push(["setTags", ["sponsored","by-myexpattaxes"]]); 2688</script>
2688 2689 </div> 2690 2691 <div id="pn-footer" class="pn-footer"><div id="pn-footer-show"></div></div> 2692 <footer class="site-footer dark"> 2693 <div class="container"> 2694 <div class="footer-links"> 2695 <div class="row"> 2696 <div class="col-lg-3 d-none d-md-block"> 2697 <div class="footer-column footer-column__general"> 2698 <img width="211" height="40" 2699 src="https://www.thelocal.ch/images/logo-ch.svg" alt="The Local" 2700 class="footer-logo"> 2701 <p class="footer-info">The Local Europe AB<br>Västmannagatan 43<br>113 25 Stockholm<br>Sweden</p> 2702 </div> 2703 <div class="footer-badges"> 2704 <a href="https://apps.apple.com/app/the-local/id1078564301?ppid=87d73ebb-5099-4635-b188-9af5077c6013" target="_blank" aria-label="Apple App Store link"> 2705 <img class="lazyload" data-src="https://www.thelocal.ch/images/App_Store_Badge__wht.svg" width="120" height="40" alt="App Store"> 2706 </a> 2707 2708 <a href="https://play.google.com/store/apps/details?id=com.thelocal.app" target="_blank" aria-label="Google Play Store link"> 2709 <img class="lazyload" data-src="https://www.thelocal.ch/images/google-play-badge.webp" width="150" height="60" alt="Google Play Store"> 2710 </a> 2711 </div> 2712 <ul class="footer-socialLinks"> 2713 <li> 2714 <a href="https://www.facebook.com/TheLocalSwitzerland" target="_blank" aria-label="The Local Facebook profile"> 2715 <i class="fab fa-square-facebook"></i> 2716 </a> 2717 </li> 2718 <li> 2719 <a href="https://bsky.app/profile/thelocalswitz.bsky.social" target="_blank" aria-label="The Local X profile"> 2720 <i class="fab fa-square-bluesky"></i> 2721 </a> 2722 </li> 2723 <li> 2724 <a href="https://www.instagram.com/thelocalswitzerland" target="_blank" aria-label="The Local Instagram profile"> 2725 <i class="fab fa-square-instagram"></i> 2726 </a> 2727 </li> 2728 <li> 2729 <a href="https://www.threads.net/@thelocalswitzerland" target="_blank" aria-label="The Local Threads profile"> 2730 <i class="fab fa-square-threads"></i> 2731 </a> 2732 </li> 2733 <li> 2734 <a href="https://www.linkedin.com/company/thelocaleurope/" target="_blank" aria-label="The Local LinkedIn profile"> 2735 <i class="fab fa-linkedin"></i> 2736 </a> 2737 </li> 2738 </ul> 2739 </div> 2740 <div class="col-lg-2 d-none d-md-block"> 2741 <div class="footer-column"> 2742 <h4>The Local</h4> 2743 <nav class="footer-nav"> 2744 <a href="https://www.thelocal.ch/aboutus">About us</a> 2745 <a href="https://www.thelocal.ch/contact">Contact us</a> 2746 <a href="https://www.thelocal.ch/news-archive">News Archive</a> 2747 <a href="https://www.thelocal.ch/search">Search articles</a> 2748 <a href="https://www.thelocal.ch/tag/working-in-switzerland">Find jobs in Switzerland</a> 2749 2750 <a href="https://www.thelocal.ch/rentals">Find a rental in Switzerland</a> 2751 <a href="https://jobs.thelocal.com/employers/" target="_blank">Post a job ad</a> 2752 <a href="https://www.thelocal.ch/advertise-with-us">Advertise with us</a> 2753 <a href="/business-directory">Local Directory</a> 2754 </nav> 2755 </div> 2756 </div> 2757 <div class="col-lg-2 d-none d-md-block"> 2758 <div class="footer-column"> 2759 <h4>Membership</h4> 2760 <nav class="footer-nav"> 2761 2762 <a class="pn-login" href="javascript:void(0);" role="button" tabindex="-1">Login</a> 2763 <a href="/membership-offer?tpcc=ch-menu">Become a member</a> 2764 <a href="https://www.thelocal.ch/free-newsletter">Newsletters</a> 2765 <a href="https://thelocalhelp.zendesk.com/hc/en-us" target="_blank">Help Centre</a> 2766 <a href="https://www.thelocal.ch/gift-voucher">Gift Vouchers</a> 2767 <a href="https://www.thelocal.ch/membership-student">Educational access</a> 2768 <a href="https://www.thelocal.ch/corporate-membership">Corporate access</a> 2769 </nav> 2770 </div> 2771 </div> 2772 <div class="col-lg-2 d-none d-md-block"> 2773 <div class="footer-column"> 2774 <h4>Popular Topics</h4> 2775 <nav class="footer-nav"> 2776 <a href="https://www.thelocal.ch/category/switzerland-news">Latest News</a> 2777 <a href="https://www.thelocal.ch/tag/zurich">Zurich</a> 2778 <a href="https://www.thelocal.ch/tag/geneva">Geneva</a> 2779 <a href="https://www.thelocal.ch/tag/basel">Basel</a> 2780 <a href="https://www.thelocal.ch/tag/lausanne">Lausanne</a> 2781 <a href="https://www.thelocal.ch/category/switzerland-explained">Switzerland explained</a> 2782 <a href="https://www.thelocal.ch/category/living-in-switzerland">Living in Switzerland</a> 2783 <a href="https://www.thelocal.ch/topics">All topics</a> 2784</nav> 2785 </div> 2786 </div> 2787 <div class="col-lg-3"> 2788 <div class="footer-column footer-column__subscribe"> 2789 <h4>
2789Get daily news straight in your inbox</h4> 2790 <div class="footer-newsletter"> 2791 <div class="tl-newsletter-form"> 2792 <div class="tl-newsletter-form__inner"> 2793 <form class="tl-newsletter-form__form" method="POST" action="https://www.thelocal.ch/beehiiv/footer-subscribe" data-beehiiv-signup-form> 2794 <input type="hidden" name="_token" value="CaEiB5wNeoh1oBzX6E6AOn2szQWSFSLF9XgzqTqH" autocomplete="off"> <input type="hidden" name="custom_fields[]" value="Daily"> 2795 <input type="text" name="website" tabindex="-1" autocomplete="off" aria-hidden="true" hidden> 2796 <input class="tl-newsletter-form__input" type="email" name="email" placeholder="Your email address" value="" required> 2797 <button class="tl-newsletter-form__button" type="submit">Sign up</button> 2798 </form> 2799 <p class="tl-newsletter-form__message" data-beehiiv-signup-message role="status" aria-live="polite" hidden></p> 2800 </div> 2801</div> 2802 2803 </div> 2804 <p class="footer-terms"> 2805 By signing up you agree to our <a href="https://www.thelocal.ch/terms-of-use">Terms of Use</a> and <a href="https://www.thelocal.ch/privacy-policy">Privacy Policy.</a> We will use your email address to send you newsletters as well as information and offers related to your account. 2806 </p> 2807 </div> 2808 </div> 2809 </div> 2810 </div> 2811</div> 2812<div class="footer-copyright"> 2813 <div class="container"> 2814 <p>2026 The Local, All Rights Reserved.</p> 2815 <div class="dp-links"> 2816 <a href="javascript:void(0);" class="cmp-manage-cookies" role="button" tabindex="0">Manage Cookies</a> 2817 <a href="https://www.thelocal.ch/privacy-policy">Privacy Policy</a> 2818 <a href="https://www.thelocal.ch/terms-of-use">Terms & Conditions</a> 2819 </div> 2820 </div> 2821</div> 2822 </footer> 2823 </div> 2824
2824<script src="/js/manifest.js?id=8dbb10a76f77e9f2b7cf0702852d0a79"></script>
2824 2825
2825<script src="/js/js/vendor-utils.1cd4678413e6ef15.js?id=3386e19637a4657e3f311ed9221431ad"></script>
2825 2826
2826<script src="/js/vendor.js?id=9f4833b40453c6f04949adc25a2635d2"></script>
2826 2827
2827<script src="/js/vue.js?id=31a3093f90e1a46ac1171699c4e46f8b"></script>
2827 2828
2828<script src="/js/js/bootstrap.8c0aa6d31d7d2b59.js?id=1ee00102a9731642dc805b8e3f873d11"></script>
2828 2829
2829<script src="/js/app.js?id=405d03c51fed55dff499f4da68e72766"></script>
2829 2830 2831
2831<script type="tl-js"> 2832 function makeid(length) { 2833 var result = ""; 2834 var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 2835 var charactersLength = characters.length; 2836 for ( var i = 0; i < length; i++ ) { 2837 result += characters.charAt(Math.floor(Math.random() * 2838 charactersLength)); 2839 } 2840 return result; 2841 } 2842 + new Date() 2843 let timestampMS = new Date().getTime(); 2844 let timestamp = Math.floor(timestampMS / 1000); 2845 let g4_location_hostname = encodeURIComponent(window.location.hostname) 2846 let g4_location_path; 2847 if(encodeURIComponent(window.location.pathname) !== "" || encodeURIComponent(window.location.pathname) !== null || encodeURIComponent(window.location.pathname) !== undefined){ 2848 g4_location_path = encodeURIComponent(window.location.pathname) 2849 } else { 2850 g4_location_path = "path_not_exist"; 2851 } 2852 let g4_location = encodeURIComponent(window.location) 2853 let referrer = encodeURIComponent(document.referrer); 2854 let siteTitle = encodeURIComponent(document.title); 2855 let cid = makeid(9) + "." + Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000 2856 var queryString = window.location.search 2857 var queryParams = new URLSearchParams(queryString); 2858 let utm_campaign = queryParams.has("utm_campaign") ? queryParams.get("utm_campaign") : ""; 2859 let utm_source = queryParams.has("utm_source") ? queryParams.get("utm_source") : ""; 2860 let utm_term = queryParams.has("utm_term") ? queryParams.get("utm_term") : ""; 2861 let utm_medium = queryParams.has("utm_medium") ? queryParams.get("utm_medium") : ""; 2862 let domain = "ch"; 2863 let country = ""; 2864 var req = new XMLHttpRequest(); 2865 req.open("GET", document.location, true); 2866 req.send(null); 2867 var headers = req.getAllResponseHeaders().toLowerCase(); 2868 let headersArr = headers.split("\r\n") 2869 2870 for (let index = 0; index < headersArr.length; index++) { 2871 const element = headersArr[index]; 2872 if(element.includes("visitor-country")){ 2873 country = element.split(":").pop(); 2874 } 2875 } 2876 2877 function sendToAllNewsEvent() { 2878 if(referrer.includes("thelocal.")){ 2879 referrer = ""; 2880 } 2881 2882 fetch(`https://ss.thelocal.com/g/collect?v=2&en=total_page_view_ga4&tid=G-XFSR2700S9&cid=${cid}&dt=${siteTitle}&dr=${referrer}&dl=${g4_location}&ep.measurement_model=consent_independent_volume_estimate&ep.country_c=${country}&ep.hostname_c=${g4_location_hostname}&ep.path_c=${g4_location_path}&ep.utm_campaign_c=${utm_campaign}&ep.utm_source_c=${utm_source}&ep.utm_term_c=${utm_term}&ep.utm_medium_c=${utm_medium}`, 2883 { 2884 method: "POST", 2885 mode: "no-cors", 2886 },).then((response) => { 2887 // console.log(response) 2888 }); 2889 2890 } 2891 2892 function sendEvent() { 2893 2894 let measurement_id = ""; 2895 const measurement_ids = { 2896 "at":"G-M0QF2J98ZG", 2897 "ch":"G-RKPPBTRQGN", 2898 "com":"G-PXG8C23QQX", 2899 "de":"G-68EFP8XFKZ", 2900 "dk":"G-87R3SHFK20", 2901 "es":"G-XZ791ZL201", 2902 "fr":"G-1LX6T78HZR", 2903 "it":"G-FYSRWRX4T3", 2904 "no":"G-B6VF16B85K", 2905 "se":"G-S57KNFL4T3" 2906 } 2907 2908 if(referrer.includes("thelocal.")){ 2909 referrer = ""; 2910 } 2911 2912 if(measurement_ids.hasOwnProperty(domain)){ 2913 measurement_id = measurement_ids[domain]; 2914 } 2915 2916 fetch(`https://ss.thelocal.com/g/collect?v=2&en=total_page_view_ga4&tid=${measurement_id}&cid=${cid}&dt=${siteTitle}&dr=${referrer}&dl=${g4_location}&ep.measurement_model=consent_independent_volume_estimate&ep.country_c=${country}&ep.hostname_c=${g4_location_hostname}&ep.path_c=${g4_location_path}&ep.utm_campaign_c=${utm_campaign}&ep.utm_source_c=${utm_source}&ep.utm_term_c=${utm_term}&ep.utm_medium_c=${utm_medium}`, 2917 { 2918 method: "POST", 2919 mode: "no-cors", 2920 },).then((response) => { 2921 // console.log(response) 2922 }); 2923 2924 } 2925
2926 function runAnalyticsEvents() { 2927 sendEvent(); 2928 sendToAllNewsEvent(); 2929 } 2930 2931 if ("requestIdleCallback" in window) { 2932 window.requestIdleCallback(runAnalyticsEvents, { timeout: 2500 }); 2933 } else { 2934 setTimeout(runAnalyticsEvents, 1200); 2935 } 2936 </script>
2936 2937 2938
2938<script type="tl-js"> 2939 window._taboola = window._taboola || []; 2940 _taboola.push({flush: true}); 2941 </script>
2941 2942 2943
2943<script> 2944 Defer.all('script[type="tl-js"]', 0, true); 2945 </script>
2945 2946
2946<script> 2947 Defer.all('script[type="tl-chunk-js"]', 0, false); 2948 </script>
2948 2949</body> 2950</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.