--- name: croct-integrate-platforms description: >- Use when connecting Croct to a third-party platform or migrating to Croct from another personalization or experimentation tool. Covers Storyblok (Optimize by Croct app, @croct/plug-storyblok, Storyblok withCroct, resolveContent, croct/plug-storyblok, CroctStoriesApi), Sanity and Strapi (slot fallback, dynamic zones, metadata.contentSource), Shopify Hydrogen storefront events, Shopify custom pixel (croctPixel, PUBLIC_CROCT_SHOPIFY_PIXEL, checkout and order tracking), VTEX, Google Tag Manager data layer, Microsoft Clarity tags, HubSpot forms (hbspt.forms.create, hs-form-event), firmographic providers 6sense, Demandbase, Clearbit Reveal, and ZoomInfo WebSights (firmographics attributes, account-based audiences in CQL), and migrations from Mutiny and Ninetailed (Experience component, Contentful sunset). Triggers include cdn.croct.io/plug-integration scripts, "personalize Storyblok blocks", "track Shopify checkout", "send VTEX events", "ABM personalization", "replace Mutiny". --- # Croct platform integrations and migrations Every integration here sits on top of a working Croct SDK. They either **feed data in** (events, profile attributes), **send Croct data out** (Clarity), or **render slot content inside a platform's content** (CMS, HubSpot form ID). Migrations replace another tool's flags or experiences with slots. ## Pick the integration | Platform / goal | What the integration does | Install method | Reference | |-------------------------------------|-------------------------------------------------------------------------------------------|-------------------------------------------------|-------------------------------| | Storyblok | Optimize app links blocks to slots; SDK swaps linked blocks during story fetches (JS, PHP) | Storyblok app + `croct init` or `@croct/plug-storyblok` / `croct/plug-storyblok` | [storyblok.md](references/storyblok.md) | | Sanity | Slot fetch with Sanity content as `fallback`; no Croct package | `croct init` + `fetchContent` | [headless-cms.md](references/headless-cms.md) | | Strapi | Maps dynamic zone components to slots via a mapping slot | `croct init` + `fetchContent` | [headless-cms.md](references/headless-cms.md) | | Shopify Hydrogen | Automatic storefront events, customer identification; SDK usage lives in the `croct-integrate-sdk` skill | `croct init` (Hydrogen SDK) | [ecommerce.md](references/ecommerce.md) | | Shopify checkout / orders (Liquid or Hydrogen) | Custom pixel tracks `checkoutStarted`, `orderPlaced`, plus custom events | Storefront plugin + Shopify custom pixel | [ecommerce.md](references/ecommerce.md) | | Shopify Liquid theme | JavaScript SDK for content; GTM integration for events; pixel for checkout | Script tags | [ecommerce.md](references/ecommerce.md) | | VTEX Store Framework (VTEX IO) | Forwards store events as goals and e-commerce events; enriches profiles | `vtex.js` script or GTM | [ecommerce.md](references/ecommerce.md) | | Google Tag Manager / GA4 data layer | Forwards recommended data layer events as goals and e-commerce events | `google-tag-manager.js` script or GTM | [analytics-and-crm.md](references/analytics-and-crm.md) | | Microsoft Clarity | Tags Clarity sessions with Croct experiences, audiences, experiment variants | `clarity.js` script or GTM | [analytics-and-crm.md](references/analytics-and-crm.md) | | HubSpot forms | Submission goals, profile enrichment, form ID served from a slot for tests | Code around the HubSpot embed | [analytics-and-crm.md](references/analytics-and-crm.md) | | 6sense, Demandbase | Write rich `firmographics` attributes to the profile | Croct script or GTM | [firmographics.md](references/firmographics.md) | | Clearbit Reveal, ZoomInfo WebSights | Write company attributes to the profile via code you add | GTM Custom HTML | [firmographics.md](references/firmographics.md) | | Migrating from Mutiny, Ninetailed | Concept mapping and step-by-step replacement with slots, audiences, experiments | `croct init` + per-area slots | [migrations.md](references/migrations.md) | Read only the reference for the platform at hand. If the platform is not listed, the docs have no dedicated integration: say so and check `https://docs.croct.com/llms.txt` before improvising. ## Cross-cutting rules 1. **SDK first.** Every integration requires the Croct SDK on the page or server. Integration scripts do nothing without it. Set it up with `croct init` or see the `croct-integrate-sdk` skill. 2. **Prefer `croct init`** for Storyblok, Sanity, Strapi, Hydrogen, and migrations. It detects the stack and wires the SDK (and for Storyblok JS, wraps `storyblokInit` with `withCroct`). Use the manual steps only when the user asks or the CLI cannot wire it (for example, PHP Storyblok without a supported framework). 3. **CMS content is always the fallback.** Pass the existing CMS or hard-coded content as `fallback` so failed or slow requests render today's page. For Sanity, Strapi, and Ninetailed, ask the user where **default** content should live (Croct, recommended, or the CMS via `metadata.contentSource === 'slot'`). See [headless-cms.md](references/headless-cms.md). 4. **Croct components mirror the CMS schema** with the same attribute names, so slot content and CMS content are interchangeable in the same rendering component. 5. **Track goals before publishing** any experience or experiment, or early data shows exposures with no conversions. 6. **Firmographic data is not available on the first pageview.** Design account-based experiences to activate on later pageviews; use campaign, referrer, or location for the first impression. 7. **Custom attributes in CQL drop the `custom.` prefix:** `custom.firmographics.profile.industry` is `user's firmographics's profile's industry`. Profiles allow at most 10 custom attributes. For anything beyond these examples, see the `croct-cql` skill. 8. **Storyblok specifics:** Optimize requires the Scale plan and Storyblok vendor approval (via Croct support). Table and reference fields cannot be personalized. ## CDN integration scripts All load from `https://cdn.croct.io/plug-integration/`: | Script | Where | Load timing | |--------------------------------|-------------------------------------------|--------------------------------------------------| | `google-tag-manager.js` | `
` or ``, or GTM | Any; replays the data layer | | `clarity.js` | `` or ``, or GTM | Any; waits for Clarity | | `vtex.js` | `` or ``, or GTM | **As early as possible**; earlier events are lost | | `6sense.js`, `demandbase.js` | `` or ``, or GTM | Waits for the provider to identify the visitor | | `shopify-pixel.js` | Liquid `layout/theme.liquid` before ``, with `defer` | Any; registers with the SDK when it loads | | `shopify-pixel-tracker.js` | Imported inside the Shopify custom pixel | n/a | ### GTM tag recipe (relay to the user) For any script above offered "via GTM": Tags > New; name it (for example, `Send data layer events to Croct`); tag type **Custom HTML**; paste the `