Skip to content

References

Test

sh
npm install -D elevar-data-layer-types
sh
yarn add -D elevar-data-layer-types
sh
pnpm add -D elevar-data-layer-types
sh
bun add -D elevar-data-layer-types
sh
deno add -D npm:elevar-data-layer-types

Exports

ts
import { type RequireAtLeastOne, type ValueOf } from "type-fest";

/* ========================================================================== */

type ElevarConsentCategory =
  | "ad_storage"
  | "ad_user_data"
  | "ad_personalization"
  | "analytics_storage"
  | "functionality_storage"
  | "personalization_storage"
  | "security_storage";

export type ElevarConsent = Record<
  ElevarConsentCategory,
  RequireAtLeastOne<{ default: boolean; update: boolean }>
>;

export type ElevarContext = {
  user_properties: {
    user_id: string;
  };
  device: {
    screen_resolution: string;
    viewport_size: string;
    encoding: string;
    language: string;
    colors: string;
  };
  page: {
    title: string;
    raw_referrer: string;
  };
  marketing: (
    | { consent: Record<ElevarConsentCategory, boolean> }
    | { consent_v2: ElevarConsent }
  ) &
    Record<PropertyKey, unknown>;
};

export type ElevarUserProperties = Partial<{
  customer_first_name: string;
  customer_last_name: string;
  customer_phone: string;
  customer_city: string;
  customer_zip: string;
  customer_address_1: string;
  customer_address_2: string;
  customer_country: string;
  customer_country_code: string;
  customer_province: string;
  customer_province_code: string;
  customer_tags: string;
  customer_order_type: "new" | "returning";
  customer_order_count: string;
}> &
  (
    | {
        visitor_type: "logged_in";
        customer_id: string;
        customer_email: string;
      }
    | {
        visitor_type: "guest";
        customer_email?: string;
      }
  );

type ElevarSignUpEvent = {
  event: "dl_sign_up";
  user_properties: Extract<ElevarUserProperties, { visitor_type: "logged_in" }>;
};

type ElevarLoginEvent = {
  event: "dl_login";
  user_properties: Extract<ElevarUserProperties, { visitor_type: "logged_in" }>;
};

type ElevarUserDataEvent = {
  event: "dl_user_data";
  cart_total: string;
  user_properties: ElevarUserProperties;
  ecommerce: {
    currencyCode: string;
    cart_contents: {
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        quantity: string;
        list: string;
        product_id: string;
        variant_id: string;
        compare_at_price?: string;
        image: string | null;
      }>;
    };
  };
};

type ElevarViewItemListEvent = {
  event: "dl_view_item_list";
  ecommerce: {
    currencyCode: string;
    impressions: Array<{
      id: string;
      name: string;
      brand: string;
      category: string;
      variant: string;
      price: string;
      position: number;
      list: string;
      product_id: string;
      variant_id: string;
      compare_at_price?: string;
      image?: string;
    }>;
  };
};

type ElevarViewSearchResultsEvent = {
  event: "dl_view_search_results";
  ecommerce: {
    currencyCode: string;
    actionField: { list: "search results" };
    impressions: Array<{
      id: string;
      name: string;
      brand: string;
      category: string;
      price: string;
      position: number;
      list: string;
      product_id: string;
      variant_id: string;
    }>;
  };
};

type ElevarSelectItemEvent = {
  event: "dl_select_item";
  ecommerce: {
    currencyCode: string;
    click: {
      actionField: { list: string };
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        position: number;
        list: string;
        product_id: string;
        variant_id: string;
      }>;
    };
  };
};

type ElevarViewItemEvent = {
  event: "dl_view_item";
  ecommerce: {
    currencyCode: string;
    detail: {
      actionField: { list: string };
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        list: string;
        product_id: string;
        variant_id: string;
        compare_at_price: string;
        image: string | null;
      }>;
    };
  };
};

type ElevarAddToCartEvent = {
  event: "dl_add_to_cart";
  ecommerce: {
    currencyCode: string;
    add: {
      actionField: { list: string };
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        quantity: string;
        list: string;
        product_id: string;
        variant_id: string;
        compare_at_price?: string;
        image: string | null;
        url?: string;
      }>;
    };
  };
};

type ElevarViewCartEvent = {
  event: "dl_view_cart";
  cart_total: string;
  ecommerce: {
    currencyCode: string;
    actionField: { list: "Shopping Cart" };
    impressions: Array<{
      id: string;
      name: string;
      brand: string;
      category: string;
      variant: string;
      price: string;
      position: number;
      product_id: string;
      variant_id: string;
      quantity: string;
    }>;
  };
};

type ElevarRemoveFromCartEvent = {
  event: "dl_remove_from_cart";
  ecommerce: {
    currencyCode: string;
    remove: {
      actionField: { list: string };
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        quantity: string;
        list: string;
        product_id: string;
        variant_id: string;
        image: string | null;
      }>;
    };
  };
};

type ElevarCheckoutStepEventBase = {
  event_id?: string;
  user_properties: ElevarUserProperties;
  ecommerce: {
    currencyCode: string;
    checkout: {
      actionField: {
        step: "1" | "2" | "3" | "4";
        shipping_tier?: string;
      };
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        quantity: string;
        list: string;
        product_id: string;
        variant_id: string;
        image: string;
        url: string;
        selling_plan_name: string;
      }>;
    };
  };
};

type ElevarBeginCheckoutEvent = {
  event: "dl_begin_checkout";
} & ElevarCheckoutStepEventBase;

type ElevarAddContactInfoEvent = {
  event: "dl_add_contact_info";
} & ElevarCheckoutStepEventBase;

type ElevarAddShippingInfoEvent = {
  event: "dl_add_shipping_info";
} & ElevarCheckoutStepEventBase;

