AI/ML Powered Compliance Protection for Messaging Networks

Connect Your KYC And Onboarding Data To ODY. We’ll Compare It Against Real-Time And Historical Traffic To Detect Drift, Prevent Non-Compliance, And Stop Abuse Before It Reaches The Consumer’s Device.

Don't Let Your Messaging Network Lose Trust To Fraud

ODY AI Visualization

Protect for Your Messaging Network

ODY leverages advanced AI and machine learning to provide comprehensive protection against messaging threats.

Messaging Drift Detection

Our AI/ML models monitor business messaging activity and compares it against KYC and onboarding information, use-case intent and historical behavior.

  • Sub-second response time
  • Block non-compliant messaging before it reaches consumers' handsets
  • Continuous model improvement
  • Real-time pattern analysis and anomaly detection

Simulated Allow Status & Queuing

Whether deflecting fraud or complying with regional delivery windows, this feature ensures risky traffic is paused, analyzed, and only delivered when safe.

  • Simulated “allow” status deceives bad actors while gaining insight
  • Queue messages for internal review before they reach the handset
  • Complies with country-specific A2P timing regulations

Use Case Enforcement Engine

ODY continuously verifies message intent in real-time against onboarding data and behavioral history to ensure compliance.

  • Enforces declared messaging categories (Marketing, OTP, Informational, Conversational, etc.)
  • Flags mismatches between use case and live content
  • Prevents abuse of approved messaging channels

How ODY Works: Quick And Easy Integration

ODY easily integrates anywhere in the messaging chain—fast, seamless, and built to catch abuse before a single message reaches the consumer.

1

Business Onboarding

ODY ingests KYC and onboarding data to fuel real-time compliance and drift detection.

2

Real-Time Message Monitoring

Every message is scanned against onboarding use-case, metadata, and historical behavior to catch drift, spoofing, volume spikes, and compliance violations.

3

Drift Detection & Threat Response

Risky messages are flagged, queued, or blocked based on severity and organizational protocols.

4

Continuous Learning & Feedback

Every decision trains ODY. Your feedback makes it sharper, faster, and more precise.

Think Of It Like This:

***Any messaging platform, aggregator(Tier 1 & 2), gateway, mobile carrier, CPaas, CCaas, and/or Campaign Service Provider, can integrate Ody into their system***

ODY Integration Flow

See ODY in Action

Watch how ODY protects your messaging network in real-time with AI-powered fraud detection.

Ready to Secure Your Messaging Network?

Join the growing number of businesses protecting their customers and brand reputation with ODY's AI/ML powered fraud detection.

Book a Demo

Join the Waitlist

