Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions buzz/events/doctype/buzz_settings/buzz_settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
"default_sponsor_deck_reply_to",
"column_break_sponsor",
"default_sponsor_deck_cc",
"analytics_tab",
"tracking_scripts_section",
"tracking_scripts",
"section_break_vtep",
"custom_fields_go_after_this"
],
Expand Down Expand Up @@ -221,6 +224,23 @@
"fieldname": "success_section",
"fieldtype": "Section Break",
"label": "Success"
},
{
"fieldname": "analytics_tab",
"fieldtype": "Tab Break",
"label": "Analytics"
},
{
"fieldname": "tracking_scripts_section",
"fieldtype": "Section Break",
"label": "Tracking Scripts"
},
{
"description": "Paste tracking / analytics scripts (e.g. Facebook Pixel, Google Analytics, LinkedIn Insight). Injected into the dashboard's <head> once on app load. Use `data-track` selectors and the `?success=true` URL marker to hook into booking events. See <a href='https://bwh.tech/buzz/tracking-scripts' target='_blank'>docs</a> for available hooks and a copy-pasteable starter snippet.",
"fieldname": "tracking_scripts",
"fieldtype": "Code",
"label": "Tracking Scripts",
"options": "HTML"
}
],
"grid_page_length": 50,
Expand Down
1 change: 1 addition & 0 deletions buzz/www/dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ def get_boot():
"site_name": frappe.local.site,
"read_only_mode": frappe.flags.read_only,
"system_timezone": get_system_timezone(),
"tracking_scripts": frappe.db.get_single_value("Buzz Settings", "tracking_scripts") or "",
}
)
16 changes: 0 additions & 16 deletions dashboard/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,8 @@
<link rel="icon" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Buzz Dashboard</title>
<!-- Meta Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '862243486137582');
</script>
<!-- End Meta Pixel Code -->
</head>
<body class="bg-surface-white">
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=862243486137582&ev=PageView&noscript=1"
/></noscript>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
Expand Down
5 changes: 3 additions & 2 deletions dashboard/src/components/BookingForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
</div>
</div>

<form v-else @submit.prevent="submit">
<form v-else data-track="booking-form" @submit.prevent="submit">
<!-- Offline Payment Dialog -->
<OfflinePaymentDialog
v-model:open="showOfflineDialog"
Expand Down Expand Up @@ -230,6 +230,7 @@
/>
<Button
variant="outline"
data-track="apply-coupon"
@click="applyCoupon"
:loading="validateCoupon.loading"
>
Expand Down Expand Up @@ -391,6 +392,7 @@
size="lg"
class="w-full"
type="submit"
data-track="book-now"
:loading="processBooking.loading || sendOtpResource.loading"
>
{{ submitButtonText }}
Expand Down Expand Up @@ -1261,7 +1263,6 @@ async function submit() {
}

function submitBooking(payload, paymentGateway, { isOtpFlow = false } = {}) {
if (window.fbq) window.fbq("track", "InitiateCheckout");
processBooking.submit(
{
...payload,
Expand Down
19 changes: 19 additions & 0 deletions dashboard/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,25 @@ const globalComponents = {
Badge,
}

const trackingScripts = (window as any).tracking_scripts
if (trackingScripts) {
const container = document.createElement("div")
container.innerHTML = trackingScripts
for (const node of Array.from(container.childNodes)) {
if (node.nodeType === Node.ELEMENT_NODE && (node as Element).tagName === "SCRIPT") {
const source = node as HTMLScriptElement
const script = document.createElement("script")
for (const attr of Array.from(source.attributes)) {
script.setAttribute(attr.name, attr.value)
}
script.text = source.text
document.head.appendChild(script)
} else {
document.head.appendChild(node)
}
}
}

const app = createApp(App)

setConfig("resourceFetcher", frappeRequest)
Expand Down
13 changes: 7 additions & 6 deletions dashboard/src/pages/BookingDetails.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
</div>

<div v-else-if="bookingDetails.data">
<div
v-if="isPaymentSuccess && bookingDetails.data.doc?.status !== 'Approval Pending'"
data-track="booking-success"
:data-track-total="bookingDetails.data.doc?.grand_total"
:data-track-currency="bookingDetails.data.doc?.currency || 'INR'"
hidden
></div>
<!-- Approval Pending Status -->
<div
v-if="!bookingDetails.data.event.free_webinar && isOfflinePaymentPending"
Expand Down Expand Up @@ -169,12 +176,6 @@ const bookingDetails = createResource({
auto: true,
onSuccess: (data) => {
if (isPaymentSuccess && !purchaseTracked && data.doc?.status !== "Approval Pending") {
if (window.fbq) {
window.fbq("track", "Purchase", {
value: (data.doc?.grand_total || 0).toFixed(2),
currency: data.doc?.currency || "INR",
});
}
purchaseTracked = true;
if (data?.event?.route) {
const { clearStoredData } = useBookingFormStorage(data.event.route);
Expand Down
Loading