Javascript Events for Developers

Last updated on Jan 14, 2026

The Freedom theme emits JavaScript events analogous to Shopify's Dawn theme for developer convenience.

Whenever a major action occurs (like updating the cart or changing a variant), the theme dispatches a standard browser event to the window object. This allows you to hook into these events using standard JavaScript, making it easy to integrate third-party apps or custom analytics without modifying the theme's core code.

How to Listen for Events

You can use the standard window.addEventListener method.

Important: The event data is assigned directly to the event object properties, rather than inside a detail object.

window.addEventListener('cart:update', function(event) {
    // Access data directly from the event object
    const cart = event.cartData; 
    console.log('New Total Price:', cart.total_price);
});

Cart Events

cart:update

Fires whenever the cart state changes (item added, removed, quantity changed, or discount applied).

Event Data:

  • source (String): The origin of the action (e.g., product-form, cart-discount, cart-drawer).

  • cartData (Object): The JSON response from Shopify's Cart API containing items, total price, etc.

  • variantId (Number): The ID of the specific variant that was updated (optional).

Example:

window.addEventListener("cart:update", (event) => {
  console.log("Cart updated via:", event.source);
  console.log("Items count:", event.cartData.item_count);
});

cart:error

Fires when a cart action fails (e.g., attempting to add more quantity than is in stock).

Event Data:

  • source (String): Origin (e.g., product-form).

  • errors (String/Object): Description of the error.

  • message (String): The error message returned by Shopify.

Example:

window.addEventListener("cart:error", (event) => {
  alert("Could not add to cart: " + event.message);
});

quantity:update

Fires immediately when a quantity input is changed in the UI, before the server request completes.

This event does not emit any data.

window.addEventListener("quantity:update", () => {
  console.log("Quantity input changed. UI update pending...");
});

Product Events

variant:change

Fires when a user selects a variant combination that resolves to a valid variant. This is the primary event for updating prices, SKUs, or availability statuses.

Event Data:

  • data.variant (Object): The full JSON object of the selected variant.

  • data.sectionId (String): The ID of the section where the change occurred.

Example:

window.addEventListener("variant:change", (event) => {
  const variant = event.data.variant;

  if (variant) {
    console.log("User selected variant ID:", variant.id);
    console.log("Variant price:", variant.price);
  }
});

option-value-selection:change

Fires immediately when a user clicks an option (swatch, pill, or dropdown), even if a valid variant hasn't been fully resolved yet.

Event Data:

  • data.event (Event): The original DOM click/change event.

  • data.target (Element): The input element triggered.

  • data.selectedOptionValues (Array): Array of currently selected values.

Example

window.addEventListener("option-value-selection:change", (event) => {
  console.log("Option clicked:", event.data.target.value);
  console.log("Current selection:", event.data.selectedOptionValues);
});

Reference: Event Names

For convenience, you can refer to this map of event strings.

const THEME_EVENTS = {
  cartUpdate: 'cart:update',
  quantityUpdate: 'quantity:update',
  optionValueSelectionChange: 'option-value-selection:change',
  variantChange: 'variant:change',
  cartError: 'cart:error',
}