Personalization

JavaScript API event notifications

End-of-Sale notice!

Acquia announces the end-of-sale for Acquia Personalization effective July 1, 2024. Customers with active service contracts will continue to receive support. If you are interested in experimentation and optimization, contact Acquia Sales Team to get information about Acquia Convert powered by VWO.

Personalization provides event notifications for decision handling. Whenever an event triggers, the notification can enable custom JavaScript to use that trigger to provide more features.

Note

The acquiaLiftStageCollection event will broadcast after the /decide request returns and regardless of whether personalized content exists.

You can trigger the following events:

EventDescription
acquiaLiftDecisionTriggers when a decision is received and processed. The content may still be in the rendering process, but data is available and processing is complete
acquiaLiftContentAvailableTriggers when a decision’s content has been rendered by the browser and is available for manipulations or query
acquiaLiftContentCustomizableTriggers when AcquiaLiftPublicApi.customize() is called: contains all the decisions and their contents in customizable slots.
acquiaLiftClickThroughTriggers when decision content is clicked
acquiaLiftRuleUpdateTriggers when content is added to or updated in a slot
acquiaLiftStageCollectionTriggers after each /decide request returns and regardless of whether personalized content exists.

Details

For acquiaLiftDecision, acquiaLiftContentAvailable, and acquiaLiftClickThrough, each event has a detail property, which can include the following available information about the decision:

DetailDescription
decision_campaign_idThe unique ID of the rule’s campaign
decision_campaign_nameThe descriptive name of the rule’s campaign
decision_content_idThe ID of the content displayed
decision_content_nameThe title of the content displayed
decision_policyThe decision policy used to make the decision
decision_rule_ab_variationThe name of the AB test rule’s chosen variation
decision_rule_ab_variation_idThe ID of the AB test rule’s chosen variation
decision_rule_idThe ID of the rule used to replace content
decision_rule_nameThe name of the rule used to replace content
decision_rule_segment_idThe ID of the segment on which the rule triggers
decision_rule_segment_nameThe name of the segment on which the rule triggers
decision_rule_typeThe type of rule used. Examples include ab for A/B and target for targeting
decision_slot_idThe ID for the slot where content was replaced
decision_slot_nameThe name of the slot where content was replaced
decision_view_modeThe ID of the layout of the content displayed

For acquiaLiftContentCustomizable, each event has the following properties.

DetailDescription
contentsAn array of content pieces, with each content piece containing base_url, html, and id. base_url is the content publishing website’s base URL; html is the content markup, and id is the id of the content.
slot_css_selectorAs configured in the slot, the CSS selector to find the slot, if it exists, on the page.

Examples

You can use the following code examples to provide more customization on your website:

Example: decision event

window.addEventListener('acquiaLiftDecision', function(e) {
console.log('received decision event for ' + e.detail.decision_slot_id + ' slot');
});

In the previous example, acquiaLiftDecision is the event, and decision_slot_id is the detail property. Both variables are replaceable by other values, as explained in the following sections.

To customize your personalized content pieces, use code like the following:

// Define a callback function for "acquiaLiftDecision" event.
window.addEventListener('acquiaLiftDecision', function(e) {
   // e.detail has decision's information. If the decision isn't our target "My Carousel Slot", early exit.
   if (e.detail.decision_slot_name !== 'My Carousel Slot') {
      return;
   }
   // For example, you can select all content pieces within a slot, and wrap each one of them by a <div>.
   jQuery('[data-lift-slot="' + e.detail.decision_slot_id + '"] > *').wrap('<div style="border: 1px solid red;" class="my-carousel-item"></div>');
});

If your website uses custom JavaScript (such as slideshows, modal windows, or custom lists), you may need code to both listen for the returned decision and reinitialize your JavaScript library. The following example uses the Chosen library:

window.addEventListener('acquiaLiftDecision', function(e) {
console.log('received decision event for ' + e.detail.decision_slot_id + ' slot');
console.log("Loaded");

$selectItems = jQuery('.form-item select');
$selectItems.delay(1000).chosen({
   disable_search_threshold: 5,
   no_results_text: "No Results Found.",
   width: "100%"
}).prop('disabled', false).trigger("chosen:updated");
});

Example: Other ways to reinstantiate JavaScript on a Personalized element

Alternative approaches depending on the JS APIs available to the customer site.

window.addEventListener('acquiaLiftDecision', function(event) {
  /*
    First, check that this is the correct slot to work on.
    The event detail contains the slot id and name:
    - `event.detail.decision_slot_id`
    - `event.detail.decision_slot_name`

   In the example below, the slot was named 'My Slot' when it was created.
  */
  if (event.detail.decision_slot_name === 'My Slot') {
    /*
      Next, select the HTML element that is the slot.

      This shows two ways to select the slot's HTML element:
      - using vanilla JS
      - using jQuery
    */
    // Vanilla JS method to select the slot's HTML.
    const slotElement = document.querySelector(`[data-lift-slot="${event.detail.decision_slot_id}"]`);

    // Using jQuery to select the slot's HTML.
   const slotElementJQ = $(`[data-lift-slot="${event.detail.decision_slot_id}"]`);

    /*
      Finally, act on the slot HTML element.
      The JS code to apply will be some API method.
      JS libraries do not all operate the same way.

      Some examples are show below.
    */

    // An example of APIs that act directly on HTML elements:
    someApiMethod(slotElement);

    // Example for Slick, with an options object to define the carousel's properties:
    slotElementJQ.slick(options);
   }
 });

Simplified approach:

window.addEventListener('acquiaLiftDecision', function(event) {
  /*
    First, check that this is the correct slot to work on.
    The event detail contains the slot id and name:
    - `event.detail.decision_slot_id`
    - `event.detail.decision_slot_name`

    In the example below, the slot was named 'My Slot' when it was created.
  */
  if (event.detail.decision_slot_name === 'My Slot') {
    /*
      Next, select the HTML element that is the slot.
    */
    const slotElement = document.querySelector(`[data-lift-slot="${event.detail.decision_slot_id}"]`);

    /*
      Finally, act on the slot HTML element.
      JS libraries do not all operate the same way, consult their documentation.
    */
  }
});

Example: acquiaLiftContentCustomizable event

window.addEventListener('acquiaLiftContentCustomizable', function(event) {
// Console to show the customizable decision content.
console.log('acquiaLiftContentCustomizable', event.detail);
});

To customize your personalized content pieces using decision data, use code like the following:

window.addEventListener('acquiaLiftContentCustomizable', function(event) {
// Console to show the customizable decision content.
console.info('acquiaLiftContentCustomizable', event.detail);
// Process decisions.
var decisions = event.detail;
Object.keys(decisions).forEach(function(slotId) {
   // Process a decision.
   var decision = decisions[slotId];
   var html = decision.contents.reduce(function(html, content) { return html + content.html }, '');
   var slotElement = document.querySelector(decision.slot_css_selector);

   if (!slotElement) {
      console.warn('Decision on slot "' + slotId + '" has HTML "' + html + '", but slot is not on the page.');
      return;
   }

   // Empty out the element.
   while (slotElement.hasChildNodes()) {
      slotElement.removeChild(slotElement.lastChild);
   }

   // Set the customizable content to the target element's innerHTML.
   slotElement.innerHTML = html;
});
});

Example: acquiaLiftRuleUpdate event

When a slot is updated with new or updated content, this event triggers, calling the AcquiaLiftPublicApi.customize function to broadcast decisions.

window.addEventListener("acquiaLiftRuleUpdate", function(){
AcquiaLiftPublicApi.customize();
});

Acquia Help

Filter by product:

Personalization common questions

If you can't find what you're looking for, try refining your search or contact our Support teamfor further assistance.