{"id":2168,"date":"2026-02-13T10:51:59","date_gmt":"2026-02-13T09:51:59","guid":{"rendered":"https:\/\/oceanbeat.com\/?page_id=2168"},"modified":"2026-04-20T16:00:30","modified_gmt":"2026-04-20T14:00:30","slug":"oceanbeat-tickets","status":"publish","type":"page","link":"https:\/\/oceanbeat.com\/es\/oceanbeat-tickets\/","title":{"rendered":"Oceanbeat Tickets"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2168\" class=\"elementor elementor-2168\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1f70353 e-con-full e-flex e-con e-parent\" data-id=\"1f70353\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-303aa5a elementor-widget elementor-widget-html\" data-id=\"303aa5a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"oceanbeat-seamless-embed\" style=\"width: 100%; margin: 0; padding: 0; max-width: none;\">\n  <iframe\n    id=\"oceanbeat-booking-iframe\"\n    src=\"\"\n    title=\"Book your boat party \u2013 Ocean Beat\"\n    width=\"100%\"\n    height=\"1150\"\n    style=\"display: block; border: none; margin: 0; padding: 0; width: 100%; min-height: 1100px;\"\n    loading=\"eager\"\n  ><\/iframe>\n\n  <script>\n  (function() {\n    var container = document.querySelector('.oceanbeat-seamless-embed');\n    var iframe = document.getElementById('oceanbeat-booking-iframe');\n    var base = 'https:\/\/oceanbeat-frontend.vercel.app';\n    var apiBase = 'https:\/\/oceanbeat-ticketsystem-production.up.railway.app\/api\/v1';\n    var rawSearch = String(window.location.search || '').replace(\/&amp;\/gi, '&');\n    var params = new URLSearchParams(rawSearch);\n    var bookingNumber = params.get('bookingNumber') || params.get('booking');\n    var token = params.get('token');\n    var isPaymentReturn = params.get('paymentSuccess') === '1' && bookingNumber && token;\n\n    if (isPaymentReturn) {\n      iframe.style.display = 'none';\n      var el = document.createElement('div');\n      el.id = 'ob-native-success';\n      el.innerHTML =\n        '<div style=\"font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;max-width:480px;margin:0 auto;padding:32px 16px;text-align:center\">' +\n          '<div style=\"width:56px;height:56px;border-radius:50%;background:#10b981;color:#fff;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-size:28px;font-weight:bold\">\\u2713<\/div>' +\n          '<h2 style=\"margin:0 0 8px;font-size:20px;color:#1e293b\">Your booking is complete and paid.<\/h2>' +\n          '<p style=\"margin:0 0 24px;color:#64748b;font-size:14px\">Enter your email to receive the booking confirmation and tickets.<\/p>' +\n          '<div id=\"ob-email-form\" style=\"display:flex;flex-direction:column;gap:12px;margin-bottom:24px\">' +\n            '<input type=\"email\" id=\"ob-email-input\" placeholder=\"your@email.com\" style=\"padding:12px 16px;border:1px solid #e2e8f0;border-radius:8px;font-size:16px;outline:none;transition:border-color .2s\" \/>' +\n            '<button type=\"button\" id=\"ob-send-btn\" style=\"padding:12px 16px;border:none;border-radius:8px;background:#10b981;color:#fff;font-size:14px;font-weight:600;cursor:pointer;transition:background .2s\">SEND CONFIRMATION & TICKETS<\/button>' +\n          '<\/div>' +\n          '<p id=\"ob-email-msg\" style=\"display:none;margin:0 0 16px;font-size:14px\" aria-live=\"polite\"><\/p>' +\n          '<a href=\"https:\/\/oceanbeat.com\" id=\"ob-back-home\" style=\"display:inline-block;margin-bottom:24px;padding:10px 24px;border:1px solid #e2e8f0;border-radius:8px;color:#1e293b;font-size:14px;font-weight:500;text-decoration:none;transition:background .2s\">&larr; Back to Home<\/a>' +\n          '<div id=\"ob-overview\" style=\"background:#f8fafc;border-radius:12px;padding:16px;text-align:left\">' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #e2e8f0\"><span style=\"color:#64748b;font-size:13px\">Booking Number<\/span><span id=\"ob-ov-bn\" style=\"color:#1e293b;font-size:13px;font-weight:600\">' + bookingNumber + '<\/span><\/div>' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #e2e8f0\"><span style=\"color:#64748b;font-size:13px\">Event<\/span><span id=\"ob-ov-event\" style=\"color:#1e293b;font-size:13px;font-weight:600\">-<\/span><\/div>' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #e2e8f0\"><span style=\"color:#64748b;font-size:13px\">Date<\/span><span id=\"ob-ov-date\" style=\"color:#1e293b;font-size:13px;font-weight:600\">-<\/span><\/div>' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #e2e8f0\"><span style=\"color:#64748b;font-size:13px\">Time<\/span><span id=\"ob-ov-time\" style=\"color:#1e293b;font-size:13px;font-weight:600\">-<\/span><\/div>' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #e2e8f0\"><span style=\"color:#64748b;font-size:13px\">Persons<\/span><span id=\"ob-ov-persons\" style=\"color:#1e293b;font-size:13px;font-weight:600\">-<\/span><\/div>' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #e2e8f0\"><span style=\"color:#64748b;font-size:13px\">Total<\/span><span id=\"ob-ov-total\" style=\"color:#1e293b;font-size:13px;font-weight:600\">-<\/span><\/div>' +\n            '<div style=\"display:flex;justify-content:space-between;padding:6px 0\"><span style=\"color:#64748b;font-size:13px\">Status<\/span><span id=\"ob-ov-status\" style=\"color:#10b981;font-size:13px;font-weight:600\">-<\/span><\/div>' +\n          '<\/div>' +\n        '<\/div>';\n      container.appendChild(el);\n\n      fetch(apiBase + '\/payments\/check-status', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'X-Booking-Token': token },\n        body: JSON.stringify({ bookingNumber: bookingNumber })\n      }).catch(function() {});\n\n      fetch(apiBase + '\/bookings\/' + encodeURIComponent(bookingNumber), {\n        headers: { 'X-Booking-Token': token }\n      })\n      .then(function(r) { return r.json(); })\n      .then(function(data) {\n        var b = data.booking || data;\n        var ov = document.getElementById('ob-ov-event');\n        if (ov && b.event) ov.textContent = b.event.name || '-';\n        var od = document.getElementById('ob-ov-date');\n        if (od && b.eventDate) od.textContent = (b.eventDate.date || '').slice(0, 10);\n        var ot = document.getElementById('ob-ov-time');\n        if (ot && b.eventDate) ot.textContent = (b.eventDate.startTime || '').slice(0, 5);\n        var op = document.getElementById('ob-ov-persons');\n        if (op) op.textContent = b.numberOfPersons || '-';\n        var otl = document.getElementById('ob-ov-total');\n        if (otl && b.totalPrice != null) otl.textContent = '\\u20AC' + parseFloat(b.totalPrice).toFixed(2);\n        var os = document.getElementById('ob-ov-status');\n        if (os) {\n          var st = (b.paymentStatus || '').replace(\/_\/g, ' ');\n          os.textContent = st.charAt(0).toUpperCase() + st.slice(1);\n        }\n        window.dataLayer = window.dataLayer || [];\n        window.dataLayer.push({\n          event: 'purchase',\n          ecommerce: {\n            currency: 'EUR',\n            value: b.totalPrice ? parseFloat(b.totalPrice) : undefined,\n            transaction_id: bookingNumber,\n            items: [{\n              item_name: (b.event && b.event.name) || undefined,\n              item_id: (b.event && (b.event.id || b.event.slug)) || undefined,\n              item_variant: b.ticketType || 'Standard',\n              item_category: 'Boat Party',\n              price: b.totalPrice && b.numberOfPersons ? parseFloat((b.totalPrice \/ b.numberOfPersons).toFixed(2)) : undefined,\n              quantity: b.numberOfPersons || 1\n            }]\n          },\n          ob_booking_number: bookingNumber,\n          ob_language: document.documentElement.lang || 'en'\n        });\n      })\n      .catch(function() {});\n\n      var sendBtn = document.getElementById('ob-send-btn');\n      var emailInput = document.getElementById('ob-email-input');\n      var emailMsg = document.getElementById('ob-email-msg');\n      sendBtn.addEventListener('click', function() {\n        var email = (emailInput.value || '').trim();\n        if (!email || email.indexOf('@') === -1) {\n          emailMsg.style.display = 'block';\n          emailMsg.style.color = '#ef4444';\n          emailMsg.textContent = 'Please enter a valid email address.';\n          return;\n        }\n        sendBtn.disabled = true;\n        sendBtn.textContent = 'Sending...';\n        fetch(apiBase + '\/bookings\/' + encodeURIComponent(bookingNumber) + '\/send-confirmation', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application\/json', 'X-Booking-Token': token },\n          body: JSON.stringify({ email: email })\n        })\n        .then(function(r) {\n          if (!r.ok) throw new Error('Failed');\n          emailMsg.style.display = 'block';\n          emailMsg.style.color = '#10b981';\n          emailMsg.textContent = 'Confirmation and tickets sent to ' + email + '!';\n          document.getElementById('ob-email-form').style.display = 'none';\n        })\n        .catch(function() {\n          emailMsg.style.display = 'block';\n          emailMsg.style.color = '#ef4444';\n          emailMsg.textContent = 'Could not send email. Please try again.';\n          sendBtn.disabled = false;\n          sendBtn.textContent = 'SEND CONFIRMATION & TICKETS';\n        });\n      });\n\n      if (window.history && window.history.replaceState) {\n        window.history.replaceState({}, document.title, window.location.pathname);\n      }\n      return;\n    }\n\n    \/\/ Normal booking flow (iframe)\n    var returnBase = window.location.origin + window.location.pathname.replace(\/\\\/+$\/, '');\n    var qs = 'returnBase=' + encodeURIComponent(returnBase);\n    if (params.toString()) {\n      qs += '&' + params.toString();\n    }\n    iframe.src = base + '?' + qs;\n\n    window.addEventListener('message', function(e) {\n      if (!e.data) return;\n      if (e.data.type === 'ob-scroll-top') { window.scrollTo({ top: 0, behavior: 'smooth' }); return; }\n      if (e.data.type === 'ob-resize' && e.data.height) { iframe.style.height = e.data.height + 'px'; return; }\n      if (e.data.type !== 'ob-analytics') return;\n      window.dataLayer = window.dataLayer || [];\n      window.dataLayer.push({\n        event: e.data.event,\n        ecommerce: {\n          currency: e.data.currency,\n          value: e.data.value,\n          transaction_id: e.data.transaction_id,\n          coupon: e.data.coupon_code,\n          items: [{\n            item_name: e.data.event_name,\n            item_id: e.data.item_id,\n            item_variant: e.data.ticket_type,\n            item_category: e.data.item_category,\n            price: e.data.price_per_person,\n            quantity: e.data.quantity\n          }]\n        },\n        ob_date: e.data.date,\n        ob_time: e.data.time,\n        ob_booking_number: e.data.booking_number,\n        ob_payment_method: e.data.payment_method,\n        ob_payment_type: e.data.payment_type,\n        ob_language: e.data.language\n      });\n    });\n  })();\n  <\/script>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"yes","footnotes":""},"class_list":["post-2168","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/pages\/2168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/comments?post=2168"}],"version-history":[{"count":44,"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/pages\/2168\/revisions"}],"predecessor-version":[{"id":2557,"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/pages\/2168\/revisions\/2557"}],"wp:attachment":[{"href":"https:\/\/oceanbeat.com\/es\/wp-json\/wp\/v2\/media?parent=2168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}