Crossdeck Docs
Dashboard

Crossdeck for Bubble — full setup guide

Setup Paste-key SDK install · identity, custom domain, revenue · ~5 min read · Updated August 4, 2026

Everything from install to identity to revenue. Install the Crossdeck plugin and it loads the Crossdeck web SDK on every page of your Bubble app — so page analytics, journeys, and front-end error impact start flowing with no code. The plugin is paste-key: you provision on Crossdeck, then paste two values into the plugin. This doc covers each step, plus the parts that need a decision from you: identity via a workflow action, a custom domain, and connecting a payment rail for revenue.

TL;DR

What the connector does

Install the Crossdeck plugin and it loads the Crossdeck web SDK on every page of your Bubble app via the plugin's Shared HTML header — so page analytics, journeys, and front-end error impact start flowing with no code and no per-page setup. Because Crossdeck joins identity, revenue, errors, and analytics on one identity graph, you can answer questions no single-layer tool can — for example, “which paying customers hit this error last week.”

Paste-key, not OAuth.

Unlike the Webflow connector (a one-click OAuth marketplace install), the Bubble plugin is paste-key: you provision keys on Crossdeck, then paste your Publishable key and App ID into the plugin. Same SDK, same dashboard — just a two-field install.

Step 1 — Install

A. Provision on Crossdeck

  1. In the Crossdeck dashboard — or by running crossdeck init in the Crossdeck CLI — create a project + app.
  2. Copy your Publishable key (starts cd_pub_) and your App ID (starts app_).

B. Install the plugin on your Bubble app

  1. In your Bubble editor, open the Plugins tab and add Crossdeck — Revenue, Identity & Error Analytics.

C. Paste your two values

  1. Open Plugins → Crossdeck.
  2. Paste your Publishable key into the Publishable key field and your App ID into the App ID field. That's it — the SDK loads on every page via the plugin's shared header.
No environment field — it's derived from the key.

There is deliberately no environment setting. The environment is read from the key prefix (cd_pub_test_… = sandbox, anything else = production), so it can never disagree with the key. Until both fields hold a valid cd_pub_ key, the plugin loads nothing — zero cost and a clean console.

Publishable key only.

The plugin holds only your publishable, ingest-only key (cd_pub_) — it cannot read or change your Crossdeck account. Never paste a secret or workspace key (cd_sk_ / cd_wk_). Provisioning happens on the Crossdeck engine, never in the Bubble app.

Step 2 — Verify it's working

Run your app (not just the editor preview) and click around. Crossdeck's first heartbeat auto-learns your app's origin. Then open the Crossdeck dashboard → Overview / People — you'll see a live visitor with geo, and the pages they viewed. (Data begins from the first real visit — that first heartbeat also locks your Allowed Origins to that domain.)

Nothing showing yet?

Check that both the Publishable key (cd_pub_…) and App ID (app_…) are entered, that you've run the app (not just previewed the editor), and that the environment you're viewing in the dashboard matches the app/key. The first heartbeat can take a few moments.

Step 3 — Custom domain

When you move to or add a custom domain, add it to your Allowed Origins — 20 seconds, and it pulls you into the dashboard:

Add a domain to your Allowed Origins

The origin lock happens on the first heartbeat — then it locks.

A Bubble app first served on *.bubbleapps.io learns that origin on its first heartbeat. It will not auto-learn a custom domain you add later — you must add the custom domain to your Allowed Origins yourself, or traffic from it won't be accepted.

Step 4 — Identity (resolve logged-in users)

Analytics works anonymously out of the box. To turn anonymous visitors into known people — the Crossdeck cross — Crossdeck needs your logged-in user's email. Bubble exposes Current User to workflows, not to arbitrary header JS, so identity is a workflow action, not header code. You add it once:

  1. In a workflow that fires when someone is signed in — the page's “Current User is logged in” event, or the step right after your Log the user in action — add Plugins → Crossdeck – Identify user.
  2. Set EmailCurrent User's email (required).
  3. Optionally set User IDCurrent User's unique id.

That's it. The action is idempotent, so it's safe to run on every page load; if no one is signed in it does nothing (no error). Signed-in users now resolve to known people in People. This mirrors the Webflow connector's identify() exactly.

Wire it into your sign-up & log-in workflows

Bubble's built-in User type already has email + password, so you don't need another plugin for auth. Add the Identify step to both entry points, so a person resolves the moment they sign up and every time they log back in:

  1. Sign-up workflow. On your Sign up button: Account → Sign the user up (Email = your email input's value, Password = your password input's value). Then add a next stepPlugins → Crossdeck – Identify user and set Email = Current User's email.
  2. Log-in workflow. On your Log in button: Account → Log the user in (same email + password inputs). Then add a next stepCrossdeck – Identify user and set Email = Current User's email.
  3. (Recommended) Every authenticated page load. On the page, add the event “Current User is logged in”Crossdeck – Identify userEmail = Current User's email. Idempotent, so re-running it costs nothing.
Always bind, never type.

Set the Email field with Insert dynamic data → Current User's email — never a hardcoded address. A typed literal identifies one fake person; Current User's email resolves the real signed-in user, which is the whole point.

Why email is the anchor.

Crossdeck keys identity on email — the no-backend join rail — so email always rides along as a trait to keep the identity graph joined. When you also provide a stable User ID (Current User's unique id), that id outranks email in Crossdeck's resolver and is used as the key. (See How identity works for the full model.)

Step 5 — Revenue (connect a payment rail)

To join revenue to those people:

  1. In the Crossdeck dashboard, open Developers → Rails (Payment rails).
  2. Connect Stripe (or Apple / Google) in one click — Crossdeck never asks for a raw secret key.
  3. Stamp the Crossdeck reference onto your checkout / subscription events so each payment threads back to the right person. See Rails → Stripe in the dashboard for the exact one-liner.

Once a rail is connected, revenue and entitlements join the same identity graph as your analytics and errors. (Sending revenue events is done from your Crossdeck account setup — not from the Bubble plugin.)

How this differs from the other connectors

Every connector loads the same Crossdeck SDK and feeds the same dashboard — only the install + identity binding differ per platform.


Crossdeck for Bubble — paste-key plugin install (Publishable key + App ID), SDK loaded on every page via the shared header, environment derived from the key prefix, custom-domain add via Allowed Origins, identity via the “Crossdeck – Identify user” workflow action, and revenue on a connected rail (August 4, 2026). Related: Identify users, Connect Stripe.

Using an AI assistant? Read this page as clean markdown — index.md — or the whole docs index at /docs/llms.txt.