@se-studio/hubspot 17.2.1 → 17.3.0
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/CHANGELOG.md +17 -0
- package/README.md +20 -4
- package/dist/tracking/HubSpotAnalyticsAdapter.d.ts +18 -1
- package/dist/tracking/HubSpotAnalyticsAdapter.d.ts.map +1 -1
- package/dist/tracking/HubSpotAnalyticsAdapter.js +54 -0
- package/dist/tracking/HubSpotAnalyticsAdapter.js.map +1 -1
- package/docs/llms.md +2 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @se-studio/hubspot
|
|
2
2
|
|
|
3
|
+
## 17.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 7415484: Add a shared analytics consent helper and make GTM / HubSpot adapters consent-aware.
|
|
8
|
+
|
|
9
|
+
`resolveAnalyticsConsent` / `createConsentGetter` read a site-supplied source plus optional Global Privacy Control and Do Not Track (both off by default). `HubSpotAnalyticsAdapter` skips the tracking script and `_hsq` events while `getConsent` is false, and pushes `doNotTrack` on a mid-session deny. `ConsentAwareAdapter` vendor sync (`updateConsent` / late initialize) is **opt-in** via `{ syncConsent: true }` and forwards **analytics only** (never advertising).
|
|
10
|
+
|
|
11
|
+
**GTM Consent Mode (Array → Arguments):** `GoogleTagManagerAdapter` now issues real `gtag('consent', …)` commands (an Arguments object, flushed before `gtm.js` / gtag.js). GA4-only setups (`measurementId`) also send `gtag('js')` and `config` as Arguments. Consent Mode `default` is pushed **only when `consentDefault` is set**; otherwise the adapter does not grant `ad_*` keys, and denying or undecided visitors never get advertising `granted` from the adapter.
|
|
12
|
+
|
|
13
|
+
Sites using Orejime now have Google tags respect denied consent. Sites without a CMP integration are unchanged. GA4 and Ads volumes may drop where those denies start to apply. Sites that do not load GTM via this adapter are unaffected. HubSpot script gating does not change unless a site passes `getConsent` / `{ syncConsent: true }`.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [7415484]
|
|
18
|
+
- @se-studio/core-ui@1.34.0
|
|
19
|
+
|
|
3
20
|
## 17.2.1
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -26,19 +26,35 @@ pnpm add @se-studio/hubspot
|
|
|
26
26
|
## Analytics (with GTM)
|
|
27
27
|
|
|
28
28
|
```tsx
|
|
29
|
-
import { AnalyticsPageTracker, AnalyticsProvider, CompositeAnalyticsAdapter, ConsentAwareAdapter, GoogleTagManagerAdapter } from '@se-studio/core-ui';
|
|
29
|
+
import { AnalyticsPageTracker, AnalyticsProvider, CompositeAnalyticsAdapter, ConsentAwareAdapter, GoogleTagManagerAdapter, createConsentGetter } from '@se-studio/core-ui';
|
|
30
30
|
import { AbTestReporter } from '@se-studio/ab-testing/components';
|
|
31
31
|
import { HubSpotAnalyticsAdapter, createHubSpotBootstrapScript } from '@se-studio/hubspot';
|
|
32
32
|
import Script from 'next/script';
|
|
33
33
|
|
|
34
|
+
const hasConsent = createConsentGetter({
|
|
35
|
+
model: 'opt-out',
|
|
36
|
+
honorGlobalPrivacyControl: true,
|
|
37
|
+
honorDoNotTrack: true,
|
|
38
|
+
source: () => /* site cookie / CMP; undefined = model default */ undefined,
|
|
39
|
+
});
|
|
40
|
+
|
|
34
41
|
const adapter = new ConsentAwareAdapter(
|
|
35
42
|
new CompositeAnalyticsAdapter([
|
|
36
|
-
new GoogleTagManagerAdapter({
|
|
37
|
-
|
|
43
|
+
new GoogleTagManagerAdapter({
|
|
44
|
+
containerId: process.env.GTM_TAG!,
|
|
45
|
+
// omit consentDefault when a CMP owns Consent Mode; set only for adapter-owned default
|
|
46
|
+
consentDefault: 'granted',
|
|
47
|
+
}),
|
|
48
|
+
new HubSpotAnalyticsAdapter({
|
|
49
|
+
portalId: process.env.HUBSPOT_PORTAL_ID!,
|
|
50
|
+
getConsent: hasConsent,
|
|
51
|
+
}),
|
|
38
52
|
]),
|
|
39
53
|
'analytics',
|
|
40
|
-
hasConsent,
|
|
54
|
+
() => hasConsent(),
|
|
55
|
+
{ syncConsent: true },
|
|
41
56
|
);
|
|
57
|
+
adapter.initialize();
|
|
42
58
|
|
|
43
59
|
// layout.tsx — before HubSpot script loads (no args = SSG-safe; uses window.location.pathname)
|
|
44
60
|
<Script id="hubspot-bootstrap" strategy="beforeInteractive"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AnalyticsAdapter, ClickTrackingProperties, PageTrackingProperties } from '@se-studio/core-ui';
|
|
1
|
+
import type { AnalyticsAdapter, AnalyticsConsentState, ClickTrackingProperties, PageTrackingProperties } from '@se-studio/core-ui';
|
|
2
2
|
declare global {
|
|
3
3
|
interface Window {
|
|
4
4
|
_hsq?: unknown[][];
|
|
@@ -10,12 +10,29 @@ export interface HubSpotAnalyticsAdapterConfig {
|
|
|
10
10
|
eventNameMap?: Record<string, string>;
|
|
11
11
|
/** Default behavioural event for trackClick when trackingInfo has no event name. */
|
|
12
12
|
defaultClickEventName?: string;
|
|
13
|
+
/**
|
|
14
|
+
* When provided, `initialize()` does not inject the HubSpot script and
|
|
15
|
+
* `track*` does not push `_hsq` events while this returns false.
|
|
16
|
+
* Omit it for unchanged behaviour (script loads, events fire).
|
|
17
|
+
*/
|
|
18
|
+
getConsent?: () => boolean;
|
|
13
19
|
}
|
|
14
20
|
export declare class HubSpotAnalyticsAdapter implements AnalyticsAdapter {
|
|
15
21
|
private initialized;
|
|
16
22
|
private readonly config;
|
|
23
|
+
/** Last explicit `updateConsent` analytics flag. Default allow when unset. */
|
|
24
|
+
private allowedFromUpdate;
|
|
25
|
+
private doNotTrackSent;
|
|
17
26
|
constructor(config: HubSpotAnalyticsAdapterConfig);
|
|
27
|
+
private isAllowed;
|
|
28
|
+
private sendDoNotTrack;
|
|
18
29
|
initialize(): void;
|
|
30
|
+
/**
|
|
31
|
+
* `analytics: false` pushes HubSpot `doNotTrack` and blocks later events.
|
|
32
|
+
* `analytics: true` allows `initialize()` to load the script on a later grant.
|
|
33
|
+
*/
|
|
34
|
+
updateConsent(consent: AnalyticsConsentState): void;
|
|
35
|
+
private guardEvent;
|
|
19
36
|
trackPage(_url: string, properties: PageTrackingProperties): void;
|
|
20
37
|
trackEvent(event: string, properties: Record<string, unknown>): void;
|
|
21
38
|
trackClick(properties: ClickTrackingProperties): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubSpotAnalyticsAdapter.d.ts","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;KACpB;CACF;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oFAAoF;IACpF,qBAAqB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"HubSpotAnalyticsAdapter.d.ts","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;KACpB;CACF;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oFAAoF;IACpF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;CAC5B;AA8BD,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,8EAA8E;IAC9E,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,cAAc,CAAS;IAE/B,YAAY,MAAM,EAAE,6BAA6B,EAEhD;IAED,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,cAAc;IAQtB,UAAU,IAAI,IAAI,CA2BjB;IAED;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAgBlD;IAED,OAAO,CAAC,UAAU;IAQlB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAMhE;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAgBnE;IAED,UAAU,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAwBpD;CACF"}
|
|
@@ -21,13 +21,32 @@ function getHubspotEventName(event, properties, eventNameMap) {
|
|
|
21
21
|
export class HubSpotAnalyticsAdapter {
|
|
22
22
|
initialized = false;
|
|
23
23
|
config;
|
|
24
|
+
/** Last explicit `updateConsent` analytics flag. Default allow when unset. */
|
|
25
|
+
allowedFromUpdate = true;
|
|
26
|
+
doNotTrackSent = false;
|
|
24
27
|
constructor(config) {
|
|
25
28
|
this.config = config;
|
|
26
29
|
}
|
|
30
|
+
isAllowed() {
|
|
31
|
+
if (this.config.getConsent) {
|
|
32
|
+
return this.config.getConsent();
|
|
33
|
+
}
|
|
34
|
+
return this.allowedFromUpdate;
|
|
35
|
+
}
|
|
36
|
+
sendDoNotTrack() {
|
|
37
|
+
if (this.doNotTrackSent || !this.initialized) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
pushHsq(['doNotTrack']);
|
|
41
|
+
this.doNotTrackSent = true;
|
|
42
|
+
}
|
|
27
43
|
initialize() {
|
|
28
44
|
if (typeof window === 'undefined' || this.initialized) {
|
|
29
45
|
return;
|
|
30
46
|
}
|
|
47
|
+
if (!this.isAllowed()) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
31
50
|
const { portalId } = this.config;
|
|
32
51
|
if (!portalId) {
|
|
33
52
|
return;
|
|
@@ -43,12 +62,44 @@ export class HubSpotAnalyticsAdapter {
|
|
|
43
62
|
document.head.appendChild(script);
|
|
44
63
|
}
|
|
45
64
|
this.initialized = true;
|
|
65
|
+
this.doNotTrackSent = false;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* `analytics: false` pushes HubSpot `doNotTrack` and blocks later events.
|
|
69
|
+
* `analytics: true` allows `initialize()` to load the script on a later grant.
|
|
70
|
+
*/
|
|
71
|
+
updateConsent(consent) {
|
|
72
|
+
if (consent.analytics === undefined) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.allowedFromUpdate = consent.analytics;
|
|
76
|
+
if (!consent.analytics) {
|
|
77
|
+
this.sendDoNotTrack();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.doNotTrackSent = false;
|
|
81
|
+
if (!this.initialized) {
|
|
82
|
+
this.initialize();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
guardEvent() {
|
|
86
|
+
if (!this.isAllowed()) {
|
|
87
|
+
this.sendDoNotTrack();
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
46
91
|
}
|
|
47
92
|
trackPage(_url, properties) {
|
|
93
|
+
if (!this.guardEvent()) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
48
96
|
pushHsq(['setPath', properties.pathname]);
|
|
49
97
|
pushHsq(['trackPageView']);
|
|
50
98
|
}
|
|
51
99
|
trackEvent(event, properties) {
|
|
100
|
+
if (!this.guardEvent()) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
52
103
|
const hubspotEventName = getHubspotEventName(event, properties, this.config.eventNameMap);
|
|
53
104
|
if (!hubspotEventName) {
|
|
54
105
|
return;
|
|
@@ -62,6 +113,9 @@ export class HubSpotAnalyticsAdapter {
|
|
|
62
113
|
]);
|
|
63
114
|
}
|
|
64
115
|
trackClick(properties) {
|
|
116
|
+
if (!this.guardEvent()) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
65
119
|
const hubspotEventName = properties.trackingInfo?.trackingEventName?.trim() || this.config.defaultClickEventName;
|
|
66
120
|
if (!hubspotEventName) {
|
|
67
121
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubSpotAnalyticsAdapter.js","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"HubSpotAnalyticsAdapter.js","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"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"}
|
package/docs/llms.md
CHANGED
|
@@ -56,6 +56,8 @@ After HubSpot form editor changes, revalidate: `revalidateTag(hubspotFormTag(for
|
|
|
56
56
|
|
|
57
57
|
Use with `CompositeAnalyticsAdapter` + `AnalyticsPageTracker` from `@se-studio/core-ui`. HubSpot SPA Mode B: bootstrap `setPath` before script load; `AnalyticsPageTracker` skips first mount.
|
|
58
58
|
|
|
59
|
+
Consent: pass `getConsent` on `HubSpotAnalyticsAdapter`. While it returns false, `initialize()` does not inject the tracking script and `track*` does not push `_hsq` events. A mid-session deny (`updateConsent({ analytics: false })` or `ConsentAwareAdapter` with `{ syncConsent: true }`) pushes `_hsq doNotTrack`. Omit `getConsent` and leave wrapper sync off for unchanged behaviour. Helper: `createConsentGetter` / `resolveAnalyticsConsent` in `@se-studio/core-ui`.
|
|
60
|
+
|
|
59
61
|
**SSG layouts:** call `createHubSpotBootstrapScript()` with **no args** in root layout. Do **not** use `headers()` or middleware to pass pathname — that breaks on-demand SSG routes in `next start`.
|
|
60
62
|
|
|
61
63
|
## Env
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/hubspot",
|
|
3
|
-
"version": "17.
|
|
3
|
+
"version": "17.3.0",
|
|
4
4
|
"description": "HubSpot tracking and API-driven form rendering for Next.js marketing sites",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
],
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"@se-studio/core-data-types": "1.13.7",
|
|
44
|
-
"@se-studio/core-ui": "1.
|
|
44
|
+
"@se-studio/core-ui": "1.34.0",
|
|
45
45
|
"next": ">=15.5.0 <17",
|
|
46
46
|
"react": "^19.0.0",
|
|
47
47
|
"react-dom": "^19.0.0"
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@biomejs/biome": "^2.5.12",
|
|
56
56
|
"@se-studio/core-data-types": "1.13.7",
|
|
57
|
-
"@se-studio/core-ui": "1.
|
|
57
|
+
"@se-studio/core-ui": "1.34.0",
|
|
58
58
|
"@types/node": "^24.13.3",
|
|
59
59
|
"@types/react": "^19.2.18",
|
|
60
60
|
"@types/react-dom": "^19.2.5",
|