======= e.preventDefault(); const submitButton = form.querySelector('button[type="submit"]'); const originalText = submitButton.innerHTML; try { // Show loading state submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; const formData = new FormData(form); // Validate form data for (let [key, value] of formData.entries()) { if (typeof value === 'string' && value.length > 500) { const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); throw new Error('Validation failed'); } } // Show confirmation modal confirmationModal.classList.remove('hidden'); form.reset(); } catch (error) { console.error('Form submission error:', error); // Show error message to user const errorDiv = document.createElement('div'); errorDiv.className = 'text-red-500 text-sm mt-2'; errorDiv.textContent = 'There was an error submitting the form. Please try again later.'; form.appendChild(errorDiv); setTimeout(() => errorDiv.remove(), 5000); } finally { // Reset button state submitButton.innerHTML = originalText; submitButton.disabled = false; } }); }); // Modal close handlers const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { if (confirmationModal) { confirmationModal.classList.add('hidden'); } }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); let isValid = true; // Validate form data formData.forEach((value, key) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalText; submitButton.disabled = false; return; } // Show success modal if (confirmationModal) { confirmationModal.classList.remove('hidden'); } // Reset form and button state form.reset(); submitButton.innerHTML = originalText; submitButton.disabled = false; }); }); // Modal close handlers const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { if (confirmationModal) { confirmationModal.classList.add('hidden'); } }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); ======= e.preventDefault(); const submitButton = form.querySelector('button[type="submit"]'); const originalText = submitButton.innerHTML; try { // Show loading state submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; const formData = new FormData(form); // Validate form data for (let [key, value] of formData.entries()) { if (typeof value === 'string' && value.length > 500) { const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); throw new Error('Validation failed'); } } // Show confirmation modal confirmationModal.classList.remove('hidden'); form.reset(); } catch (error) { console.error('Form submission error:', error); // Show error message to user const errorDiv = document.createElement('div'); errorDiv.className = 'text-red-500 text-sm mt-2'; errorDiv.textContent = 'There was an error submitting the form. Please try again later.'; form.appendChild(errorDiv); setTimeout(() => errorDiv.remove(), 5000); } finally { // Reset button state submitButton.innerHTML = originalText; submitButton.disabled = false; } }); }); // Modal close handlers const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { if (confirmationModal) { confirmationModal.classList.add('hidden'); } }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); let isValid = true; // Validate form data formData.forEach((value, key) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalText; submitButton.disabled = false; return; } // Show success modal if (confirmationModal) { confirmationModal.classList.remove('hidden'); } // Reset form and button state form.reset(); submitButton.innerHTML = originalText; submitButton.disabled = false; }); }); // Modal close handlers const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { if (confirmationModal) { confirmationModal.classList.add('hidden'); } }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); const forms = document.querySelectorAll('form'); const confirmationModal = document.getElementById('confirmationModal'); const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); function handleFormSubmit(event) { event.preventDefault(); const form = event.target; const submitButton = form.querySelector('button[type="submit"]'); const originalText = submitButton.innerHTML; // Show loading state submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; // Validate form data const formData = new FormData(form); let isValid = true; for (let [key, value] of formData.entries()) { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); break; } } if (!isValid) { submitButton.innerHTML = originalText; submitButton.disabled = false; return; } // Show success modal confirmationModal.classList.remove('hidden'); // Reset form form.reset(); submitButton.innerHTML = originalText; submitButton.disabled = false; } // Add submit handlers to all forms forms.forEach(form => { form.addEventListener('submit', handleFormSubmit); }); // Modal close handlers [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { confirmationModal.classList.add('hidden'); }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); }); // Show loading state const submitButton = form.querySelector('button[type="submit"]'); const originalButtonText = submitButton.innerHTML; submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; // Validate form data const formEntries = Array.from(formData.entries()); let isValid = true; formEntries.forEach(([key, value]) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalButtonText; submitButton.disabled = false; return; } // Show confirmation modal immediately if (confirmationModal) { confirmationModal.classList.remove('hidden'); } // Reset form form.reset(); // Reset button state submitButton.innerHTML = originalButtonText; submitButton.disabled = false; }

New ${formType} Submission

Submission Time: ${new Date().toLocaleString()}


${Object.entries(formObject).map(([key, value]) => `

${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}

`).join('')}

This is an automated message from the ODY website form submission system.

` }; const response = await fetch('https://api.emailjs.com/api/v1.0/email/send', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ service_id: 'your_service_id', template_id: 'your_template_id', user_id: 'your_user_id', template_params: emailContent }) }); if (!response.ok) { throw new Error('Failed to send email'); } return true; } catch (error) { console.error('Error sending email:', error); return false; } } const playButton = document.getElementById('playVideo'); const video = document.getElementById('demoVideo'); const playOverlay = document.getElementById('playOverlay'); const waitlistForm = document.getElementById('waitlistForm'); const demoForm = document.querySelector('#demo form'); const confirmationModal = document.getElementById('confirmationModal'); const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); async function handleFormSubmit(event) { event.preventDefault(); const form = event.target; const formData = new FormData(form); const formType = form.classList.contains('demo-form') ? 'Demo Request' : 'Waitlist'; // Show loading state const submitButton = form.querySelector('button[type="submit"]'); const originalButtonText = submitButton.innerHTML; submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; const formEntries = Array.from(formData.entries()); let isValid = true; formEntries.forEach(([key, value]) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalButtonText; submitButton.disabled = false; return; } try { const emailSent = await submitFormToEmail(formData, formType); if (emailSent) { confirmationModal.classList.remove('hidden'); form.reset(); } else { throw new Error('Failed to send email'); } } catch (error) { console.error('Form submission error:', error); const errorMessage = document.createElement('div'); errorMessage.className = 'text-red-500 text-sm mt-2'; errorMessage.textContent = 'There was an error submitting the form. Please try again later.'; form.appendChild(errorMessage); setTimeout(() => errorMessage.remove(), 5000); } finally { submitButton.innerHTML = originalButtonText; submitButton.disabled = false; } } // Add event listeners to forms const waitlistForm = document.getElementById('waitlistForm'); const demoForm = document.getElementById('demoForm'); if (waitlistForm) { waitlistForm.addEventListener('submit', handleFormSubmit); } if (demoForm) { demoForm.addEventListener('submit', handleFormSubmit); } if (confirmationModal) { if (closeModal) { closeModal.addEventListener('click', () => { confirmationModal.classList.add('hidden'); }); } if (closeModalBtn) { closeModalBtn.addEventListener('click', () => { confirmationModal.classList.add('hidden'); }); } } document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); e.preventDefault(); const submitButton = form.querySelector('button[type="submit"]'); const originalText = submitButton.innerHTML; try { // Show loading state submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; const formData = new FormData(form); // Validate form data for (let [key, value] of formData.entries()) { if (typeof value === 'string' && value.length > 500) { const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); throw new Error('Validation failed'); } } // Show confirmation modal confirmationModal.classList.remove('hidden'); form.reset(); } catch (error) { console.error('Form submission error:', error); // Show error message to user const errorDiv = document.createElement('div'); errorDiv.className = 'text-red-500 text-sm mt-2'; errorDiv.textContent = 'There was an error submitting the form. Please try again later.'; form.appendChild(errorDiv); setTimeout(() => errorDiv.remove(), 5000); } finally { // Reset button state submitButton.innerHTML = originalText; submitButton.disabled = false; } }); }); // Modal close handlers const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { if (confirmationModal) { confirmationModal.classList.add('hidden'); } }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); let isValid = true; // Validate form data formData.forEach((value, key) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalText; submitButton.disabled = false; return; } // Show success modal if (confirmationModal) { confirmationModal.classList.remove('hidden'); } // Reset form and button state form.reset(); submitButton.innerHTML = originalText; submitButton.disabled = false; }); }); // Modal close handlers const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { if (confirmationModal) { confirmationModal.classList.add('hidden'); } }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); }); const forms = document.querySelectorAll('form'); const confirmationModal = document.getElementById('confirmationModal'); const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); function handleFormSubmit(event) { event.preventDefault(); const form = event.target; const submitButton = form.querySelector('button[type="submit"]'); const originalText = submitButton.innerHTML; // Show loading state submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; // Validate form data const formData = new FormData(form); let isValid = true; for (let [key, value] of formData.entries()) { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); break; } } if (!isValid) { submitButton.innerHTML = originalText; submitButton.disabled = false; return; } // Show success modal confirmationModal.classList.remove('hidden'); // Reset form form.reset(); submitButton.innerHTML = originalText; submitButton.disabled = false; } // Add submit handlers to all forms forms.forEach(form => { form.addEventListener('submit', handleFormSubmit); }); // Modal close handlers [closeModal, closeModalBtn].forEach(btn => { if (btn) { btn.addEventListener('click', () => { confirmationModal.classList.add('hidden'); }); } }); // Close modal on escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); }); // Show loading state const submitButton = form.querySelector('button[type="submit"]'); const originalButtonText = submitButton.innerHTML; submitButton.innerHTML = ' Sending...'; submitButton.disabled = true; // Validate form data const formEntries = Array.from(formData.entries()); let isValid = true; formEntries.forEach(([key, value]) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalButtonText; submitButton.disabled = false; return; } // Show confirmation modal immediately if (confirmationModal) { confirmationModal.classList.remove('hidden'); } // Reset form form.reset(); // Reset button state submitButton.innerHTML = originalButtonText; submitButton.disabled = false; }

New ${formType} Submission

Submission Time: ${new Date().toLocaleString()}


${Object.entries(formObject).map(([key, value]) => `

${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}

`).join('')}

This is an automated message from the ODY website form submission system.

` }; const response = await fetch('https://api.emailjs.com/api/v1.0/email/send', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ service_id: 'your_service_id', template_id: 'your_template_id', user_id: 'your_user_id', template_params: emailContent }) }); if (!response.ok) { throw new Error('Failed to send email'); } return true; } catch (error) { console.error('Error sending email:', error); return false; } } const playButton = document.getElementById('playVideo'); const video = document.getElementById('demoVideo'); const playOverlay = document.getElementById('playOverlay'); const waitlistForm = document.getElementById('waitlistForm'); const demoForm = document.querySelector('#demo form'); const confirmationModal = document.getElementById('confirmationModal'); const closeModal = document.getElementById('closeModal'); const closeModalBtn = document.getElementById('closeModalBtn'); function handleFormSubmit(form) { form.addEventListener('submit', function(e) { e.preventDefault(); const formData = new FormData(form); const formEntries = Array.from(formData.entries()); let isValid = true; formEntries.forEach(([key, value]) => { if (typeof value === 'string' && value.length > 500) { isValid = false; const input = form.querySelector(`[name="${key}"]`); input.setCustomValidity('Maximum 500 characters allowed'); input.reportValidity(); } }); if (!isValid) { submitButton.innerHTML = originalButtonText; submitButton.disabled = false; return; } try { const emailSent = await submitFormToEmail(formData, formType); if (emailSent) { confirmationModal.classList.remove('hidden'); form.reset(); } else { throw new Error('Failed to send email'); } } catch (error) { console.error('Form submission error:', error); const errorMessage = document.createElement('div'); errorMessage.className = 'text-red-500 text-sm mt-2'; errorMessage.textContent = 'There was an error submitting the form. Please try again later.'; form.appendChild(errorMessage); setTimeout(() => errorMessage.remove(), 5000); } finally { submitButton.innerHTML = originalButtonText; submitButton.disabled = false; } }); form.querySelectorAll('input, textarea, select').forEach(input => { input.addEventListener('input', function() { this.setCustomValidity(''); }); }); } if (waitlistForm) { handleFormSubmit(waitlistForm); } if (demoForm) { handleFormSubmit(demoForm); } if (confirmationModal) { if (closeModal) { closeModal.addEventListener('click', function() { confirmationModal.classList.add('hidden'); }); } if (closeModalBtn) { closeModalBtn.addEventListener('click', function() { confirmationModal.classList.add('hidden'); }); } document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); } if (closeModal) { closeModal.addEventListener('click', function() { confirmationModal.classList.add('hidden'); }); } if (closeModalBtn) { closeModalBtn.addEventListener('click', function() { confirmationModal.classList.add('hidden'); }); } if (downloadBrochure) { downloadBrochure.addEventListener('click', function(e) { e.preventDefault(); window.location.href = 'path/to/brochure.pdf'; }); } document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && confirmationModal && !confirmationModal.classList.contains('hidden')) { confirmationModal.classList.add('hidden'); } }); if (playButton && video && playOverlay) { playButton.addEventListener('click', function() { video.play(); playOverlay.style.display = 'none'; }); video.addEventListener('pause', function() { playOverlay.style.display = 'flex'; }); video.addEventListener('play', function() { playOverlay.style.display = 'none'; }); video.addEventListener('ended', function() { playOverlay.style.display = 'flex'; }); } // Smooth scrolling for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); });