@asksable/site-connector 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,6 +9,7 @@ Use this package in public website repos that should:
9
9
  - read business/site profile data from Sable
10
10
  - submit contact forms into Sable
11
11
  - render the shared booking widget against Sable public booking APIs
12
+ - send web analytics into the separate `Sable Websites` PostHog project
12
13
 
13
14
  ## Setup
14
15
 
@@ -16,8 +17,7 @@ Wrap the site in `SableSiteProvider`:
16
17
 
17
18
  ```tsx
18
19
  import { SableSiteProvider } from '@asksable/site-connector'
19
-
20
- <SableSiteProvider
20
+ ;<SableSiteProvider
21
21
  config={{
22
22
  apiUrl: import.meta.env.VITE_SABLE_PUBLIC_API_URL,
23
23
  siteSlug: import.meta.env.VITE_SABLE_SITE_SLUG,
@@ -27,10 +27,59 @@ import { SableSiteProvider } from '@asksable/site-connector'
27
27
  </SableSiteProvider>
28
28
  ```
29
29
 
30
+ ## Website analytics
31
+
32
+ `SableSiteProvider` initializes PostHog automatically when the public
33
+ `/public/site-profile` response includes an enabled analytics config. This is
34
+ the preferred path because Sable can rotate the `Sable Websites` project token
35
+ centrally from Convex env vars without editing every customer website.
36
+
37
+ Website analytics is cookieless by default. The connector initializes PostHog
38
+ with `cookieless_mode: 'always'`, disables autocapture/session replay/surveys,
39
+ and only sends explicit pageview and booking conversion events. The first-party
40
+ pageview rollup beacon does not write an analytics visitor ID to cookies,
41
+ `localStorage`, or `sessionStorage`; Sable derives a daily visitor key
42
+ server-side from request metadata. The PostHog project must have Cookieless
43
+ server hash mode enabled or PostHog will ignore cookieless events.
44
+
45
+ If a standalone host needs to override the server-provided config, pass:
46
+
47
+ ```tsx
48
+ <SableSiteProvider
49
+ config={{
50
+ apiUrl,
51
+ siteSlug,
52
+ analytics: {
53
+ captureEnabled: true,
54
+ posthogToken: import.meta.env.VITE_SABLE_WEBSITES_POSTHOG_TOKEN,
55
+ posthogHost: 'https://us.i.posthog.com',
56
+ environment: import.meta.env.MODE,
57
+ },
58
+ }}
59
+ >
60
+ <App />
61
+ </SableSiteProvider>
62
+ ```
63
+
64
+ The connector captures `$pageview` events with `sable_site_slug`, normalized
65
+ `sable_source`, `sable_device_type`, and related site properties. It also sends
66
+ a first-party pageview beacon back to Sable so client-facing analytics can use
67
+ Convex rollups once the rollup window is fully covered. Booking-widget
68
+ conversion events include:
69
+
70
+ - `sable_booking_widget_viewed`
71
+ - `sable_booking_service_selected`
72
+ - `sable_booking_created`
73
+ - `sable_booking_payment_started`
74
+ - `sable_booking_rescheduled`
75
+
30
76
  Then consume the profile or render the shared booking widget:
31
77
 
32
78
  ```tsx
33
- import { BookingWidgetPanel, useSableSiteProfile } from '@asksable/site-connector'
79
+ import {
80
+ BookingWidgetPanel,
81
+ useSableSiteProfile,
82
+ } from '@asksable/site-connector'
34
83
  ```
35
84
 
36
85
  ## Exports
@@ -75,11 +124,11 @@ Supported locales: `'en'` (default), `'es'`. Adding a locale requires a package
75
124
 
76
125
  ### Three usage modes
77
126
 
78
- | Site type | Pattern |
79
- | --- | --- |
80
- | **Single-language site (English only)** | Omit `language` entirely or pass `'en'`. Widget defaults to English. |
81
- | **Single-language site (Spanish only)** | Pass `language: 'es'` once at provider mount. |
82
- | **Multi-language site with a toggle** | Pass a reactive value that updates when the toggle changes. The provider re-renders, the widget re-renders with the new locale. |
127
+ | Site type | Pattern |
128
+ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
129
+ | **Single-language site (English only)** | Omit `language` entirely or pass `'en'`. Widget defaults to English. |
130
+ | **Single-language site (Spanish only)** | Pass `language: 'es'` once at provider mount. |
131
+ | **Multi-language site with a toggle** | Pass a reactive value that updates when the toggle changes. The provider re-renders, the widget re-renders with the new locale. |
83
132
 
84
133
  ### Multi-language example
85
134
 
