Enable wishlist item added signals in the Connect web library
The wishlist item added signal triggers when a contact adds a product, service, or offering to a wishlist, favorites list, or saved-items list. Use this signal to identify purchase intent, trigger price-drop or back-in-stock journeys, and segment contacts by product interest.
Typical use cases across business domains:
- Retail: Wishlist or favorites list addition
- Travel: Saving a trip, hotel, or itinerary for later
- Banking/Insurance: Saving a product or plan to compare later
Availability: Pro, Premium and Ultimate
Implementation considerations
Wishlist trigger timing
Decide when to fire the signal relative to the wishlist action:
- Immediate (on click) — Fire as soon as the user clicks the wishlist/heart icon. Captures intent even if the add fails.
- Delayed (on confirmation) — Fire only after the item is confirmed added. More accurate, but may miss failed attempts.
Icon and button variations
Different wishlist UI patterns may require different selectors or extraction logic. Consider:
- Heart, star, or bookmark icons with different CSS classes or IDs
- Icons that toggle state (add vs. remove) using the same element
- Buttons that store product data in different attributes or locations
Multiple entry points
You may need separate pieces of logic to support all the places a wishlist add can happen, such as:
- Adding from the product detail page
- Adding from a product listing or quick-view card
- Adding from a search results or recommendation carousel Each entry point may structure product data differently in the DOM.
Data collection strategy
Plan your implementation around these stages:
- Wishlist button click — Capture product ID and any available product details from the page.
- Add confirmation (if using delayed triggering) — Confirm the item was added before sending.
- Signal send — Build and send the signal with the captured product data.
Note onproductCategoryThis field isn't always exposed as a single, ready-made value in the DOM or a global variable. On many sites, the closest readily available substitute is brand name or breadcrumb text; a true product category may require a data layer entry or backend enrichment. Confirm with your development team which source is most reliable for your implementation before hardcoding a selector.
Contact mapping
Any signal can be mapped to a contact. Use the audience object to provide a customer ID — a contact key or an addressable attribute (email or phone number). You can provide several identification records in the same signal — for example, a contact key and an email address. For details on how Connect processes identification records, see How behavior signals are processed in Connect.
Several sources of identification are available:
-
User identification stored in browser cookies
-
Temporary session-based storage
-
Persistent client-side storage
-
Data layer (for example, Google Tag Manager dataLayer)
-
URL parameters passed during navigation
-
Login API monitoring (capture identifier during successful authentication)
If none of these options are available, work with your development team to make the identifier accessible to the Connect library.
Important:We recommend attaching identifiers to as many signals as possible. However, if an identifier is missing, the system falls back on other signals from the same user session in order to identify the website visitor.
Configuration
Method
TLT.logSignal(signalObject)
Sends the signal to the Acoustic Connect endpoint as a JSON object. The Connect library must be initialized before calling this method.
Signal structure
Top-level fields
audience: Object — Key-value pairs mapping the signal to a contact and optionally updating contact attributes. Keys must match attribute names exactly as they appear in Connect, including capitalization and spacing.category: String — Valid value:Behavior.description: String — Description of the signal.effect: String — Describes the effect of the signal on engagement. It is intended to be used for engagement index scoring. Valid values:negative,positive. Usepositivefor wishlist additions.name: String — Name to differentiate this signal (e.g., "Wishlist add from product page"). Max length: 256 chars.signalType(required): String — Valid value:wishlistItemAdded.
Audience object
Create a flat key-value object where each key is a contact attribute name and each value is the new value for that attribute. Include at least one identifier for contact mapping (recommended) and any number of additional pairs to update other contact attributes.
Important:The
audienceobject must be a flat key-value object — not an array of name/value pairs. If the format doesn't match, the contact will not be created or updated.
Note:
- Attribute names must match exactly how they appear in Connect — including capitalization and spacing. To look up attribute names, use the Contact attributes query.
- The format of each value depends on the attribute type: text, number, Boolean, or date.
- For date attributes, use the following format:
yyyy-MM-dd'T'HH:mm:ssXXX.- For phone number attributes, use the ISO E.164 format:
+[country code][area code][phone number]— no spaces, dashes or special characters. If the+symbol is omitted, Connect adds it automatically.- Sending an empty or null value is ignored — the contact attribute will not be updated.
Consent object
Each channel accepts multiple entries to set different consent statuses per consent group in a single call.
enableOverrideExistingOptOut(required): Boolean — Whentrue, current opt-out statuses will be overridden by new statuses. Whenfalse, contacts who have unsubscribed from communications won't have their consent status updated.email: Array of objects — Consent entries for the email channel. The objects support the following fields:status(required): Enum — Consent status for the email channel. Valid values:OPT_IN,OPT_OUT,OPT_IN_UNVERIFIED.consentGroupIds: Array of strings — The IDs of consent groups a new status applies to. If you skip this field or send an empty array, the new consent status will be applied to all consent groups.
sms: Array of objects — Consent entries for the SMS channel. The objects support the following fields:status(required): Enum — Consent status for the SMS channel. Valid values:OPT_IN,OPT_OUT,OPT_IN_UNVERIFIED.consentGroupIds: Array of strings — The IDs of consent groups a new status applies to. If you skip this field or send an empty array, the new consent status will be applied to all consent groups.
whatsapp: Array of objects — Consent entries for the WhatsApp channel. The objects support the following fields:status(required): Enum — Consent status for the WhatsApp channel. Valid values:OPT_IN,OPT_OUT,OPT_IN_UNVERIFIED.consentGroupIds: Array of strings — The IDs of consent groups a new status applies to. If you skip this field or send an empty array, the new consent status will be applied to all consent groups.
Note:To get the IDs of consent groups, use the dataSets query.
To confirm before publishing: verify
consentis a field the web library SDK (TLT.logSignal) accepts, not only the GraphQLcreateSignalsmutation — this doc is scoped to the SDK only.
Signal content fields
productId(required): String — The unique identifier for the product in your catalog.externalVariantId(optional): String — Identifies the specific size, color, or variant of the product that was saved. Variant ID, if applicable.productName(optional): String — The display name of the product as shown to customers.productCategory(optional): String — The category or department the product belongs to.price(optional): Number — The price of the product at the time it was saved.currency(optional): String — The three-letter ISO currency code (USD, EUR, GBP).wishlistId(optional): String — Identifies which wishlist or saved list the item was added to, useful for accounts that support multiple named lists.
Note:If
productIdis missing or invalid, the entire signal is discarded. Optional fields enhance the signal but won't block processing if omitted.
Basic example
if (window.TLT) {
TLT.initPremium({
appKey: "APP_KEY",
postUrl: "COLLECTOR_URL",
callback: function() {
const signal = {
signalType: "wishlistItemAdded",
productId: "SKU-98234",
productName: "Women's Running Shoe",
price: 89.99,
currency: "USD",
category: "Behavior",
effect: "positive",
audience: {
"Email": "[email protected]"
}
};
TLT.logSignal(signal);
}
});
}Complete implementation example
This example handles wishlist-add events from both the product detail page and quick-add icons in product listings. The audience identifier is retrieved from a browser cookie. A marketing opt-in checkbox is used to conditionally update email consent.
if (window.TLT) {
TLT.initPremium({
appKey: "APP_KEY",
postUrl: "COLLECTOR_URL",
callback: function() {
document.querySelectorAll('.wishlist-button').forEach(function(button) {
button.addEventListener('click', function(e) {
const productId = button.dataset.productId;
const productName = button.dataset.productName;
const productCategory = button.dataset.productCategory;
const price = parseFloat(button.dataset.price) || undefined;
const wishlistId = button.dataset.wishlistId;
const externalVariantId = button.dataset.variantId;
const signal = {
signalType: "wishlistItemAdded",
name: "Wishlist add from product page",
category: "Behavior",
effect: "positive",
productId: productId,
productName: productName,
productCategory: productCategory,
currency: "USD"
};
if (price) signal.price = price;
if (wishlistId) signal.wishlistId = wishlistId;
if (externalVariantId) signal.externalVariantId = externalVariantId;
const email = window.dataLayer?.customerEmail;
if (email) {
signal.audience = { "Email": email };
}
TLT.logSignal(signal);
});
});
}
});
}Best practices
- Capture product data at the point of interaction, since it's usually only available on the page where the wishlist button lives.
- Use consistent
currencyvalues across signals for accurate revenue-adjacent segmentation. - Always include an identifier in
audiencewhere possible — wishlist activity is a strong intent signal worth attaching to a contact. - If your business doesn't display prices, omit
priceandcurrencyrather than sending placeholder values that could skew segmentation.
Troubleshooting
Signal not firing on wishlist add?
- Confirm the Connect library is initialized before
logSignalis called. - Check that
productIdis present — it's required and its absence discards the entire signal. - Verify the click handler is attached to the correct button variant if your site has multiple wishlist button styles.
Product data missing or incorrect?
- Confirm product attributes are present in the DOM at the time of the click.
- Verify
data-*attribute names match your site's HTML structure. - Use
console.log()to inspect the signal object before sending.
Contact not created or updated?
- Verify
audienceis a flat key-value object — if the format doesn't match, the contact will not be created or updated. - Confirm attribute key names match Connect exactly, including capitalization.
- Confirm the attribute value type matches the field type defined in Connect (text, number, Boolean, or date).
Updated about 2 hours ago
