RekomiRekomiBlogPricing
Rekomi Docs
Rekomi Docs
Welcome to Rekomi
Quickstart for brandsPlans and trialsIntegrationsStripe Connect (sales tracking)Organization settingsTeam managementNotifications
Install tracking

Payment platforms

Install on StripeStripe Marketplace appInstall on PaddleInstall on BraintreeInstall on ShopifyInstall on Lemon SqueezyInstall on ChargebeeInstall on PolarInstall on RecurlyInstall on GumroadInstall on CreemInstall on Dodo PaymentsS2S API (any gateway)

Membership and course platforms

Install on MemberstackInstall on OutsetaInstall on PodiaInstall on TeachableInstall on Thinkific

Newsletter and creator platforms

Install on GhostInstall on beehiivInstall on Kit (ConvertKit)

Site builders

Install on WordPressInstall on WebflowInstall on FramerInstall on SquarespaceInstall on WixInstall on BubbleInstall on Carrd

Frameworks

Install on Vanilla JavaScriptInstall on Next.js App RouterInstall on Next.js Pages RouterInstall on React (Vite, CRA, Remix)Install on VueInstall on RailsInstall on Django

Campaigns and commissions

CampaignsCommission modelsPay per click or lead (CPC & CPL)Coupon-code attributionSub-affiliate recruitingTracking and attribution

Affiliates

Recruit affiliatesManage affiliatesAI co-pilotApply to the curated network

Money flow

SalesPayoutsMulti-currencyTax formsReports

Email

Sending domainBroadcasts
For brandsInstall tracking
|Brands|

Install on Webflow

Site settings Head code for the global install. Then either Webflow Ecommerce Order Confirmation snippet, or Stripe Payment Links MutationObserver for external checkouts.

Webflow has two billing patterns Rekomi attributes against: Webflow's native Ecommerce checkout (rare for SaaS, common for DTC) and external Stripe Payment Links (the common SaaS pattern). Both share the same head install; the conversion-side step diverges.

Install the head script

In the Webflow Designer: gear icon (top-left) > Site settings > Custom code > Head code.

Paste:

<script>
  (function(){
    var s=document.createElement('script');
    s.src='https://js.rekomi.com/v1/rekomi.js';
    s.async=true;
    s.dataset.programId='YOUR_PROGRAM_ID';
    document.head.appendChild(s);
  })();
</script>

Click Save changes, then Publish the site to push the change to all pages. Your program ID is in Rekomi at Settings > Tracking.

Path A: Webflow Ecommerce (native checkout)

If you sell via Webflow's built-in Ecommerce module:

Step 1. In the Pages panel, open Ecommerce pages > Order Confirmation.

Step 2. Drag an Embed element into the page body.

Step 3. Paste the convert snippet:

<script>
  (function(){
    // Webflow Ecommerce does not expose order data as Liquid-style tokens.
    // Pull from the rendered DOM. The order id sits on a data attribute;
    // the email is in the order summary text.
    var orderId = document.querySelector('[data-wf-order-id]')?.getAttribute('data-wf-order-id') || '';
    var emailEl = document.querySelector('[data-wf-order-email]');
    var email = emailEl ? emailEl.textContent.trim() : '';
    // Amount comes from your order summary; replace 9900 with your read logic
    // OR fall back to firing convert from a Webflow Ecommerce webhook (cleaner).
    window.Rekomi && window.Rekomi.convert({
      external_event_id: orderId,
      amount_cents: 9900,
      currency: 'USD',
      customer_email: email,
    });
  })();
</script>

Webflow Ecommerce does NOT expose order data as Liquid tokens (unlike Shopify). You parse from the rendered DOM, or — more reliably — fire convert server-side from a Webflow Ecommerce webhook (Settings > Ecommerce > Webhooks > order_created) and forward to Rekomi's /api/tracking/s2s.

Path B: External Stripe Payment Links

If your Webflow site is purely marketing and your checkout is buy.stripe.com/... URLs (the common SaaS shape):

Step 1. In Site settings > Custom code > Head code, paste the MutationObserver snippet AS A SECOND BLOCK after the install snippet:

<script>
  (function(){
    function stamp(node){
      var links = node.querySelectorAll('a[href*="buy.stripe.com"]');
      var ref = window.Rekomi && window.Rekomi.getReferral();
      if (!ref) return;
      links.forEach(function(a){
        try {
          var u = new URL(a.href);
          if (!u.searchParams.get('client_reference_id')) {
            u.searchParams.set('client_reference_id', ref);
            a.href = u.toString();
          }
        } catch (e) {}
      });
    }
    document.addEventListener('DOMContentLoaded', function(){ stamp(document); });
    new MutationObserver(function(muts){
      muts.forEach(function(m){ m.addedNodes.forEach(function(n){
        if (n.nodeType === 1) stamp(n);
      }); });
    }).observe(document.body, { childList: true, subtree: true });
  })();
</script>

Step 2. Republish the site. The observer auto-appends ?client_reference_id=<affiliate> to every buy.stripe.com link in your Webflow site, including links rendered inside Webflow Interactions or modals.

When the buyer completes the Stripe checkout, Stripe fires its webhook to Rekomi and the conversion attributes.

Webflow Membership pages

The head script in Site settings loads globally, including on Webflow Membership-gated pages. No extra step needed for member-only content.

Quirks worth knowing

No Liquid templating in Webflow Ecommerce. Webflow does not expose order data as template tokens the way Shopify does. The DOM-parse approach (Path A) is brittle; the Ecommerce webhook approach is more reliable for production. If you sell more than a handful of orders per month via Webflow Ecommerce, plan to migrate to the webhook path.

Publish is explicit. Saving Site settings does NOT push to production. You have to click Publish after every change to Custom code.

Webflow CMS vs Ecommerce. CMS pages (blog, dynamic content) inherit the global head install automatically. Ecommerce-specific pages (Order Confirmation, Cart) also inherit it; you only need to add the conversion-fire Embed to the Order Confirmation page.

Custom Code character limits. Webflow's Site settings > Custom code has a character limit (around 10K). If you're installing multiple analytics scripts plus Rekomi, you might bump against it. Use a single combined <script> block.

Refunds

Webflow Ecommerce: subscribe to the order_refunded webhook in Settings > Ecommerce > Webhooks, forward to Rekomi's /api/tracking/refund. Stripe Payment Links: the Stripe webhook handles it automatically.

Troubleshooting

MutationObserver does not stamp Payment Links. The MutationObserver runs after DOMContentLoaded. If your Webflow Interactions render Payment Links DYNAMICALLY (modal opens > link appears), the observer should still catch them. Open DevTools and watch document.querySelector('a[href*="buy.stripe.com"]').href after clicking your CTA; the URL should include client_reference_id.

Order Confirmation page Embed not firing. Webflow Embeds need <script> tags wrapped exactly as above. Confirm the Embed element is set to "After page renders" execution mode if Webflow exposes that toggle.

Cookie missing on Webflow Membership pages. The head install loads globally; the cookie should be present. If a member's cookie is missing, they probably joined the member portal via a path that bypassed your public Webflow pages (a direct deep link to a member-only URL).

Related

  • JavaScript pixel reference
  • Install on Stripe — for the MutationObserver pattern in depth
  • S2S tracking API reference

Install on WordPress

WPCode plugin in the Header field. Block themes hid the Theme File Editor, so editing functions.php directly is not the modern path.

Install on Framer

The head slot lives behind "Show Advanced" in Site settings and many brands miss it. Publish is explicit. Free plan cannot ship custom code.

On this page

Install the head scriptPath A: Webflow Ecommerce (native checkout)Path B: External Stripe Payment LinksWebflow Membership pagesQuirks worth knowingRefundsTroubleshootingRelated