@@ -0,0 +1,19 @@
1
+ import type { Properties } from 'posthog-js';
2
+ import type { PublicSiteProfile, SableSiteAnalyticsConfig } from './types.js';
3
+ type SiteAnalyticsContext = {
4
+ apiUrl: string;
5
+ siteSlug: string;
6
+ siteId?: string;
7
+ siteName?: string;
8
+ businessName?: string;
9
+ environment?: string;
10
+ };
11
+ export declare function initializeSableSiteAnalytics({ config, siteProfile, context, }: {
12
+ config: SableSiteAnalyticsConfig | undefined;
13
+ siteProfile: PublicSiteProfile | null;
14
+ context: SiteAnalyticsContext;
15
+ }): Promise<boolean>;
16
+ export declare function captureSableSitePageview(context: SiteAnalyticsContext): void;
17
+ export declare function captureSableSiteEvent(event: string, properties: Properties | undefined, context: SiteAnalyticsContext): void;
18
+ export {};
19
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,UAAU,EAAE,MAAM,YAAY,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAS7E,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AA+GD,wBAAsB,4BAA4B,CAAC,EACjD,MAAM,EACN,WAAW,EACX,OAAO,GACR,EAAE;IACD,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAA;IAC5C,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACrC,OAAO,EAAE,oBAAoB,CAAA;CAC9B,oBA6DA;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,QAKrE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,oBAAoB,QAO9B"}
@@ -0,0 +1,170 @@
1
+ const INSTANCE_NAME = 'sableWebsites';
2
+ const DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';
3
+ let activeClient = null;
4
+ let activeKey = null;
5
+ function getBrowserPostHogInstance() {
6
+ if (typeof window === 'undefined')
7
+ return null;
8
+ const globalPostHog = window.posthog;
9
+ return globalPostHog?.[INSTANCE_NAME] ?? activeClient;
10
+ }
11
+ function cleanHost(value) {
12
+ return value?.trim().replace(/\/+$/, '') || DEFAULT_POSTHOG_HOST;
13
+ }
14
+ function normalizeApiUrl(value) {
15
+ return value.trim().replace(/\/+$/, '');
16
+ }
17
+ function sourceFromUrl(value) {
18
+ try {
19
+ const url = new URL(value);
20
+ return url.hostname.replace(/^www\./i, '').toLowerCase();
21
+ }
22
+ catch {
23
+ return '';
24
+ }
25
+ }
26
+ function getSourceLabel() {
27
+ if (typeof window === 'undefined')
28
+ return 'Direct';
29
+ const params = new URLSearchParams(window.location.search);
30
+ const utmSource = params.get('utm_source')?.trim();
31
+ if (utmSource)
32
+ return utmSource;
33
+ const referrer = document.referrer ? sourceFromUrl(document.referrer) : '';
34
+ if (referrer &&
35
+ referrer !== window.location.hostname.replace(/^www\./i, '')) {
36
+ return referrer;
37
+ }
38
+ return 'Direct';
39
+ }
40
+ function getDeviceType() {
41
+ if (typeof navigator === 'undefined')
42
+ return 'Desktop';
43
+ const userAgent = navigator.userAgent.toLowerCase();
44
+ if (/ipad|tablet/.test(userAgent))
45
+ return 'Tablet';
46
+ if (/mobi|android|iphone|ipod/.test(userAgent))
47
+ return 'Mobile';
48
+ return 'Desktop';
49
+ }
50
+ function getContextProperties(context) {
51
+ return {
52
+ sable_site_slug: context.siteSlug,
53
+ sable_site_id: context.siteId,
54
+ sable_site_name: context.siteName,
55
+ sable_business_name: context.businessName,
56
+ sable_environment: context.environment ?? 'production',
57
+ };
58
+ }
59
+ function getPageProperties(context) {
60
+ if (typeof window === 'undefined')
61
+ return getContextProperties(context);
62
+ return {
63
+ ...getContextProperties(context),
64
+ $current_url: window.location.href,
65
+ $host: window.location.host,
66
+ $pathname: window.location.pathname,
67
+ $referrer: document.referrer || undefined,
68
+ sable_pathname: window.location.pathname || '/',
69
+ sable_search: window.location.search || undefined,
70
+ sable_source: getSourceLabel(),
71
+ sable_device_type: getDeviceType(),
72
+ sable_title: document.title || undefined,
73
+ };
74
+ }
75
+ function recordSableSitePageviewRollup(context, properties) {
76
+ if (typeof window === 'undefined')
77
+ return;
78
+ const url = `${normalizeApiUrl(context.apiUrl)}/public/analytics/pageview`;
79
+ const body = JSON.stringify({
80
+ siteSlug: context.siteSlug,
81
+ path: properties.sable_pathname,
82
+ source: properties.sable_source,
83
+ device: properties.sable_device_type,
84
+ timestamp: Date.now(),
85
+ });
86
+ if (typeof navigator !== 'undefined' && 'sendBeacon' in navigator) {
87
+ const payload = new Blob([body], { type: 'application/json' });
88
+ if (navigator.sendBeacon(url, payload)) {
89
+ return;
90
+ }
91
+ }
92
+ void fetch(url, {
93
+ method: 'POST',
94
+ headers: {
95
+ 'Content-Type': 'application/json',
96
+ },
97
+ body,
98
+ keepalive: true,
99
+ }).catch(() => undefined);
100
+ }
101
+ export async function initializeSableSiteAnalytics({ config, siteProfile, context, }) {
102
+ if (typeof window === 'undefined')
103
+ return false;
104
+ const token = config?.posthogToken?.trim();
105
+ const captureEnabled = config?.captureEnabled === true && Boolean(token);
106
+ const client = getBrowserPostHogInstance();
107
+ if (!captureEnabled || !token) {
108
+ client?.set_config({
109
+ autocapture: false,
110
+ capture_dead_clicks: false,
111
+ capture_pageleave: false,
112
+ disable_session_recording: true,
113
+ });
114
+ if (client?.config.cookieless_mode !== 'always') {
115
+ client?.opt_out_capturing();
116
+ }
117
+ activeClient = client;
118
+ activeKey = null;
119
+ return false;
120
+ }
121
+ const host = cleanHost(config.posthogHost);
122
+ const environment = config.environment ?? context.environment ?? 'production';
123
+ const key = [
124
+ token,
125
+ host,
126
+ environment,
127
+ context.siteSlug,
128
+ siteProfile?.site._id ?? '',
129
+ ].join('|');
130
+ const posthogModule = await import('posthog-js');
131
+ const posthog = posthogModule.default;
132
+ const options = {
133
+ api_host: host,
134
+ defaults: '2026-01-30',
135
+ cookieless_mode: 'always',
136
+ autocapture: false,
137
+ capture_pageview: false,
138
+ capture_pageleave: false,
139
+ capture_dead_clicks: false,
140
+ opt_out_useragent_filter: environment === 'production',
141
+ person_profiles: 'never',
142
+ request_batching: environment === 'production',
143
+ disable_session_recording: true,
144
+ disable_surveys: true,
145
+ disable_product_tours: true,
146
+ };
147
+ if (activeKey === key && activeClient) {
148
+ activeClient.register(getContextProperties({ ...context, environment }));
149
+ return true;
150
+ }
151
+ posthog.init(token, options, INSTANCE_NAME);
152
+ activeClient = posthog[INSTANCE_NAME] ?? posthog;
153
+ activeKey = key;
154
+ activeClient.register(getContextProperties({ ...context, environment }));
155
+ return true;
156
+ }
157
+ export function captureSableSitePageview(context) {
158
+ const client = getBrowserPostHogInstance();
159
+ const properties = getPageProperties(context);
160
+ client?.capture('$pageview', properties);
161
+ recordSableSitePageviewRollup(context, properties);
162
+ }
163
+ export function captureSableSiteEvent(event, properties, context) {
164
+ const client = getBrowserPostHogInstance();
165
+ client?.capture(event, {
166
+ ...getPageProperties(context),
167
+ ...properties,
168
+ });
169
+ }
170
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { type ReactNode } from 'react';
2
1
  import './bones/registry.js';
