FullStory
FullStory delivers enterprise session replay and
digital-experience analytics. This destination forwards walkerOS events to
FullStory via the official
@fullstory/browser SDK
v2, calling FullStory('trackEvent', ...) for events and supporting
identity, user/page properties, and consent gating via start/shutdown.
FullStory is a web destination in the walkerOS flow:
Installation
npm install @walkeros/web-destination-fullstory- Integrated
- Bundled
import { startFlow } from '@walkeros/collector';
import { destinationFullStory } from '@walkeros/web-destination-fullstory';
await startFlow({
destinations: {
fullstory: {
code: destinationFullStory,
config: {
settings: {
orgId: 'o-XXXXXX-na1',
},
},
},
},
});Add to your flow.json destinations:
"destinations": {
"fullstory": {
"package": "@walkeros/web-destination-fullstory",
"config": {
"settings": {
"orgId": "o-XXXXXX-na1"
}
}
}
}Configuration
This destination uses the standard destination config wrapper (consent, data, env, id, ...). For the shared fields see destination configuration. Package-specific fields live under config.settings and are listed below.
Settings
| Property | Type | Description | More |
|---|---|---|---|
orgId | string | Your FullStory organization ID (e.g. "o-XXXXXX-na1"). Find it in FullStory under Settings > General. | |
host | string | Recording server host for proxy support. | |
script | string | Custom script CDN host domain. | |
cookieDomain | string | Override cookie domain for cross-subdomain tracking. | |
debug | boolean | Enable browser console debug logging. | |
devMode | boolean | Disable recording entirely for development environments. | |
startCaptureManually | boolean | Delay capture until FullStory("start") is called. Recommended for GDPR: init the SDK immediately but wait for consent before recording. | |
namespace | string | Global FS identifier override (default: "FS"). | |
recordCrossDomainIFrames | boolean | Enable cross-domain iframe recording. | |
identify | any | Destination-level identity mapping. Resolves to { uid, properties? } for FullStory setIdentity. Fires on every push. | |
consent | Record<string, string> | Translation table from walkerOS consent keys to FullStory consent actions. "capture" controls start/shutdown (recording on/off). "consent" controls setIdentity({ consent }) flag. Example: { "analytics": "capture" }. |
Mapping
Per-event rules under config.mapping. For the standard rule fields (consent, condition, data, batch, name, policy) see mapping.
| Property | Type | Description | More |
|---|---|---|---|
identify | any | Per-event identity mapping. Resolves to { uid, properties? } for FullStory setIdentity. Overrides destination-level identify for this event. | |
set | any | Property mapping. Resolved object keys become FullStory setProperties() properties. Use with setType to control scope. | |
setType | 'user' | 'page' | Property scope for the set mapping. "user" persists across sessions; "page" resets on navigation. Default: "user". |
Examples
Combined features
A purchase fires FullStory setIdentity, setProperties, and trackEvent in the canonical execution order.
{
"name": "order complete",
"data": {
"id": "0rd3r1d",
"currency": "EUR",
"shipping": 5.22,
"taxes": 73.76,
"total": 555
},
"context": {
"shopping": [
"complete",
0
]
},
"globals": {
"pagegroup": "shop"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "product",
"data": {
"id": "ers",
"name": "Everyday Ruck Snack",
"color": "black",
"size": "l",
"price": 420
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "product",
"data": {
"id": "cc",
"name": "Cool Cap",
"size": "one size",
"price": 42
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "gift",
"data": {
"name": "Surprise"
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
}
],
"consent": {
"functional": true
},
"id": "b844377dddbe4aab",
"trigger": "load",
"entity": "order",
"action": "complete",
"timestamp": 1700000107,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"name": "Purchase",
"settings": {
"identify": {
"map": {
"uid": "user.id"
}
},
"set": {
"map": {
"order_id": "data.id"
}
}
}
}fullstory.setIdentity({
"uid": "us3r"
});
fullstory.setProperties({
"type": "user",
"properties": {
"order_id": "0rd3r1d"
}
});
fullstory.trackEvent({
"name": "Purchase",
"properties": {}
})Start capture
A walker consent grant for analytics calls FullStory start to resume session recording.
{
"analytics": true
}fullstory.start()Consent flag granted
A walker consent grant with action consent sets the FullStory identity consent flag to true.
{
"marketing": true
}fullstory.setIdentity({
"consent": true
})Shutdown capture
A walker consent revoke for analytics calls FullStory shutdown to stop session recording.
{
"analytics": false
}fullstory.start();
fullstory.shutdown()Consent flag revoked
A walker consent revoke with action consent sets the FullStory identity consent flag to false.
{
"marketing": false
}fullstory.setIdentity({
"consent": true
});
fullstory.setIdentity({
"consent": false
})Default event
A walker event becomes a FullStory trackEvent call with the event name and empty properties.
{
"name": "product view",
"data": {
"id": "ers",
"name": "Everyday Ruck Snack",
"color": "black",
"size": "l",
"price": 420
},
"context": {
"shopping": [
"detail",
0
]
},
"globals": {
"pagegroup": "shop"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [],
"consent": {
"functional": true
},
"id": "661f1eb44e7a2d2b",
"trigger": "load",
"entity": "product",
"action": "view",
"timestamp": 1700000100,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}fullstory.trackEvent({
"name": "product view",
"properties": {}
})Destination identify
Destination-level identify fires FullStory setIdentity with the user id before every track call.
{
"name": "page view",
"data": {
"domain": "www.example.com",
"title": "walkerOS documentation",
"referrer": "https://www.walkeros.io/",
"search": "?foo=bar",
"hash": "#hash",
"id": "/docs/"
},
"context": {
"dev": [
"test",
1
]
},
"globals": {
"pagegroup": "docs"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "child",
"data": {
"is": "subordinated"
}
}
],
"consent": {
"functional": true
},
"id": "26c35962d49e7abd",
"trigger": "load",
"entity": "page",
"action": "view",
"timestamp": 1700000104,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}fullstory.setIdentity({
"uid": "us3r"
});
fullstory.trackEvent({
"name": "page view",
"properties": {}
})Renamed event
A mapping renames the event so the FullStory trackEvent uses Purchase instead of the walker name.
{
"name": "order complete",
"data": {
"id": "0rd3r1d",
"currency": "EUR",
"shipping": 5.22,
"taxes": 73.76,
"total": 555
},
"context": {
"shopping": [
"complete",
0
]
},
"globals": {
"pagegroup": "shop"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "product",
"data": {
"id": "ers",
"name": "Everyday Ruck Snack",
"color": "black",
"size": "l",
"price": 420
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "product",
"data": {
"id": "cc",
"name": "Cool Cap",
"size": "one size",
"price": 42
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "gift",
"data": {
"name": "Surprise"
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
}
],
"consent": {
"functional": true
},
"id": "c2ef9faba32e2881",
"trigger": "load",
"entity": "order",
"action": "complete",
"timestamp": 1700000102,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"name": "Purchase"
}fullstory.trackEvent({
"name": "Purchase",
"properties": {}
})Set page properties
A page view sets FullStory page-type properties without firing a track, since FullStory auto-captures navigation.
{
"name": "page view",
"data": {
"id": "/docs/",
"title": "Getting Started"
},
"context": {
"dev": [
"test",
1
]
},
"globals": {
"pagegroup": "docs"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "child",
"data": {
"is": "subordinated"
}
}
],
"consent": {
"functional": true
},
"id": "d3583c56a5f64163",
"trigger": "load",
"entity": "page",
"action": "view",
"timestamp": 1700000106,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"silent": true,
"settings": {
"set": {
"map": {
"pageName": "data.title"
}
},
"setType": "page"
}
}fullstory.setProperties({
"type": "page",
"properties": {
"pageName": "Getting Started"
}
})Set user properties
A purchase sets user-level FullStory properties such as revenue and currency alongside the tracked event.
{
"name": "order complete",
"data": {
"id": "0rd3r1d",
"currency": "EUR",
"shipping": 5.22,
"taxes": 73.76,
"total": 555
},
"context": {
"shopping": [
"complete",
0
]
},
"globals": {
"pagegroup": "shop"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "product",
"data": {
"id": "ers",
"name": "Everyday Ruck Snack",
"color": "black",
"size": "l",
"price": 420
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "product",
"data": {
"id": "cc",
"name": "Cool Cap",
"size": "one size",
"price": 42
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
},
{
"entity": "gift",
"data": {
"name": "Surprise"
},
"context": {
"shopping": [
"complete",
0
]
},
"nested": []
}
],
"consent": {
"functional": true
},
"id": "457808f061dc5dd9",
"trigger": "load",
"entity": "order",
"action": "complete",
"timestamp": 1700000105,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"name": "Purchase",
"settings": {
"set": {
"map": {
"revenue": "data.total",
"currency": "data.currency"
}
}
}
}fullstory.setProperties({
"type": "user",
"properties": {
"revenue": 555,
"currency": "EUR"
}
});
fullstory.trackEvent({
"name": "Purchase",
"properties": {}
})User login identify
A user login fires FullStory setIdentity with uid and profile properties before tracking the event.
{
"name": "user login",
"data": {
"id": "u-123",
"name": "Jane Doe",
"email": "jane@example.com"
},
"context": {
"dev": [
"test",
1
]
},
"globals": {
"lang": "elb"
},
"custom": {
"completely": "random"
},
"user": {
"id": "us3r",
"device": "c00k13",
"session": "s3ss10n"
},
"nested": [
{
"entity": "child",
"data": {
"is": "subordinated"
}
}
],
"consent": {
"functional": true
},
"id": "3bfbd0f93c7ac779",
"trigger": "test",
"entity": "user",
"action": "login",
"timestamp": 1700000103,
"timing": 3.14,
"source": {
"count": 1,
"trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"type": "collector",
"schema": "4"
}
}{
"settings": {
"identify": {
"map": {
"uid": "data.id",
"properties": {
"map": {
"displayName": "data.name",
"email": "data.email"
}
}
}
}
}
}fullstory.setIdentity({
"uid": "u-123",
"properties": {
"displayName": "Jane Doe",
"email": "jane@example.com"
}
});
fullstory.trackEvent({
"name": "user login",
"properties": {}
})Consent
FullStory supports runtime consent via start/shutdown (recording on/off) or
the consent flag on setIdentity. Map walkerOS consent keys to FullStory
actions via settings.consent, and combine with startCaptureManually: true
to delay recording until consent is granted:
destinations: {
fullstory: {
code: destinationFullStory,
config: {
consent: { analytics: true },
settings: {
orgId: 'o-XXXXXX-na1',
startCaptureManually: true,
consent: {
analytics: 'capture',
},
},
},
},
}"capture"togglesstart/shutdown(recording on/off)"consent"sets theconsentflag onsetIdentity