type ElevarAddPaymentInfoEvent = {
  event: "dl_add_payment_info";
} & ElevarCheckoutStepEventBase;

type ElevarPurchaseEvent = {
  event: "dl_purchase";
  user_properties: ElevarUserProperties;
  ecommerce: {
    currencyCode: string;
    purchase: {
      actionField: {
        id: string | number;
        order_name?: string;
        revenue: string;
        tax: string;
        shipping: string;
        coupon?: string;
        sub_total?: string;
        product_sub_total: string;
        discount_amount?: string;
        shipping_tier?: string;
        sales_channel?: string;
        physical_location_id?: string;
      };
      products: Array<{
        id: string;
        name: string;
        brand: string;
        category: string;
        variant: string;
        price: string;
        quantity: string;
        list: string;
        position: string;
        product_id: string;
        variant_id: string;
        image: string;
        discount_amount?: string;
        selling_plan_name?: string;
        cogs?: string;
      }>;
    };
  };
  marketing: { landing_site: string | null };
};

type ElevarSubscribeEvent = {
  event: "dl_subscribe";
} & (
  | {
      lead_type: "email";
      user_properties: {
        customer_email: string;
        customer_phone?: string;
      };
    }
  | {
      lead_type: "phone";
      user_properties: {
        customer_email?: string;
        customer_phone: string;
      };
    }
);

type ElevarCompleteQuizEvent = {
  event: "dl_complete_quiz";
  user_properties: ElevarUserProperties;
  event_properties: {
    quiz_result: string;
  };
};

type ElevarAddToWishlistEvent = {
  event: "dl_add_to_wishlist";
  user_properties: ElevarUserProperties;
  event_properties: {
    currencyCode: string;
    products: Array<{
      id: string;
      name: string;
      brand: string;
      category: string;
      variant: string;
      price: string;
      quantity: string;
      list: string;
      product_id: string;
      variant_id: string;
      compare_at_price?: string;
      image: string | null;
      url?: string;
    }>;
  };
};

type ElevarCustomizeItemEvent = {
  event: "dl_customize_item";
  user_properties: ElevarUserProperties;
  event_properties: {
    currencyCode: string;
    products: Array<{
      id: string;
      name: string;
      brand: string;
      category: string;
      variant: string;
      price: string;
      quantity: string;
      list: string;
      product_id: string;
      variant_id: string;
      compare_at_price?: string;
      image: string | null;
      url?: string;
    }>;
  };
};

type ElevarStartTrialEvent = {
  event: "dl_start_trial";
  user_properties: ElevarUserProperties;
  event_properties: {
    pltv: string;
    value: string;
    currency_code: string;
  };
};

type ElevarFindLocationEvent = {
  event: "dl_find_location";
  user_properties: ElevarUserProperties;
  event_properties: {
    store_location: string;
  };
};

type ElevarScheduleEvent = {
  event: "dl_schedule";
  user_properties: ElevarUserProperties;
  event_properties: {
    value: string;
    currency_code: string;
  };
};

export type ElevarEventMap = {
  dl_sign_up: ElevarSignUpEvent;
  dl_login: ElevarLoginEvent;
  dl_user_data: ElevarUserDataEvent;
  dl_view_item_list: ElevarViewItemListEvent;
  dl_view_search_results: ElevarViewSearchResultsEvent;
  dl_select_item: ElevarSelectItemEvent;
  dl_view_item: ElevarViewItemEvent;
  dl_add_to_cart: ElevarAddToCartEvent;
  dl_view_cart: ElevarViewCartEvent;
  dl_remove_from_cart: ElevarRemoveFromCartEvent;
  dl_begin_checkout: ElevarBeginCheckoutEvent;
  dl_add_contact_info: ElevarAddContactInfoEvent;
  dl_add_shipping_info: ElevarAddShippingInfoEvent;
  dl_add_payment_info: ElevarAddPaymentInfoEvent;
  dl_purchase: ElevarPurchaseEvent;
  dl_subscribe: ElevarSubscribeEvent;
  dl_complete_quiz: ElevarCompleteQuizEvent;
  dl_add_to_wishlist: ElevarAddToWishlistEvent;
  dl_customize_item: ElevarCustomizeItemEvent;
  dl_start_trial: ElevarStartTrialEvent;
  dl_find_location: ElevarFindLocationEvent;
  dl_schedule: ElevarScheduleEvent;
};

export type ElevarEvent = ValueOf<ElevarEventMap>;

Keys Set

ts
interface Window {
  ElevarDebugMode?: (isEnabled: boolean) => Promise<void>;
  ElevarInvalidateContext?: () => Promise<void>;
  ElevarClearStorage?: () => Promise<void>;
  ElevarDataLayer?: Array<import("./exports").ElevarEvent>;
  ElevarConsent?: Array<import("./exports").ElevarConsent>;
}

Keys Read

ts
interface Window {
  ElevarUserIdFn?: () => string | Promise<string>;
  ElevarMarketIdFn?: () => string | Promise<string>;
  ElevarTransformFn?: <T extends import("./exports").ElevarEvent>(item: T) => T;
  ElevarForwardFn?: (args: {
    url: string;
    params: URLSearchParams;
    mergedItems: import("./exports").ElevarEvent;
  }) => void | Promise<void>;
  ElevarContextFn?: (context: import("./exports").ElevarContext) => void;
}

Example Utility

ts
type ElevarItem = NonNullable<(typeof window)["ElevarDataLayer"]>[0];

export const pushToElevarDataLayer = (item: ElevarItem) => {
  window.ElevarDataLayer = window.ElevarDataLayer ?? [];
  window.ElevarDataLayer.push(item);
};