Setup
<html>
<head> ... </head>
<body>
<!-- BEAM START -->
<script type="module" src="./beam-config.js"></script>
<script type="module" async crossorigin src="./beam-cart-setup.js"></script>
<!-- BEAM END -->
</body>
</html>
Base code
beam-config.liquid
(if using a template)
Replace the following in the example, including the {{ }}
Beam Version
SDK version (Latest version: latest) (See SDK Versions for more info)apiKey
Your Beam SDK API Key (string)chainId
Your Beam Chain ID (number)storeId
Your Beam Store ID (number)domain
Your website’s top-level domain (string, eg: “myshop.com”). If your site uses different subdomains between your public storefront and your checkout flow (ie: myshop.com and checkout.myshop.com), this setting allows for storing nonprofit selections between each subdomain.baseUrl
The Beam base server URL. This is optional unless you are using credentials for the Beam staging server
SDK v1.31.0+ (current)
beam-config.js
import { init } from "https://sdk.beamimpact.com/web-sdk/{{ sdk_version }}/dist/integrations/beam.js"
import { StatsigPlugin } from "https://sdk.beamimpact.com/web-sdk/{{ sdk_version }}/dist/integrations/statsig.js"
const beam = await init({
apiKey: "{{ storefront_component_api_key }}", // i.e., "abc123.xyz456"
chainId: {{ chain_id }}, // i.e., 1000
storeId: {{ store_id }}, // i.e., 50000
domain: "{{ domain }}", // i.e., "pets.com"
// Base URL is optional - it is used to change to a staging server
baseUrl: "{{ base_url }}",
plugins: [
new StatsigPlugin({ statsigApiKey: "{{ statsig_api_key }}" })
], // Beam Plugins, such as Statsig (see documentation)
});
Reading config values in other snippets / Liquid code:
import { getConfig } from "https://sdk.beamimpact.com/web-sdk/{{ sdk_version }}/dist/integrations/beam.js"
const beam = getConfig(); // Reads the config values set by init()
Async initialization for plugins that take time to load, like Statsig:
// Use one of the following methods to wait for async Beam plugins:
// The Beam object has a Promise that can be awaited:
await beam.readyPromise;
// Instead of the Promise, you can use event listeners:
if (beam.status !== "ready") {
beam.addEventListener("beamstatuschange", (event) => {
const status = event.detail.status;
if (status === "ready") doSomething(beam);
else if (status === "error") handleError(event.detail.error);
});
}
SDK before v1.31.0
Older versions of the SDK do not have the init/getConfig system and require additional code below:
// beam-config.js
window.BeamImpact = {
...(window.BeamImpact || {}),
apiKey: "{{ storefront_component_api_key }}",
chainId: {{ chain_id }},
storeId: {{ store_id }},
storeTopDomain: "{{ domain }}",
baseUrl: "{{ base_url }}",
logUrl: "https://production.beamimpactlogs.com",
initialized: false,
awaitable: Promise.resolve(true),
logEvent: async (eventName, value, metadata = {}) => {
console.debug("🚀 Beam event logged", eventName, value, metadata);
},
};