Boost AI Search & Discovery is a Shopify search, filter, and merchandising app used by thousands of stores to power product discovery - instant search, faceted filters, and AI-driven recommendations.
Connecting Boost to Omnisend lets you use what shoppers search for as an automation trigger. When a customer searches your store or clicks a search result, Omnisend receives a custom event in real time - so you can follow up on browsing intent that never reached the cart.
Benefits
Reach shoppers earlier in the funnel. Search happens before add-to-cart. These events surface intent that abandoned cart automations never see.
Trigger on what they were actually looking for. The search term is passed with every event, so your follow-up can reference the exact product or category.
Works for known contacts who aren't logged in. Events attach to any contact Omnisend already recognizes, not just customers signed into a Shopify account.
Before You Begin
Your Boost app must be on the TURBO template version. Check under Settings → App preferences, or Integration → Shopify Integration to see which version each theme uses. Version is set per theme - only the live theme matters.
Omnisend must be connected to your store with tracking enabled (Shopify theme editor → App embeds → Omnisend toggle on).
Tracking cookies must be placed. Check Store settings → Connected store → Manage tracking cookies.
Setup Process
Step 1. In Omnisend, go to Apps → search for the Boost AI Search & Discovery app → click Connect now.
Step 2. On the next page, you'll see an automation. Once you select it, you will see the webhook's URL. Copy it. This URL is required for us to receive information about the upcoming event.
Step 3. In your Shopify admin, go to Online Store → Themes, and on your live theme click the three dots menu ⋯ → Edit code.
Step 4. Open layout/theme.liquid and paste the Boost tracking snippet just before the closing </body> tag. (Alternatively, add it via a Custom Liquid section in the theme customizer.)
<script>
(function () {
var WEBHOOK_URL = 'YOUR_WEBHOOK_URL';
var SHOP = json;
var CUSTOMER_EMAIL = {% if customer %}json{% else %}null{% endif %};
var lastTerm = null, lastSent = 0, timer = null;
function identity() {
if (CUSTOMER_EMAIL) return { email: CUSTOMER_EMAIL, contactID: null };
try {
var m = document.cookie.match(/omnisendContactID=([^;]+)/);
if (m) return { email: null, contactID: decodeURIComponent(m[1]) };
} catch (e) {}
return null;
}
function send(eventName, props) {
var who = identity();
if (!who) return;
var payload = JSON.stringify({
shop: SHOP,
event: eventName,
identity: who,
properties: props,
occurredAt: new Date().toISOString()
});
try {
if (navigator.sendBeacon) {
navigator.sendBeacon(WEBHOOK_URL, new Blob([payload], { type: 'application/json' }));
} else {
fetch(WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: payload,
keepalive: true
});
}
} catch (e) {}
}
function queueSearch(term) {
if (!term || term.length < 2) return;
if (term === lastTerm && Date.now() - lastSent < 4000) return;
clearTimeout(timer);
timer = setTimeout(function () {
lastTerm = term;
lastSent = Date.now();
send('boost_submitted_search', {
searchTerm: term,
resultsUrl: location.origin + '/search?q=' + encodeURIComponent(term)
});
}, 1200);
}
function termFromUrl(url) {
try {
var s = String(url);
if (s.indexOf('bc-sf-filter/search') === -1 && s.indexOf('bc-sf-filter/suggest') === -1) return null;
return new URL(s, location.origin).searchParams.get('q');
} catch (e) { return null; }
}
var origFetch = window.fetch;
if (origFetch) {
window.fetch = function (input) {
try { queueSearch(termFromUrl(input && input.url ? input.url : input)); } catch (e) {}
return origFetch.apply(this, arguments);
};
}
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (method, url) {
try { queueSearch(termFromUrl(url)); } catch (e) {}
return origOpen.apply(this, arguments);
};
document.addEventListener('input', function (e) {
var el = e.target;
if (!el || el.tagName !== 'INPUT') return;
if (!(el.type === 'search' || el.name === 'q' ||
(el.closest && el.closest('[class*="boost-sd"], [class*="boost-pfs"]')))) return;
queueSearch(el.value && el.value.trim());
}, true);
try {
if (/\/search/.test(location.pathname)) {
var q = new URL(location.href).searchParams.get('q');
if (q) queueSearch(q);
}
} catch (e) {}
document.addEventListener('click', function (e) {
var link = e.target.closest && e.target.closest('a[href*="/products/"]');
if (!link || !link.closest('[class*="boost-sd"], [class*="boost-pfs"]')) return;
var fromSearch = /\/search/.test(location.pathname) ||
!!link.closest('[class*="instant-search"], [class*="suggestion"], [class*="search"]');
send(fromSearch ? 'boost_clicked_search_result' : 'boost_clicked_product', {
searchTerm: fromSearch ? lastTerm : null,
productUrl: link.href,
productHandle: (link.getAttribute('href').split('/products/')[1] || '').split('?')[0],
productTitle: (link.textContent || '').trim().slice(0, 120) || null
});
}, true);
})();
</script>
Step 4. Replace the placeholder webhook URL in the snippet with the address from your Omnisend connection (Step 2).
Step 5. Save, then test: open your storefront, run a search, and click a result. The events should appear on the contact's profile in Omnisend within moments.
That's it! Boost AI Search & Discovery events will now be triggered as custom events in Omnisend.
What Data is Passed
Boost AI Search & Discovery syncs the following custom event to Omnisend:
Event name | When it fires |
| A customer searches your store |
Note: Custom events become available as automation triggers in Omnisend only after they have fired at least once. If you do not see the trigger yet, send a test event first.
Build Automation Workflows with Boost Events
Abandoned search. A customer searched but didn't click anything - follow up with the products they were looking for, or an alternative if you don't stock it.
Searched but didn't buy. They clicked a result and viewed the product, but no cart. Send a reminder referencing that product.
Zero-result rescue. Trigger on searches that returned nothing, and recommend the closest alternative.
Category interest. Use repeated searches around a theme to tag contacts and segment on interest.
Stop the follow-up. Use a purchase as an exit condition so customers who bought don't receive the reminder.
💬 Learn more: Set Up Automation Workflow Settings.
FAQ
Are anonymous visitors tracked?
No. Events attach only to contacts Omnisend can already identify - someone who has signed up through a form, clicked an Omnisend email, entered an email at checkout, or is logged into their Shopify account. A first-time visitor who only accepts cookies has no contact record to attach events to.
Will new contacts be created?
No. This integration enriches existing contacts only. Searching your store does not indicate marketing consent, so no contacts are created, and no subscription status is changed.
Do I need Boost TURBO?
Yes. Earlier Boost template versions render different storefront markup, and the click-tracking will not match reliably.
I upgraded my Boost template, and events stopped. Why is that?
Template updates can change the storefront markup that the snippet relies on. Search tracking is version-independent, but click tracking may need the selectors updated. Note your template version under the Template library before upgrading.
Why do I see several search events for one search?
Boost's instant search runs as the customer types. The snippet waits for a pause in typing before sending, but very slow typing can produce more than one event. Adjust the debounce timing in the snippet if needed.
Does this send Omnisend data back to Boost?
No. This integration sends data from Boost to Omnisend only.
Did something not go as expected? Reach out to our Support Team via in-app chat or email us at [email protected], and we will be happy to assist you.