2
+ import type { ReactNode } from 'react';
3
3
  /**
4
4
  * Pre-existing context required by reschedule mode. The host (or the
5
5
  * customer arriving via magic link) is moving an existing booking, so
@@ -1 +1 @@
1
- {"version":3,"file":"booking-widget.d.ts","sourceRoot":"","sources":["../src/booking-widget.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqH,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AASzJ,OAAO,qBAAqB,CAAA;AA6C5B;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB;;qBAEiB;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB;qCACiC;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB;;sBAEkB;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;yCACqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;oEACgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;IAC9B,iBAAiB,CAAC,EAAE,wBAAwB,CAAA;IAC5C;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC1B,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;KACnB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,cAAc,GAAG,iBAAiB,CAAA;IAC9E,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAKD,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,YAAY,EACZ,IAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,mBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,EAAE,kBAAkB,2CAkvEpB"}
1
+ {"version":3,"file":"booking-widget.d.ts","sourceRoot":"","sources":["../src/booking-widget.tsx"],"names":[],"mappings":"AAaA,OAAO,qBAAqB,CAAA;AAc5B,OAAO,KAAK,EAKV,SAAS,EACV,MAAM,OAAO,CAAA;AAuDd;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB;;qBAEiB;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB;qCACiC;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB;;sBAEkB;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;yCACqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;oEACgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;IAC9B,iBAAiB,CAAC,EAAE,wBAAwB,CAAA;IAC5C;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC1B,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;KACnB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,cAAc,GAAG,iBAAiB,CAAA;IAC9E,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAKD,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,YAAY,EACZ,IAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,mBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,EAAE,kBAAkB,2CA6tFpB"}