InstantSearch loads the search-insights library for you from jsDelivr. You don’t need to install it or set it up yourself.If you’re using a Content Security Policy to protect your site and you want to let InstantSearch load search-insights for you, make sure to add https://cdn.jsdelivr.net in your list of trusted sources for JavaScript.
Report incorrect code
Copy
script-src https://cdn.jsdelivr.net/
If you prefer hosting your own version of search-insights, you can add it to your project:
You can enable the automatic collection of events from your InstantSearch apps
in the Algolia dashboard (without coding),
or when setting up your InstantSearch app (with coding).Enabling automatic events collection takes care of the following:
Add the search-insights library to your project and make it globally available as window.aa
Set an anonymous userToken for sending events to the Insights API and for search requests
Include the queryID parameter in the search response
Go to the Events hub in the Algolia dashboard to check
the default events arriving from your website or app.
For more information, see Validate your events.
You may want to send events that aren’t automatically captured by InstantSearch widgets.
To understand which events you should send,
think about the different steps a user takes through your website to reach the final goal:
the product purchase.
Search results page
Category page
External referrals
Starting with a search on any of your pages, a user might take the following actions:
Select a product from the search results to open the product details page.
Add a product to the shopping cart.
Buy the product.
Starting with a visit to your homepage, a user might take the following actions:
Select a product category to open a category (product listing) page.
Select a product to open a product details page.
Add a product to the shopping cart.
Buy the product.
Starting with a search on an internet search engine,
with a click on a recommendation,
or any other external referral,
a user might take the following actions:
Click on a (internet) search result, recommendation, or other link to your website.
Depending on where the user lands on your website,
they continue the same path as if they started with your homepage or with a category page.
When your users add an item to their cart, send a special conversion event with the addToCart subtype.
Report incorrect code
Copy
hits({ templates: { item(hit, { html, components, sendEvent }) { return html` <h2>${components.Highlight({ attribute: "name", hit })}</h2> <p>${hit.description}</p> <button onClick=${() => sendEvent("conversion", hit, "Added To Cart", { // Special subtype eventSubtype: "addToCart", // An array of objects representing each item added to the cart objectData: [ { // The discount value for this item, if applicable discount: hit.discount || 0, // The price value for this item (minus the discount) price: hit.price, // How many of this item were added quantity: 2, }, ], // The total value of all items value: hit.price * 2, // The currency code currency: "USD", })} > Add to cart </button> `; }, },});
Fields representing monetary values accept both numbers and strings,
in major currency units (for example, 5.45 or '5.45').
To prevent floating-point math issues, use strings, especially if you’re performing calculations.
Add the following code to all components and pages where users can add products to their shopping cart.For add-to-cart events associated with a search:
The window.aa object is the API client for the Insights API and is globally available
if you enabled automatic events collection.When all objects in the event are attributed to the same query, set the queryID parameter at the root level as shown above.
However, when objects have different query IDs (for example, items added to cart from different searches), specify the queryID for each object in the objectData array:
You should store the query ID with other product details when updating a user’s shopping cart.
This helps you record query IDs for each item for any following purchase events.For add-to-cart events not related to a search query, for example, after a user clicks on a
‘Recommended for you’ or ‘Buy again’ carousel on the home page, you don’t need to specify queryID:
When your users purchase an item, send a special conversion event with the purchase subtype.
Report incorrect code
Copy
hits({ templates: { item(hit, { html, components, sendEvent }) { return html` <h2>${components.Highlight({ attribute: "name", hit })}</h2> <p>${hit.description}</p> <button onClick=${() => sendEvent("conversion", hit, "Purchased", { // Special subtype eventSubtype: "purchase", // An array of objects representing each purchased item objectData: [ { // The discount value for this item, if applicable discount: hit.discount || 0, // The price value for this item (minus the discount) price: hit.price, // How many of this item were added quantity: 2, // The per-item `queryID` for the query preceding this event queryID: hit.__queryID, }, ], // The total value of all items value: hit.price * 2, // The currency code currency: "USD", })} > Purchase </button> `; }, },});
Fields representing monetary values accept both numbers and strings, in major
currency units (for example, 5.45 or '5.45'). To prevent floating-point
math issues, use strings, especially if you’re performing calculations.
Add the following code to your checkout flow.When all objects in the purchase are attributed to the same query, you can set the queryID parameter at the root level:
However, users often purchase items that were added to the cart in response to different queries.
For example, a user might search for “shoes” and add a pair of shoes to their cart.
Then, they search for “lamp” and add a lamp to their cart. Then, they check out and complete the purchase of both items.
In this case, there would be a single purchase event, but each item should be attributed to its originating query.
Specify the queryID for each object in the objectData array:
This is an example of a conversion that may occur on a page without InstantSearch:
JavaScript
Report incorrect code
Copy
// A user added a product to their wishlist from the homepagewindow.aa("convertedObjectIDs", { eventName: "Product Added To Wishlist", index: "YourIndexName", objectIDs: ["objectID-1"],});
You can set more events on specific parts of your template.
In the following example, when users click the Add to favorites button, two events are sent to the Insights API:
A click event with the eventName “Product Added to Favorites”.
A click event with the eventName “Product Clicked” (through event propagation).
When InstantSearch captures a custom click event that you defined, it doesn’t send the default click event.
In the following example, when users click the Add to favorites button, only the “Product Added to Favorites” event is sent:
For effective personalization, you need to identify users across sessions.
It’s best to use an identifier from your authentication,
, or ecommerce service after users sign in.
For more information, see User token.After getting the identifier from your system,
set it as authenticatedUserToken parameter.
JavaScript
Report incorrect code
Copy
// Get a unique, pseudonymous identifier for signed-in usersconst authenticatedUserToken = getUserTokenAfterSignIn();window.aa("setAuthenticatedUserToken", authenticatedUserToken);
If you can’t get persistent user identifiers from your system,
you can store the anonymous user token in a cookie after obtaining user consent.
JavaScript
Report incorrect code
Copy
// If user consentedaa("init", { partial: true, useCookie: true,});
If you don’t use persistent user identifiers,
a new anonymous user token is generated on every page refresh.Personalization benefits from the same click and conversion events,
plus it can use view events to enrich user profiles.Your InstantSearch components for the search results and category pages automatically collect view events.To capture additional view events, such as on your homepage,
add this code: