Core Package Examples#

Use these curated examples to ship Pulsora faster in real projects.

Vanilla JavaScript#

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Pulsora Demo</title>
  </head>
  <body>
    <button id="cta">Sign up</button>

    <script
      async
      src="https://cdn.pulsora.co/v1/pulsora.min.js"
      data-token="pub_123"
      data-debug="true"
    ></script>
    <script>
      window.addEventListener('load', () => {
        document.getElementById('cta')?.addEventListener('click', () =>
          window.pulsora.event('signup_click', {
            variant: 'primary',
          }),
        );
      });
    </script>
  </body>
</html>

React (without @pulsora/react)#

import { useEffect } from 'react';
import { Pulsora } from '@pulsora/core';

const pulsora = new Pulsora();

export function App() {
  useEffect(() => {
    pulsora.init({ apiToken: 'pub_123' });
    pulsora.pageview();
  }, []);

  return (
    <button onClick={() => pulsora.event('cta_click')}>Get Started</button>
  );
}

Next.js App Router#

// app/providers.tsx
'use client';

import { Pulsora } from '@pulsora/core';
import { useEffect } from 'react';
import { usePathname, useSearchParams } from 'next/navigation';

const pulsora = new Pulsora();

export function AnalyticsProvider({ children }: { children: React.ReactNode }) {
  const pathname = usePathname();
  const params = useSearchParams();

  useEffect(() => {
    pulsora.init({
      apiToken: process.env.NEXT_PUBLIC_PULSORA_TOKEN!,
    });
  }, []);

  useEffect(() => {
    pulsora.pageview({
      url: `${window.location.origin}${pathname}?${params.toString()}`,
    });
  }, [pathname, params]);

  return <>{children}</>;
}

Vue 3 Composition API#

// src/plugins/pulsora.ts
import { Pulsora } from '@pulsora/core';
import { onMounted, watch } from 'vue';
import { useRoute } from 'vue-router';

export function usePulsora() {
  const pulsora = new Pulsora();
  const route = useRoute();

  onMounted(() => {
    pulsora.init({ apiToken: 'pub_123' });
  });

  watch(
    () => route.fullPath,
    () => pulsora.pageview(),
    { immediate: true },
  );

  return pulsora;
}

Passing Metadata to a Checkout#

// Browser
const fingerprint = await pulsora.getVisitorFingerprint();
const sessionId = pulsora.getSessionId();

await fetch('/api/checkout', {
  method: 'POST',
  body: JSON.stringify({
    plan: 'pro',
    visitor_fingerprint: fingerprint,
    session_id: sessionId,
  }),
});
// Server (Node.js)
import { Revenue } from '@pulsora/revenue';

const revenue = new Revenue({
  apiToken: process.env.PULSORA_SECRET!,
});

app.post('/webhooks/stripe', async (req, res) => {
  const session = req.body.data.object;

  await revenue.track({
    visitor_fingerprint: session.metadata.visitor_fingerprint,
    session_id: session.metadata.session_id,
    customer_id: session.customer,
    amount: session.amount_total / 100,
    currency: session.currency.toUpperCase(),
    transaction_id: session.id,
    payment_processor: 'stripe',
    event_type: 'purchase',
  });

  res.json({ received: true });
});

Looking for ready-made React hooks? Head over to the React package overview →