The demo store’s settings, as they would appear in your workspace.
The demo is read-only
Maison Lune’s data is an example. Nothing is saved here. In your workspace, these settings are saved and applied to the script on your site.
pk_mL9sQ2xVt…7fKcpk_Hq7nRw2cY…m3Tbpk_Zr4TbW1oE…Qa8dOne snippet, in the <head> of every page
The snippet, with the full key, is shown only once, when the key is created. Lost the key? Create another one under “API keys” above and paste the new snippet.
Session recordings: nothing to add to your site
The main script loads the session recording module itself, with the same public key, after the visitor’s consent when the workspace requires it. A site that still includes sessions.js can remove it; if it stays, the module starts only once.
The workspace has only one owner (Camille Roux), so their role can’t change until there’s another.
Everything, including billing, roles, members, and deleting the workspace.
Prepares, launches, stops, and rolls out tests; metrics, margin, feature flags, sharing, and public keys.
Prepares tests, ideas, metrics, and feature flags, without launching, stopping, or rolling out.
Views everything without changing anything.
Prepares and launches tests, without access to billing or members. Based on the “Editor” role.
Interface in EnglishFrançais
pk_Hq7nRw2cY…m3Tblast used 1 hour ago12 events, never counted in results. Latest:
If the workspace restricts its allowed origins (above), add your staging site’s URL.
Durable identity on Safari
Your server sets the probant_id cookie (server helper seen 40 minutes ago), and Safari visitors come back with an ID older than 8 days, which a cookie set by the script can’t achieve. 12,600 Safari visitors counted in requests since it was set up, 5,033 of them with an ID older than 8 days.
A 1.4 kB compressed module, loaded after consent, measures LCP, INP, and CLS on every page and ties them to the variant shown. The “Loading speed (LCP)”, “Interaction responsiveness (INP)”, and “Layout stability (CLS)” metrics are read at the 75th percentile of pageviews and are checked as guardrails in each test plan. What the script costs your visitors is under “Technical details” below.
6,953
97.0% of the 7 KB budget215 bytes to spare
17 ms
46 ms
probant.consent(true) call. Even if your workspace measures without consent, no third-party tool is notified before that call.probant_id cookie, probant_id trait). The CDP sends it with each member, through the API (POST /api/v1/audiences/{key}/members) or from Segment (POST /api/v1/cdp/segment), with a management key. A visitor’s browser reads only their own memberships, once per session and after consent. A membership that isn’t confirmed is deleted after 13 months.No imported audiences yet.
Segment request signing
Off: the management key is enough. With a shared secret, every request from Segment must also carry its X-Signature signature (HMAC-SHA1 of the body, per Segment’s documentation).
1,482
They’re received, then filtered out, so none enter your results. Requests from your servers aren’t filtered.
data-probant-mask are masked, and sessions are kept for 30 days.In the demo, recording kept 14 journeys from the “Free shipping progress bar” test, from Nov 8 to Nov 10 (42 pageviews); 2 inputs are masked. The oldest will be erased on Dec 8, 30 days after its last activity. See session recordings
Recording on for 100% of sessions, on all pages.
Masked structure on for the page /panier: the page view replays as the visitor saw it, cart and account included, without a word of its content. Never the visitor’s text, images, or input. 1 page view kept, for 30 days at most.
One path per line, with “*” for anything that follows: /cart, /account/*. At least one page: the structure is never recorded site-wide.
Required to enter the workspace.
Required before each test launch.
Contributors, who prepare tests without launching them, always go through a request, whether this setting is on or not.
Inès Martin turned off the feature flag “Instant search”
value served: false; reason: JavaScript errors up on Safari · ines@example.com
Hugo Bernard paused the test “One-page checkout”
hugo@example.com
Inès Martin created the idea “Delivered price shown on category pages”
ines@example.com
Inès Martin created the idea “2-year warranty highlighted”
ines@example.com
Inès Martin created the idea “Secure payment methods shown in the cart”
ines@example.com
Hugo Bernard launched the test “Sort by popularity”
approved: yes · hugo@example.com
Camille Roux approved the launch of “Sort by popularity”
camille@example.com
Hugo Bernard requested approval to launch “Sort by popularity”
hugo@example.com
Hugo Bernard requested a change to the feature flag “Black Friday banner”
request: activation · hugo@example.com
Hugo Bernard created the feature flag “Black Friday banner”
type: JSON · hugo@example.com
Camille Roux invited lucas@example.com
role: viewer · camille@example.com
Camille Roux approved a change to the feature flag “Instant search”
request: rules and values · camille@example.com
Hugo Bernard requested a change to the feature flag “Instant search”
request: rules and values · hugo@example.com
Camille Roux changed launch approval
no → yes · camille@example.com
Camille Roux created the idea “Free shipping from €50”
camille@example.com
Inès Martin turned on the feature flag “Instant search”
ines@example.com
Camille Roux launched the test “Pay-in-3 option highlighted”
camille@example.com
Inès Martin edited the feature flag “Photos in reviews”
share: 10% → 25% · ines@example.com
Camille Roux turned on the feature flag “Pay in 3 installments”
version: 3 · camille@example.com
Hugo Bernard created the idea “Free returns noted in the cart”
hugo@example.com
Camille Roux edited the feature flag “Pay in 3 installments”
default rule: follows the test · camille@example.com
Inès Martin launched the test “Simplified mobile menu”
ines@example.com
Hugo Bernard created the feature flag “Pay in 3 installments”
type: boolean · hugo@example.com
Hugo Bernard created the idea “Sort by popularity”
hugo@example.com
Camille Roux created the idea “20% off the second lamp”
camille@example.com
Inès Martin launched the test ““You may also like” recommendations”
ines@example.com
Hugo Bernard launched the test “One-page checkout”
hugo@example.com
Inès Martin turned on the feature flag “Photos in reviews”
share: 10% · ines@example.com
Inès Martin created the feature flag “Photos in reviews”
type: boolean · ines@example.com
Inès Martin created the idea “Estimated delivery date”
ines@example.com
Camille Roux launched the test “Free shipping progress bar”
camille@example.com
Hugo Bernard created the idea “Welcome code in a pop-up”
hugo@example.com
Inès Martin turned on the feature flag “Recommendations on the product page”
ines@example.com
Inès Martin created the idea “Numbered checkout steps”
ines@example.com
Hugo Bernard launched the test “Customer reviews at the top of the page”
hugo@example.com
Inès Martin created the feature flag “Recommendations on the product page”
type: boolean · ines@example.com
Inès Martin created the idea “Lampshade sizes as buttons on mobile”
ines@example.com
Inès Martin created the idea “Free-shipping threshold shown on the home page”
ines@example.com
Camille Roux stopped the test “Related products under the buy button”
decision: keep the original; note: Draws some attention away from the button, with no net loss · camille@example.com
Camille Roux created the idea “Pay-in-3 option highlighted”
camille@example.com
Inès Martin created the idea “Lifestyle photos in the product gallery”
ines@example.com
Inès Martin created the idea “Sticky filters at the top of category pages on mobile”
ines@example.com
Probant moved to the next step (auto-advance) the rollout of “Free shipping from €60”
25% → 50%; variant: b
Hugo Bernard created the idea “Category suggestions while typing”
hugo@example.com
Hugo Bernard created the idea “Customer reviews at the top of the page”
hugo@example.com
Camille Roux started the rollout of “Free shipping from €60”
variant: b; steps: 25%, 50%, 100%; auto-advance: yes · camille@example.com
Camille Roux stopped the test “Free shipping from €60”
decision: roll out; variant: b; note: Customers add an item to reach the threshold · camille@example.com
Camille Roux created the idea “Pickup points shown on the product page”
camille@example.com
Hugo Bernard created the idea “Express shipping offered at checkout”
hugo@example.com
Camille Roux stopped the test “Fewer form fields”
decision: keep the original; note: Shorter form, effect too small to detect at this traffic · camille@example.com
On in the demo: the “Barre de livraison gratuite” report and the library show it, with the prior below. In your workspace, it stays off until the owner turns it on.
History. Prior estimated from 48 stopped, measured tests: standard deviation of 3.7% around zero. At least 10 tests are needed to estimate this width.
Demo: the rules of Maison Lune, whose page paths are in French, and each zone’s traffic, as on the Ideas screen. In your workspace, the default rules already recognize the usual Shopify, WooCommerce, and PrestaShop paths.
* matches any sequence of characters (as in goals) and # matches a number. The names are the ones your ideas refer to./4,800 visitors per day/produits/*9,100 visitors per day/categories/*3,900 visitors per day/recherche900 visitors per day/panier3,400 visitors per day/commande/*1,800 visitors per dayAverage of the last 28 days.
/luminaires1,607 sessions/contact208 sessions/aide/livraison133 sessionsThe zone it would fall into shows here.
Demo: the ranges for Maison Lune’s office, agency, warehouse, and VPN, and the team traffic they filtered out. These addresses are examples reserved for documentation.
Your current address isn’t read in the demo. In your workspace, it appears here, with whether it’s already excluded.
IPv4 or IPv6, a single address or a range in CIDR notation (at most /8 wide for IPv4, /16 for IPv6). Takes effect within a minute.
739
Days counted in Coordinated Universal Time (UTC). Only the count of these events is kept. Session recordings from internal traffic are filtered out too, without being counted here.
Demo: Maison Lune has no real data warehouse, so nothing runs here. The query is the one Probant would send to BigQuery; the rows it would return for the “Free shipping progress bar” test go through the same reading and the same engine as in a real workspace, and give back the difference shown in its report. In your workspace, the query’s estimated cost appears before anything runs.
BigQuery · project maison-lune-data · data in EU
maison-lune-data.boutique.expositions_probant · unit visiteur_id · variant variante · date vue_le · test test
maison-lune-data.boutique.commandes · unit visiteur_id · date passee_le · value montant_ttc · statut = “payee”
| Variant | Exposed units | With an event | Value |
|---|---|---|---|
| Original | 30,650 | 6,130 | 24.58 |
| Shipping bar | 30,590 | 6,357 | 26.06 |
with pb_exposures as (
select cast(e.`visiteur_id` as STRING) as unit_id, cast(e.`variante` as STRING) as variant_key, e.`vue_le` as exposed_at
from `maison-lune-data`.`boutique`.`expositions_probant` e
where e.`visiteur_id` is not null and e.`variante` is not null and e.`vue_le` >= @p1 and cast(e.`test` as STRING) = @p2
),
pb_ranked as (
select unit_id, variant_key, exposed_at,
row_number() over (partition by unit_id order by exposed_at, variant_key) as rnk,
min(variant_key) over (partition by unit_id) as min_variant,
max(variant_key) over (partition by unit_id) as max_variant
from pb_exposures
),
pb_exposed as (
select unit_id, variant_key, exposed_at as first_at,
DIV(UNIX_MICROS(exposed_at) - UNIX_MICROS(@p1), 86400000000) as first_day,
case when min_variant <> max_variant then 1 else 0 end as mixed
from pb_ranked
where rnk = 1
),
pb_facts as (
select cast(f.`visiteur_id` as STRING) as unit_id, f.`passee_le` as occurred_at, SAFE_CAST(f.`montant_ttc` AS FLOAT64) as val
from `maison-lune-data`.`boutique`.`commandes` f
where f.`visiteur_id` is not null and f.`passee_le` >= @p1 and cast(f.`statut` as STRING) = @p3
),
pb_placed as (
select x.unit_id, x.variant_key, x.first_day, f.val,
case when f.occurred_at >= x.first_at then DIV(UNIX_MICROS(f.occurred_at) - UNIX_MICROS(@p1), 86400000000) else -1 end as day_index
from pb_exposed x
join pb_facts f on f.unit_id = x.unit_id
where (f.occurred_at >= x.first_at)
),
pb_daily as (
select unit_id, variant_key, first_day, day_index, sum(val) as val, count(val) as hits, count(*) - count(val) as unreadable
from pb_placed
group by unit_id, variant_key, first_day, day_index
),
pb_during as (
select unit_id, variant_key, day_index, val, hits from pb_daily where day_index >= 0 and hits > 0
),
pb_before as (
select unit_id, variant_key, first_day, val as total from pb_daily where day_index < 0 and hits > 0
),
pb_finals as (
select unit_id, sum(val) as total from pb_during group by unit_id
),
pb_caps as (
select cast(null as FLOAT64) as cap,
cast(null as FLOAT64) as history_cap
),
pb_running as (
select unit_id, variant_key, day_index, val, hits,
sum(val) over (partition by unit_id order by day_index rows between unbounded preceding and current row) as total,
sum(hits) over (partition by unit_id order by day_index rows between unbounded preceding and current row) as cnt,
row_number() over (partition by unit_id order by day_index) as rnk
from pb_during
),
pb_scored as (
select r.variant_key, r.day_index, r.rnk, r.hits, r.cnt,
case when c.cap is not null and r.total > c.cap then c.cap else r.total end as y1,
case when c.cap is not null and (r.total - r.val) > c.cap then c.cap else (r.total - r.val) end as y0,
case when c.history_cap is not null and coalesce(h.total, 0) > c.history_cap then c.history_cap else coalesce(h.total, 0) end as x
from pb_running r
left join pb_before h on h.unit_id = r.unit_id
cross join pb_caps c
),
pb_histories as (
select h.variant_key, h.first_day, case when c.history_cap is not null and h.total > c.history_cap then c.history_cap else h.total end as x
from pb_before h
cross join pb_caps c
)
select 'exposure' as row_kind, variant_key, cast(first_day as INT64) as day_index, cast(count(*) as INT64) as n, cast(sum(mixed) as INT64) as mixed,
cast(0 as FLOAT64) as v1, cast(0 as FLOAT64) as v2, cast(0 as FLOAT64) as v3, cast(0 as FLOAT64) as v4, cast(0 as FLOAT64) as v5, cast(0 as FLOAT64) as v6
from pb_exposed
group by variant_key, first_day
union all
select 'history', variant_key, cast(first_day as INT64), cast(count(*) as INT64), cast(0 as INT64),
cast(sum(x) as FLOAT64), cast(sum(x * x) as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64)
from pb_histories
group by variant_key, first_day
union all
select 'conversion', variant_key, cast(day_index as INT64), cast(sum(case when rnk = 1 then 1 else 0 end) as INT64), cast(0 as INT64),
cast(sum(y1 - y0) as FLOAT64),
cast(sum(y1 * y1 - y0 * y0) as FLOAT64),
cast(sum(x * (y1 - y0)) as FLOAT64),
cast(sum(hits) as FLOAT64),
cast(sum(cnt * cnt - (cnt - hits) * (cnt - hits)) as FLOAT64),
cast(sum(y1 * cnt - y0 * (cnt - hits)) as FLOAT64)
from pb_scored
group by variant_key, day_index
union all
select 'check', cast(null as STRING), cast(null as INT64), cast(0 as INT64), cast(0 as INT64), cast(coalesce(sum(unreadable), 0) as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64), cast(0 as FLOAT64)
from pb_daily
Demo: Maison Lune’s Shopify store sends its orders through webhooks, without the one-click app, and its secret key was used to import past orders. The key and secret stay masked, as in your workspace.
29,353 orders received in the last 30 days, 20,083 with a visitor ID; the latest 2 minutes ago.
https://getprobant.com/api/v1/orderssk_DemoLune7…x4QbHistory import · created Dec 1, 2025Shopify asks you to allow access to orders and costs, then opens the theme editor so you can turn on the script. The webhooks below still work without the app.
Webhook addresshttps://getprobant.com/api/v1/webhooks/shopify/maison-lune…3f9a.In theme.liquid, just before </body>. The probant_id cookie becomes a cart attribute, which Shopify carries over to the order. The cookie exists only after the visitor consents.
{% if cart.attributes.probant_id == blank %}
<script>
var probantId = document.cookie.match(/(?:^|; )probant_id=([^;]+)/);
if (probantId) fetch(window.Shopify.routes.root + "cart/update.js", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ attributes: { probant_id: probantId[1] } }) });
</script>
{% endif %}Download the WooCommerce plugin (.zip file, upload it as is)
ConnectionNo connection code created yet.
Download the PrestaShop module (.zip file, upload it as is)
ConnectionNo connection code created yet.
BOUGIE-EDITION-NOELChristmas edition candleCOFFRET-CADEAUBuild-your-own gift boxDemo: 7 variants have a cost in the history. In your workspace, an editor or the owner connects the store’s Shopify access here (the app’s client ID and secret).
sku,cost,currency,start BOUGIE-FIGUE-180,6.40,EUR,2026-01-01 BOUGIE-FIGUE-180,6.90,EUR,2026-10-01 PLAID-LIN-130,31.20,EUR,
Payment 1.4% + €0.25 per order; shipping €6.90 per order.
hooks.slack.com/…XXXXadded Jan 14 by Camille RouxLast delivery 5 hours ago: received (200).
example.com/…bantadded Jun 3 by Camille RouxLast delivery 14 hours ago: received (204).
2 recipientsadded Oct 5 by Camille RouxLast delivery 5 hours ago: received (250).
Probant keeps the response to each destination’s latest delivery. For older alerts, the destinations shown are those that receive this type of alert today.
Dans votre espace, le propriétaire branche ici Jira, Linear ou Trello ; chaque friction reçoit alors un bouton « Créer un ticket ».
Dans votre espace, un membre qui gère les intégrations relie ici le site que Tagward surveille ; ses vérifications apparaissent alors dans « Plan et durée » et sur la page de chaque test.
https://getprobant.com/api/v1https://getprobant.com/api/v1/openapi.jsonhttps://getprobant.com/api/v1/mcpsk_W3nQx8LmT…c9PzRead and writeCamille’s assistant (MCP) · created Sep 2 by Camille Roux · last call 22 minutes agosk_Hb5rK2vYe…J7qaReadMonday report · created Apr 21 by Camille Roux · last call 23 hours agoThe visitors offered in the demo are examples, linked to the recorded sessions of “Barre de livraison gratuite.”
The value of the probant_id cookie, which the store sends with the request.
Example IDs: