Every saved version of a variation’s JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.
ABTestly keeps a version of a variation’s code every time its JavaScript,
CSS or attached libraries change. History answers three questions inside
the dashboard: what did this variation look like when the test launched, what
has changed since, and how do I get an older version back.Versions are stored in full and kept for as long as the experiment exists.
There is nothing to set up. An experiment that existed before code history
starts with one version of each variation’s code as it was then.
On the experiment page, open a variation’s code with the code button on
its row (its tooltip reads Show code).
2
Click History
History sits above the code, in the read view and in the editor. Its
tooltip reads Version history.
A panel opens on the right, titled History: and the variation’s name. It
lists the stored versions newest first, 50 at a time. Load older versions
at the bottom fetches the next 50.Anyone who can open the experiment can open History and compare versions,
Viewers included. Restoring needs more, see
who can see and restore.
Versions are numbered from 1 for each variation. Numbers are never reused
Author
A first name, or an email address when there is no first name
Who saved it. Code before history began marks a Baseline version. Author not recorded marks a Recovered version, which has no author on record. Former member means the person who saved it no longer has an account
Time
How long ago, such as 25m ago or 2d ago, or a date such as Sep 3 for older versions
When the version was stored. Hover for the full date and time
Status
Live, Draft, Scheduled, Paused, Archived or Completed
The experiment’s status when the version was stored. A running experiment shows as Live
Source
See the next table
How the version was stored
Badge
Data reset
The save that stored this version also reset the experiment’s data, because you chose Reset and continue
A reset from the Reset data button changes no code, so it stores no
version and no badge.
The code as it was before history began. Every variation of an experiment that existed before code history starts with one, dated at that variation’s last save
Sometimes the list starts with an entry named Current (not yet in
history). It is the variation’s code as the page loaded it, shown when that
code differs from the newest stored version, or when nothing is stored yet.
You can compare it like any other version. It has no Restore button, since it
is the saved code.It appears for one of two reasons:
A save went through, but storing its version did not. The save itself
is never affected. The missing code is added as a Recovered version (a
Baseline, if the variation had no versions yet) the next time the
experiment’s variations are saved. Launching the experiment, a scheduled
start, and a data reset from Reset data or from Reset and continue
when you resume also add it.
Someone saved after you opened the page. Your page then holds older
code than the newest version. Reload the page.
Tick the checkbox on any two entries. Ticking a third one drops the one
you ticked first.
2
Read the comparison
The comparison opens above the list, headed for example Comparing
revision 3 with revision 5. The older version is always on the left
and the newer one on the right, whatever order you ticked them in. The
current code is always the newer side.
3
Switch files
variation.js and variation.css switch which file you compare.
Comparisons in History are read only. Close one with its close button (×) or
Esc. The list stays as it was and the focus goes back to the checkbox or
button that opened the comparison. In the panel, Esc closes an open
comparison first. With no comparison open, Esc closes the panel.When the two versions have different libraries, a line under the
Comparing revision heading names the difference, in the same format as
Review changes:
Libraries: adds <key>; removes <key>, or
Libraries: same libraries in a new load order. It reads from the older
version to the newer one, so adds means the newer version has a library
the older one does not. When the libraries are the same, no line shows.
Revision 5 and revision 6 compared in History. The older version is always on the left. Below the comparison, each version shows its author, time, status and source.
Three buttons under the panel title pick a comparison for you.
Button
When it shows
What it compares
Previous save
Always. Disabled until the variation has two stored versions
The two newest stored versions, whatever stored them
Since launch
Once the experiment has started
The version that was current when the experiment first started, with the current code
Since last reset
Once the experiment’s data has been reset
The version that was current at the last data reset, with the current code
“The version that was current” at a moment means: of all the versions stored
at or before that moment, the most recent one. Launch is the first start,
from draft or scheduled to running. Pausing and resuming does not move it.The quick picks load older versions for you when the moment falls further
back than the list shows, up to 2,000 more.
Since launch on a variation whose code has not changed since the test started. The note reads No code changes since launch, and only the version current at launch is selected. It is already the saved code, so there is nothing to compare.
The code now is the code at launch. Only that version is selected, because there is nothing to compare
No code changes since the last reset
The same, for the last reset
History starts on and a date
The launch or reset happened before the oldest stored version, so the oldest version is compared instead. The date shows in your browser’s format, for example Jul 14, 2026
Showing the latest and a number of versions, then Load older versions to go further back.
The history is longer than a quick pick loads, and the moment falls before everything loaded. Click Load older versions and pick again
No saved versions to compare yet
The variation has no stored versions
Couldn’t read the launch date or Couldn’t read the reset date
The experiment’s date could not be read. Reload the page
The panel closes and the variation’s code opens in the editor with that
version loaded as an unsaved draft. When it differs from the saved code,
Review changes is already on, open on a file that changed, and the button
reads Back to editor.
3
Save it, or cancel
Nothing is saved until you click Save. Cancel drops the draft
and leaves the saved code as it was.
A version that differs only in its libraries opens in Review changes
with the same code on both sides. The library line under the header names
what the restore adds or removes. See
library changes.
A version identical to the saved code, with the same JavaScript, CSS
and libraries, has nothing to restore. Its button is disabled with the
tooltip This is already the saved code., and the same words show on its
row. That happens once its code has been loaded, for example by comparing
it. If you click Restore before that, the panel says so and restores
nothing.
The save is an ordinary save. It goes through every check any save
does: your access, the lock, the reset or keep data question, the library
rules, the syntax check and code check. Restoring is
never a way around one of them.
A restored version opens as an unsaved draft in Review changes, with the saved code on the left. This one also adds a library, named in the line under the header.
When you cannot restore, the panel says why near the top and every Restore
this version button is disabled with the same words as its tooltip. The
reasons are checked in this order:
Message
Why
What to do
Viewers can’t restore versions.
You are a Viewer. Viewers can open History and compare
Ask a Dev or an Admin
You need code editor access to restore versions. Ask an admin to grant it from Team & access.
You do not have Code editor access on this site
Ask an Admin for Code editor access on the site
This experiment is archived, so its code can’t be restored.
Archived experiments cannot be edited
Clone the experiment and work on the code in the new draft
You can’t edit this experiment’s code.
The experiment is running or paused, so saving its code republishes it, and you cannot publish on this site
Ask an Admin for Publish experiments on the site
This experiment is locked for editing. Pause it first, then restore.
The running experiment has 1,000 visitors since its last reset
Pause it, restore, save, then answer the reset or keep data question
Save or cancel your open edit first.
The inline editor is open with unsaved changes, on this variation or another one
Save or cancel that edit
An unsaved draft is waiting. Recover or discard it in the editor first.
A recovery banner is waiting, or this variation has an autosaved draft from an earlier visit
Open that variation’s editor and click Recover or Discard
The last two exist so a restore never overwrites work you have not saved.
Autosave would replace a waiting draft with the restored code within about a
second, before you ever saw it.The panel checks again when a version’s code arrives. If something changed
while it loaded, for example you started typing, you see Can’t restore this
version with the reason, and nothing changes.
A version holds its library keys as well as its code, and restoring brings
them back. Save sends them with the code, and the save applies the usual
library rules:
A library the variation already has is kept, even if it has been deprecated
since.
A library the variation does not have now counts as newly attached. That
needs Dev libraries on your plan (Pro and above) and the library
approved for the site under Site → Developer libraries. Otherwise the
save is refused and nothing is stored. Remove the library in Libraries,
or approve it, then save again.
After a restore, autosave treats the restored code as your draft and mirrors
it to this browser within about a second, the same as your typing. It keeps
the libraries too when they differ from the saved ones. If the page reloads
before you save, the recovery banner offers the draft back, and Recover
puts back the code and the libraries.If someone saves the variation in the meantime, the banner warns Unsaved
changes found, but the saved code has changed and the button reads
Recover anyway, because recovering replaces the newer saved code with your
draft. The same warning appears when your draft changed the libraries and
someone has since changed the saved libraries. Use Compare with saved in
the banner to see both first. See
Autosave and drafts.
A save that changes the JavaScript, the CSS or the library keys, from either editor. A new library load order counts
Saved
Creating an experiment, one version per variation
Created
Cloning an experiment, one version per variation of the clone
Cloned
Drafting an experiment from a Signals scan
From Signals
History beginning on an experiment that already existed
Baseline
Finding saved code that is missing from the history
Recovered
These store nothing new:
A save that leaves the code and the libraries as they were. Changing only a
variation’s weight or name, the goals, the targeting, the schedule or the
traffic split stores no version.
Starting, pausing, resuming or archiving the experiment.
Autosave. Drafts in your browser never reach history.
Restoring. Only the save after it stores a version.
A variation’s name is not part of a version, so renaming one stores nothing.
The panel title uses the name it has now.If you remove a variation, its versions are kept, but History is only offered
on variations the experiment still has.
Kept for the life of the experiment. Nothing is pruned on a timer.
Stored in full. Each file can be up to 500,000 characters, the same
limit a save has. A version is never shortened.
Archiving keeps them. Versions are deleted when the experiment is
permanently deleted, when its site is deleted, and when the account is
closed.
The Activity log also shows code changes,
but it keeps workspace changes for 6 months only, and it does not keep a file
over 32 KB in full. Code history is the complete record.
Two read only endpoints list a variation’s versions and return one version
with its code. See variant code history
in the REST API reference. No endpoint writes versions: they are stored only
as a side effect of the saves above.
Storing a version happens after the save itself, and if it fails the save is
kept anyway. Your code was saved, but the history missed that version. The
next time ABTestly writes to the history for that experiment, it finds that
the saved code differs from the newest version and stores the missing code as
Recovered, dated when that code was saved. Until then, History shows
Current (not yet in history).A Recovered version has no author recorded, because ABTestly cannot know who
saved that code. Its author shows as Author not recorded. To find who
saved it, look for the save in the Activity log.
Why does Since launch say History starts on a date?
The experiment launched before the oldest stored version. That happens with
experiments that existed before code history: their first version is a
Baseline dated at the variation’s last save. If the variation was saved
after launch, the code that actually ran at launch was never stored, so
History compares the oldest version it has and tells you where its record
starts. The same applies to Since last reset when the last reset came
before the oldest version. If the variation had not been saved since launch,
the Baseline is the launch code and no note appears.
Why is Review changes greyed out right after I saved?
Once the save goes through, your draft is the saved code, so there is
nothing left to compare. Open History and click Previous save to see
what that save changed.
Two versions show the same code. Why are they separate versions?
Look under the Comparing revision heading. When the libraries differ, a
different library or the same libraries in a new order, a line there names
the difference, for example Libraries: same libraries in a new load
order. Whitespace changes show in the comparison too, so check the
highlighted lines as well. Two versions that are not next to each other can
also hold the same code, for example when a later save put back older code.
The person who saved that version no longer has an account. The version and
its code are kept. A Recovered version shows Author not recorded
instead, and a Baseline version shows Code before history began.
History sits above a variation’s code, so it is offered wherever the code
is. The Original shows its code section only when it has code, and variations
in a Split URL test carry a redirect instead of code,
so neither offers History. A variation that was removed from the experiment
has no row to open.
Compare unsaved edits with the saved code before you save.
Autosave and drafts
The local draft that recovery and restore both work with.
Editing a running test
What happens to your data when you change code on a test that is running.
Activity log
Who changed what across the workspace, for six months.
Last modified on September 12, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ABTestly","description":"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.","colors":{"primary":"#2563EB","light":"#60A5FA","dark":"#1D4FD8"},"logo":{"light":"https://mintcdn.com/abtestly/00G4YX1JcYDGimmE/logo/light.svg?fit=max\u0026auto=format\u0026n=00G4YX1JcYDGimmE\u0026q=85\u0026s=8e30c68a69d5838fd283382cc9a3041c","dark":"https://mintcdn.com/abtestly/00G4YX1JcYDGimmE/logo/dark.svg?fit=max\u0026auto=format\u0026n=00G4YX1JcYDGimmE\u0026q=85\u0026s=26be4c014a0ada510816b8a49547f52a"},"favicon":"https://mintcdn.com/abtestly/EO3uzUwEIRnQ3Ov9/favicon.svg?fit=max\u0026auto=format\u0026n=EO3uzUwEIRnQ3Ov9\u0026q=85\u0026s=c40e32c2a3477e6ce9dfe2fec2977576","background":{"color":{"light":"#f2ede1","dark":"#262935"}},"navbar":{"links":[{"href":"https://abtestly.com/pricing","label":"Pricing"},{"href":"mailto:support@abtestly.com","label":"Support"}],"primary":{"type":"button","label":"Open dashboard","href":"https://app.abtestly.com"}},"footer":{"socials":{"github":"https://github.com/abtestly"}},"seo":{"metatags":{"og:site_name":"ABTestly Documentation","og:type":"website","og:logo":"https://abtestly.com/assets/favicon.svg","og:image":"https://docs.abtestly.com/images/og-image.png","og:image:width":"1200","og:image:height":"630","og:image:alt":"ABTestly Documentation. Code-first A/B testing, documented.","twitter:card":"summary_large_image","twitter:image":"https://docs.abtestly.com/images/og-image.png","twitter:image:alt":"ABTestly Documentation. Code-first A/B testing, documented.","og:description":"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.","twitter:site":"@abtestly"},"indexing":"all"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"abtestly","hasAudioNarration":false,"actualSubdomain":"abtestly","customDomains":["docs.abtestly.com"],"gitSource":{"type":"github","owner":"maaislam","repo":"abtestly-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ab639727e9a03c18a5151a1","collectionId":"07e21d16-5bbf-465a-a29a-86ea6cdb120f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ab639727e9a03c18a5151a1"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ab639727e9a03c18a5151a1","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Read results","count":13},{"language":"default","tag":"Build a test","count":10},{"language":"default","tag":"Developer reference","count":8},{"language":"default","tag":"Methodology","count":7},{"language":"default","tag":"Site settings","count":7},{"language":"default","tag":"Signals","count":6},{"language":"default","tag":"Target the right visitors","count":6},{"language":"default","tag":"Getting started","count":5},{"language":"default","tag":"Integrations","count":5},{"language":"default","tag":"Measure","count":5}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"signals-pipeline.css","content":"@keyframes abtPipeMergeFlow{to{stroke-dashoffset:-14}}@keyframes abtPipeBeat{0%,to{opacity:0;transform:scale(.965)}6%{opacity:.9;transform:scale(1.004)}11%{opacity:1;transform:scale(1.012)}18%{opacity:.55;transform:scale(1.022)}26%{opacity:0;transform:scale(1.032)}}@keyframes abtPipeArrowGlide{0%,26%,to{opacity:.4;transform:translateX(-3px);color:var(--ink-5)}7%{opacity:1;transform:translateX(2px);color:var(--brand)}16%{opacity:.6;transform:translateX(3px);color:var(--brand)}}@keyframes abtReturnFlow{0%,44%{top:calc(100% - 8px);opacity:0}52%{top:calc(100% - 8px);opacity:1}88%{top:0;opacity:1}95%,to{top:0;opacity:0}}@keyframes abtPlLoopBeat{0%,50%,90%,to{opacity:.45}60%,82%{opacity:.95}}@keyframes abtPlLoopDot{0%,52%{left:calc(100% - 18px);opacity:0}57%{left:calc(100% - 18px);opacity:1}80%{left:9px;opacity:1}86%,to{left:9px;opacity:0}}.abt-signals-pipeline{--canvas:#f7f3ee;--paper:#fefdfb;--paper-2:#faf8f4;--well:#f3eee8;--line:#e9e2db;--line-2:#f3eee8;--line-strong:#d8d0c5;--ink:#0d253d;--ink-2:#273951;--ink-3:#5e6d85;--ink-4:#8a93a3;--ink-5:#c9c1b4;--brand:#5e6ad2;--brand-600:#4d59c4;--brand-700:#4434d4;--brand-soft:#eceefb;--brand-soft-2:#f4f6fc;--brand-ring:rgba(94, 106, 210, 0.35);--neg:#c2410c;--neg-soft:#f6e4d9;--warn:#9b6829;--warn-ink:#7a4d18;--warn-soft:#f5e9d4;--shadow-xs:0 1px 2px rgba(13, 37, 61, 0.04);--shadow-md:0 4px 12px rgba(13, 37, 61, 0.06);--r-xs:5px;--r-sm:7px;--r-md:9px;--r-lg:11px;--r-xl:14px;--r-2xl:18px;--r-pill:999px;--t-base:160ms;--ease:cubic-bezier(0.2, 0.7, 0.2, 1);--ease-spring:cubic-bezier(0.34, 1.32, 0.46, 1);--font-sans:system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;--font-mono:ui-monospace, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;color-scheme:light;width:100%;margin:1.6rem 0}html.dark .abt-signals-pipeline{--canvas:#09101b;--paper:#191d24;--paper-2:#1e232b;--well:#15181f;--line:#272c34;--line-2:#1b1f26;--line-strong:#353c47;--ink:#e8eaee;--ink-2:#c2c7ce;--ink-3:#9298a2;--ink-4:#767d88;--ink-5:#3a4048;--brand:#7480e8;--brand-600:#8b95ef;--brand-700:#b6bdf8;--brand-soft:rgba(116, 128, 232, 0.16);--brand-soft-2:rgba(116, 128, 232, 0.08);--brand-ring:rgba(116, 128, 232, 0.45);--neg:#e79457;--neg-soft:rgba(231, 148, 87, 0.18);--warn:#d9a44c;--warn-ink:#ecc480;--warn-soft:rgba(217, 164, 76, 0.18);--shadow-xs:0 1px 2px rgba(0, 0, 0, 0.4);--shadow-md:0 4px 12px rgba(0, 0, 0, 0.5);color-scheme:dark}.abt-signals-pipeline *,.abt-signals-pipeline ::after,.abt-signals-pipeline ::before{box-sizing:border-box}.abt-signals-pipeline .audit{container-type:inline-size;border:1px solid var(--line);border-radius:var(--r-2xl);background:radial-gradient(130% 90% at 0% 0%,var(--brand-soft-2) 0%,transparent 44%),var(--paper);box-shadow:var(--shadow-md);padding:30px 30px 32px;overflow:hidden;font-family:var(--font-sans);color:var(--ink);-webkit-font-smoothing:antialiased}.abt-signals-pipeline .pipe-cap{display:flex;justify-content:space-between;gap:16px;margin-bottom:20px;flex-wrap:wrap}.abt-signals-pipeline .pipe-cap span{font-family:var(--font-mono);font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--brand-700);text-wrap:pretty}.abt-signals-pipeline .pipe-cap .r{color:var(--ink-4)}.abt-signals-pipeline .pipe-cap .r::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--ink-5)}.abt-signals-pipeline .pipe-diagram{display:flex;align-items:stretch}.abt-signals-pipeline .pipe-inputs{flex:0 0 232px;display:flex;flex-direction:column;gap:10px}.abt-signals-pipeline .pipe-inputs .pnode{flex:1;flex-direction:row;align-items:flex-start;gap:11px;padding:13px}.abt-signals-pipeline .pipe-inputs .pn-ic{margin-top:1px}.abt-signals-pipeline .pipe-inputs .pn-col{display:flex;flex-direction:column;gap:7px;min-width:0}.abt-signals-pipeline .pipe-inputs .pn-n{margin-top:2px}.abt-signals-pipeline .pipe-merge{flex:0 0 50px;align-self:stretch;color:var(--line-strong)}.abt-signals-pipeline .pipe-merge svg{width:100%;height:100%;display:block}.abt-signals-pipeline .pipe-merge .pm-v{display:none}.abt-signals-pipeline .pipe-merge path{fill:none;stroke:currentColor;stroke-width:1.5}.abt-signals-pipeline .pchain{flex:1 1 0;display:flex;align-items:center}.abt-signals-pipeline .pipe-arrow{display:flex;align-items:center;justify-content:center;color:var(--ink-5);padding:0 7px;flex:0 0 auto}.abt-signals-pipeline .pipe-arrow svg{width:19px;height:19px}.abt-signals-pipeline .pnode{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-lg);padding:14px;box-shadow:var(--shadow-xs);display:flex;flex-direction:column;gap:9px;width:100%}.abt-signals-pipeline .pn-head{display:flex;align-items:center;gap:9px}.abt-signals-pipeline .pn-ic{width:30px;height:30px;flex:none;border-radius:var(--r-sm);background:var(--brand-soft);color:var(--brand);display:grid;place-items:center}.abt-signals-pipeline .pn-ic svg{width:16px;height:16px}.abt-signals-pipeline .pn-n{font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-4)}.abt-signals-pipeline .pn-t{font-size:13.5px;font-weight:500;color:var(--ink);letter-spacing:-.01em;line-height:1.25}.abt-signals-pipeline .pn-d{font-size:11.5px;line-height:1.45;color:var(--ink-3)}.abt-signals-pipeline .pnode.is-hub{border-color:var(--brand-ring);background:linear-gradient(180deg,var(--brand-soft-2),var(--paper) 72%)}.abt-signals-pipeline .pnode.is-fals .pn-ic{background:var(--neg-soft);color:var(--neg)}.abt-signals-pipeline .pn-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:1px;min-width:0}.abt-signals-pipeline .pchain,.abt-signals-pipeline .pn-col,.abt-signals-pipeline .pn-head,.abt-signals-pipeline .pnode{min-width:0}.abt-signals-pipeline .pn-d,.abt-signals-pipeline .pn-t{overflow-wrap:anywhere;text-wrap:pretty}.abt-signals-pipeline .pn-tag{font-family:var(--font-mono);font-size:9.5px;line-height:1.45;letter-spacing:.01em;color:var(--ink-3);background:var(--well);border:1px solid var(--line-2);border-radius:var(--r-xs);padding:2px 6px;white-space:normal;max-width:100%;overflow-wrap:anywhere}.abt-signals-pipeline .pn-tag.b{color:var(--brand-700);background:var(--brand-soft);border-color:transparent}.abt-signals-pipeline .pn-tag.q{color:var(--warn-ink);background:var(--warn-soft);border-color:transparent}.abt-signals-pipeline .pipe-foot{display:flex;justify-content:space-between;align-items:center;gap:14px 28px;flex-wrap:wrap;margin-top:20px;padding-top:16px;border-top:1px solid var(--line-2);font-family:var(--font-mono);font-size:11px;color:var(--ink-4)}.abt-signals-pipeline .pipe-cap span,.abt-signals-pipeline .pipe-foot span{display:inline-flex;align-items:center;gap:7px}.abt-signals-pipeline .pipe-foot span::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--brand);flex:none}.abt-signals-pipeline .pipe-foot b{color:var(--ink-3);font-weight:500}.abt-signals-pipeline .pipe-return{display:none}@container (max-width: 980px){.abt-signals-pipeline .pipe-diagram{flex-direction:column;gap:10px;position:relative;padding-left:38px}.abt-signals-pipeline .pipe-inputs{flex:none;flex-direction:row}.abt-signals-pipeline .pipe-inputs .pnode{flex:1 1 0}.abt-signals-pipeline .pipe-merge{flex:none;height:36px;width:100%}.abt-signals-pipeline .pipe-merge .pm-h{display:none}.abt-signals-pipeline .pipe-merge .pm-v{display:block}.abt-signals-pipeline .pchain{flex:none}.abt-signals-pipeline .pipe-arrow{padding:2px 0;transform:rotate(90deg)}.abt-signals-pipeline .pipe-return{display:block;position:absolute;left:2px;top:20px;bottom:20px;width:28px;border:2px dashed var(--brand-ring);border-right:0;border-radius:var(--r-lg) 0 0 var(--r-lg);pointer-events:none}.abt-signals-pipeline .pipe-return::after{content:'';position:absolute;top:-5px;right:-8px;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:8px solid var(--brand)}.abt-signals-pipeline .pipe-return::before{content:'';position:absolute;left:-3px;top:0;width:8px;height:8px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 4px var(--brand-soft);opacity:0}}@container (max-width: 620px){.abt-signals-pipeline .pipe-inputs{flex-direction:column}}@media (prefers-reduced-motion:no-preference){.abt-signals-pipeline .audit .pipe-merge path{stroke:var(--brand);stroke-dasharray:5 9;animation:abtPipeMergeFlow 1.4s linear infinite}.abt-signals-pipeline .audit .pnode{position:relative}.abt-signals-pipeline .audit .pnode::after{content:'';position:absolute;inset:-2px;border-radius:13px;box-shadow:0 0 0 1.5px var(--brand-ring),0 12px 36px -6px var(--brand-ring);opacity:0;pointer-events:none;transform-origin:center;animation:abtPipeBeat 8.5s cubic-bezier(.37,0,.34,1) infinite}.abt-signals-pipeline .audit .pnode.is-fals::after{box-shadow:0 0 0 1.5px var(--neg),0 12px 36px -6px var(--neg-soft)}.abt-signals-pipeline .audit .pipe-inputs .pnode:nth-child(1)::after{animation-delay:0s}.abt-signals-pipeline .audit .pipe-inputs .pnode:nth-child(2)::after{animation-delay:.13s}.abt-signals-pipeline .audit .pipe-inputs .pnode:nth-child(3)::after{animation-delay:.26s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(3) .pnode::after{animation-delay:1.05s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(5) .pnode::after{animation-delay:1.95s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(7) .pnode::after{animation-delay:2.85s}.abt-signals-pipeline .audit .pipe-diagram>.pchain:nth-child(9) .pnode::after{animation-delay:3.75s}.abt-signals-pipeline .audit .pipe-arrow svg{animation:abtPipeArrowGlide 8.5s cubic-bezier(.37,0,.34,1) infinite;will-change:transform,opacity}.abt-signals-pipeline .audit .pipe-diagram>.pipe-arrow:nth-child(4) svg{animation-delay:1.5s}.abt-signals-pipeline .audit .pipe-diagram>.pipe-arrow:nth-child(6) svg{animation-delay:2.4s}.abt-signals-pipeline .audit .pipe-diagram>.pipe-arrow:nth-child(8) svg{animation-delay:3.3s}}.abt-signals-pipeline .pipe-loop{position:relative;height:54px;margin:16px 8px 2px}.abt-signals-pipeline .pl-bracket{position:absolute;left:10px;right:10px;top:13px;bottom:8px;border:2px dashed var(--brand);border-top:0;border-radius:0 0 18px 18px;opacity:.55}.abt-signals-pipeline .pl-arrow{position:absolute;left:4px;top:1px;width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:11px solid var(--brand)}.abt-signals-pipeline .pl-dot{position:absolute;bottom:4px;left:calc(100% - 18px);width:9px;height:9px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 4px var(--brand-soft);opacity:0;z-index:2}.abt-signals-pipeline .pl-from,.abt-signals-pipeline .pl-to{position:absolute;top:2px;font-family:var(--font-mono);font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-4);background:var(--paper);padding:0 6px}.abt-signals-pipeline .pl-from{right:12px}.abt-signals-pipeline .pl-to{left:24px}.abt-signals-pipeline .pl-tag{position:absolute;left:50%;top:46px;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11.5px;color:var(--brand-700);background:var(--paper);border:1px solid var(--brand-ring);border-radius:var(--r-pill);padding:6px 14px;box-shadow:var(--shadow-xs);white-space:nowrap}.abt-signals-pipeline .pl-tag svg{width:14px;height:14px;color:var(--brand)}@container (max-width: 980px){.abt-signals-pipeline .pipe-loop{height:auto;margin-top:16px;text-align:center}.abt-signals-pipeline .pl-arrow,.abt-signals-pipeline .pl-bracket,.abt-signals-pipeline .pl-dot,.abt-signals-pipeline .pl-from,.abt-signals-pipeline .pl-to{display:none}.abt-signals-pipeline .pl-tag{position:static;transform:none;white-space:normal}}@media (prefers-reduced-motion:no-preference){.abt-signals-pipeline .pl-bracket{animation:abtPlLoopBeat 8.5s ease-in-out infinite}.abt-signals-pipeline .pl-dot{animation:abtPlLoopDot 8.5s cubic-bezier(.45,.05,.3,1) infinite}.abt-signals-pipeline .pipe-return::before{animation:abtReturnFlow 8.5s cubic-bezier(.45,.05,.3,1) infinite}}.abt-signals-pipeline a.pnode{text-decoration:none;color:inherit;cursor:pointer}.abt-signals-pipeline .pipe-diagram .pnode:focus-within,.abt-signals-pipeline .pipe-diagram .pnode:hover{border-color:var(--brand-ring);box-shadow:var(--shadow-md)}.abt-signals-pipeline .pipe-diagram .pnode:focus-visible{outline:2px solid var(--brand);outline-offset:2px}@media (prefers-reduced-motion:no-preference){.abt-signals-pipeline .pipe-diagram .pnode{transition:border-color .16s var(--ease),box-shadow .16s var(--ease)}}.sig-anchor{display:block;height:0;scroll-margin-top:5rem}"}],"page":{"pagePath":"build/code-history","slug":"/build/code-history","pageMetadata":{"title":"Code history","description":"Every saved version of a variation's JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.","href":"/build/code-history"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Every saved version of a variation’s JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,Frame,Heading,OptimizedImage,Step,Steps,Table}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`ABTestly keeps a version of a variation’s code every time its JavaScript,\nCSS or attached libraries change. `,_jsx(_components.strong,{children:`History`}),` answers three questions inside\nthe dashboard: what did this variation look like when the test launched, what\nhas changed since, and how do I get an older version back.`]}),`\n`,_jsx(_components.p,{children:`Versions are stored in full and kept for as long as the experiment exists.\nThere is nothing to set up. An experiment that existed before code history\nstarts with one version of each variation’s code as it was then.`}),`\n`,_jsx(Heading,{level:`2`,id:`open-history`,children:`Open History`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the variation's code`,children:_jsxs(_components.p,{children:[`On the experiment page, open a variation’s code with the code button on\nits row (its tooltip reads `,_jsx(_components.strong,{children:`Show code`}),`).`]})}),_jsx(Step,{title:`Click History`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`History`}),` sits above the code, in the read view and in the editor. Its\ntooltip reads `,_jsx(_components.strong,{children:`Version history`}),`.`]})})]}),`\n`,_jsxs(_components.p,{children:[`A panel opens on the right, titled `,_jsx(_components.strong,{children:`History:`}),` and the variation’s name. It\nlists the stored versions newest first, 50 at a time. `,_jsx(_components.strong,{children:`Load older versions`}),`\nat the bottom fetches the next 50.`]}),`\n`,_jsxs(_components.p,{children:[`Anyone who can open the experiment can open History and compare versions,\nViewers included. Restoring needs more, see\n`,_jsx(_components.a,{href:`#who-can-see-and-restore`,children:`who can see and restore`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-each-version-shows`,children:`What each version shows`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Part`}),_jsx(_components.th,{children:`What you see`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Number`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Revision 4`})}),_jsx(_components.td,{children:`Versions are numbered from 1 for each variation. Numbers are never reused`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Author`}),_jsx(_components.td,{children:`A first name, or an email address when there is no first name`}),_jsxs(_components.td,{children:[`Who saved it. `,_jsx(_components.strong,{children:`Code before history began`}),` marks a Baseline version. `,_jsx(_components.strong,{children:`Author not recorded`}),` marks a Recovered version, which has no author on record. `,_jsx(_components.strong,{children:`Former member`}),` means the person who saved it no longer has an account`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Time`}),_jsxs(_components.td,{children:[`How long ago, such as `,_jsx(_components.strong,{children:`25m ago`}),` or `,_jsx(_components.strong,{children:`2d ago`}),`, or a date such as `,_jsx(_components.strong,{children:`Sep 3`}),` for older versions`]}),_jsx(_components.td,{children:`When the version was stored. Hover for the full date and time`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Status`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Live`}),`, `,_jsx(_components.strong,{children:`Draft`}),`, `,_jsx(_components.strong,{children:`Scheduled`}),`, `,_jsx(_components.strong,{children:`Paused`}),`, `,_jsx(_components.strong,{children:`Archived`}),` or `,_jsx(_components.strong,{children:`Completed`})]}),_jsxs(_components.td,{children:[`The experiment’s status when the version was stored. A running experiment shows as `,_jsx(_components.strong,{children:`Live`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Source`}),_jsx(_components.td,{children:`See the next table`}),_jsx(_components.td,{children:`How the version was stored`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Badge`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Data reset`})}),_jsxs(_components.td,{children:[`The save that stored this version also reset the experiment’s data, because you chose `,_jsx(_components.strong,{children:`Reset and continue`})]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`A reset from the `,_jsx(_components.strong,{children:`Reset data`}),` button changes no code, so it stores no\nversion and no badge.`]}),`\n`,_jsx(Heading,{level:`3`,id:`sources`,children:`Sources`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Label`}),_jsx(_components.th,{children:`Stored when`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Saved`})}),_jsx(_components.td,{children:`Someone saved a change to the code or the libraries, from the inline editor or the experiment editor. Saving a restored version is a save too`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Created`})}),_jsx(_components.td,{children:`The experiment was created. Every variation, the Original included, starts at revision 1`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Cloned`})}),_jsxs(_components.td,{children:[`The experiment was `,_jsx(_components.a,{href:`/build/clone`,children:`cloned`}),`. The clone’s history starts here. The source experiment keeps its own history`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`From Signals`})}),_jsxs(_components.td,{children:[`The experiment was drafted from a Signals scan. See `,_jsx(_components.a,{href:`/signals/build-a-test`,children:`Build a test from a scan`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Baseline`})}),_jsx(_components.td,{children:`The code as it was before history began. Every variation of an experiment that existed before code history starts with one, dated at that variation’s last save`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Recovered`})}),_jsxs(_components.td,{children:[`ABTestly found saved code missing from the history and added it. See `,_jsx(_components.a,{href:`#why-does-a-version-say-recovered`,children:`why a version says Recovered`})]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`current-not-yet-in-history`,children:`Current (not yet in history)`}),`\n`,_jsxs(_components.p,{children:[`Sometimes the list starts with an entry named `,_jsx(_components.strong,{children:`Current (not yet in\nhistory)`}),`. It is the variation’s code as the page loaded it, shown when that\ncode differs from the newest stored version, or when nothing is stored yet.\nYou can compare it like any other version. It has no Restore button, since it\nis the saved code.`]}),`\n`,_jsx(_components.p,{children:`It appears for one of two reasons:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A save went through, but storing its version did not.`}),` The save itself\nis never affected. The missing code is added as a `,_jsx(_components.strong,{children:`Recovered`}),` version (a\n`,_jsx(_components.strong,{children:`Baseline`}),`, if the variation had no versions yet) the next time the\nexperiment’s variations are saved. Launching the experiment, a scheduled\nstart, and a data reset from `,_jsx(_components.strong,{children:`Reset data`}),` or from `,_jsx(_components.strong,{children:`Reset and continue`}),`\nwhen you resume also add it.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Someone saved after you opened the page.`}),` Your page then holds older\ncode than the newest version. Reload the page.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`compare-two-versions`,children:`Compare two versions`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Tick two versions`,children:_jsx(_components.p,{children:`Tick the checkbox on any two entries. Ticking a third one drops the one\nyou ticked first.`})}),_jsx(Step,{title:`Read the comparison`,children:_jsxs(_components.p,{children:[`The comparison opens above the list, headed for example `,_jsx(_components.strong,{children:`Comparing\nrevision 3 with revision 5`}),`. The older version is always on the left\nand the newer one on the right, whatever order you ticked them in. The\ncurrent code is always the newer side.`]})}),_jsx(Step,{title:`Switch files`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`variation.js`}),` and `,_jsx(_components.strong,{children:`variation.css`}),` switch which file you compare.`]})})]}),`\n`,_jsx(_components.p,{children:`Comparisons in History are read only. Close one with its close button (×) or\nEsc. The list stays as it was and the focus goes back to the checkbox or\nbutton that opened the comparison. In the panel, Esc closes an open\ncomparison first. With no comparison open, Esc closes the panel.`}),`\n`,_jsxs(_components.p,{children:[`When the two versions have different libraries, a line under the\n`,_jsx(_components.strong,{children:`Comparing revision`}),` heading names the difference, in the same format as\n`,_jsx(_components.a,{href:`/build/review-changes#library-changes`,children:`Review changes`}),`:\n`,_jsx(_components.code,{children:`Libraries: adds \u003ckey>; removes \u003ckey>`}),`, or\n`,_jsx(_components.code,{children:`Libraries: same libraries in a new load order`}),`. It reads from the older\nversion to the newer one, so `,_jsx(_components.strong,{children:`adds`}),` means the newer version has a library\nthe older one does not. When the libraries are the same, no line shows.`]}),`\n`,_jsx(Frame,{caption:`Revision 5 and revision 6 compared in History. The older version is always on the left. Below the comparison, each version shows its author, time, status and source.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=4b24c836b3794ec740423402ff1f30d3`,alt:`History panel for Variant B comparing revision 5 with revision 6 side by side, above a list of six versions with revision 5 and revision 6 ticked`,\"data-og-width\":`2400`,width:`2400`,\"data-og-height\":`1633`,height:`1633`,\"data-path\":`images/code-history-compare.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?w=280\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=e17d58b64f5d5a89eac7d3d14a679eee 280w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?w=560\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=70a2bf599643b2848a38cbcd0b04a9d0 560w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?w=840\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=df23eeac4728542bdea2c419802ca10a 840w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?w=1100\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=a045ca974180f45f76c0fa0891f462b6 1100w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?w=1650\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=015c2766ee8f7f740470610b79ea23a1 1650w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/code-history-compare.png?w=2500\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=4b372be77f3deda82d33d63dcf27ad3a 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`quick-picks`,children:`Quick picks`}),`\n`,_jsx(_components.p,{children:`Three buttons under the panel title pick a comparison for you.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Button`}),_jsx(_components.th,{children:`When it shows`}),_jsx(_components.th,{children:`What it compares`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Previous save`})}),_jsx(_components.td,{children:`Always. Disabled until the variation has two stored versions`}),_jsx(_components.td,{children:`The two newest stored versions, whatever stored them`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Since launch`})}),_jsx(_components.td,{children:`Once the experiment has started`}),_jsx(_components.td,{children:`The version that was current when the experiment first started, with the current code`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Since last reset`})}),_jsx(_components.td,{children:`Once the experiment’s data has been reset`}),_jsx(_components.td,{children:`The version that was current at the last data reset, with the current code`})]})]})]}),`\n`,_jsx(_components.p,{children:`“The version that was current” at a moment means: of all the versions stored\nat or before that moment, the most recent one. Launch is the first start,\nfrom draft or scheduled to running. Pausing and resuming does not move it.`}),`\n`,_jsx(_components.p,{children:`The quick picks load older versions for you when the moment falls further\nback than the list shows, up to 2,000 more.`}),`\n`,_jsx(Frame,{caption:`Since launch on a variation whose code has not changed since the test started. The note reads No code changes since launch, and only the version current at launch is selected. It is already the saved code, so there is nothing to compare.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=63db7347d6b7f7292344efa155303f25`,alt:`History panel after Since launch, with the note No code changes since launch under the quick pick buttons and only revision 4 ticked`,\"data-og-width\":`2400`,width:`2400`,\"data-og-height\":`1133`,height:`1133`,\"data-path\":`images/since-launch.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?w=280\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=cff74dea23ea6b0de08032215e28af53 280w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?w=560\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=48023b915aadcc05e7e4195150029de7 560w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?w=840\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=4121d70efd994ddb8c7fb69564625c19 840w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?w=1100\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=ec362ad6b2913aeee4978e27e3e2c3ad 1100w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?w=1650\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=81d8f7d7229b0f9021299fdf8e22c25f 1650w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/since-launch.png?w=2500\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=c658a9bc9edc7e9bd6d522dd5b341601 2500w`})}),`\n`,_jsx(Heading,{level:`3`,id:`notes-under-the-buttons`,children:`Notes under the buttons`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Note`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`No code changes since launch`})}),_jsx(_components.td,{children:`The code now is the code at launch. Only that version is selected, because there is nothing to compare`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`No code changes since the last reset`})}),_jsx(_components.td,{children:`The same, for the last reset`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`History starts on`}),` and a date`]}),_jsx(_components.td,{children:`The launch or reset happened before the oldest stored version, so the oldest version is compared instead. The date shows in your browser’s format, for example Jul 14, 2026`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Showing the latest`}),` and a number of versions, then `,_jsx(_components.strong,{children:`Load older versions to go further back.`})]}),_jsxs(_components.td,{children:[`The history is longer than a quick pick loads, and the moment falls before everything loaded. Click `,_jsx(_components.strong,{children:`Load older versions`}),` and pick again`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`No saved versions to compare yet`})}),_jsx(_components.td,{children:`The variation has no stored versions`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Couldn’t read the launch date`}),` or `,_jsx(_components.strong,{children:`Couldn’t read the reset date`})]}),_jsx(_components.td,{children:`The experiment’s date could not be read. Reload the page`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`restore-an-older-version`,children:`Restore an older version`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Click Restore this version`,children:_jsx(_components.p,{children:`In History, on the version you want back.`})}),_jsx(Step,{title:`Check the draft`,children:_jsxs(_components.p,{children:[`The panel closes and the variation’s code opens in the editor with that\nversion loaded as an unsaved draft. When it differs from the saved code,\nReview changes is already on, open on a file that changed, and the button\nreads `,_jsx(_components.strong,{children:`Back to editor`}),`.`]})}),_jsx(Step,{title:`Save it, or cancel`,children:_jsxs(_components.p,{children:[`Nothing is saved until you click `,_jsx(_components.strong,{children:`Save`}),`. `,_jsx(_components.strong,{children:`Cancel`}),` drops the draft\nand leaves the saved code as it was.`]})})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A version that differs only in its libraries`}),` opens in Review changes\nwith the same code on both sides. The library line under the header names\nwhat the restore adds or removes. See\n`,_jsx(_components.a,{href:`/build/review-changes#library-changes`,children:`library changes`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A version identical to the saved code`}),`, with the same JavaScript, CSS\nand libraries, has nothing to restore. Its button is disabled with the\ntooltip `,_jsx(_components.strong,{children:`This is already the saved code.`}),`, and the same words show on its\nrow. That happens once its code has been loaded, for example by comparing\nit. If you click Restore before that, the panel says so and restores\nnothing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The save is an ordinary save.`}),` It goes through every check any save\ndoes: your access, the lock, the reset or keep data question, the library\nrules, the syntax check and `,_jsx(_components.a,{href:`/build/code-check`,children:`code check`}),`. Restoring is\nnever a way around one of them.`]}),`\n`]}),`\n`,_jsx(Frame,{caption:`A restored version opens as an unsaved draft in Review changes, with the saved code on the left. This one also adds a library, named in the line under the header.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=3b97658978716c09acc3ad9a63384e50`,alt:`Inline editor in Review changes after a restore, with the line Libraries: adds dayjs under the header and the saved code next to the restored version`,\"data-og-width\":`2400`,width:`2400`,\"data-og-height\":`1033`,height:`1033`,\"data-path\":`images/restore-review-libraries.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?w=280\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=b35c88845f77b7849d6ea663583c49fb 280w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?w=560\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=3f62c8e0d873b6bbdf6d44c584a7e8bc 560w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?w=840\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=918ecfe74ac408dc28a9879a65c97a2b 840w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?w=1100\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=1f15fc3024ef86069ca5b99d0ae1ad84 1100w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?w=1650\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=deaf385b69ee1edacbc00ff0b993bcf6 1650w, https://mintcdn.com/abtestly/2ef-8o-PecV6cU5l/images/restore-review-libraries.png?w=2500\u0026fit=max\u0026auto=format\u0026n=2ef-8o-PecV6cU5l\u0026q=85\u0026s=418fa8df42a38a25ee87137f35903a14 2500w`})}),`\n`,_jsx(Heading,{level:`3`,id:`when-restore-is-unavailable`,children:`When Restore is unavailable`}),`\n`,_jsxs(_components.p,{children:[`When you cannot restore, the panel says why near the top and every `,_jsx(_components.strong,{children:`Restore\nthis version`}),` button is disabled with the same words as its tooltip. The\nreasons are checked in this order:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Message`}),_jsx(_components.th,{children:`Why`}),_jsx(_components.th,{children:`What to do`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Viewers can’t restore versions.`})}),_jsx(_components.td,{children:`You are a Viewer. Viewers can open History and compare`}),_jsx(_components.td,{children:`Ask a Dev or an Admin`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`You need code editor access to restore versions. Ask an admin to grant it from Team \u0026 access.`})}),_jsxs(_components.td,{children:[`You do not have `,_jsx(_components.strong,{children:`Code editor access`}),` on this site`]}),_jsxs(_components.td,{children:[`Ask an Admin for `,_jsx(_components.strong,{children:`Code editor access`}),` on the site`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`This experiment is archived, so its code can’t be restored.`})}),_jsx(_components.td,{children:`Archived experiments cannot be edited`}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/build/clone`,children:`Clone`}),` the experiment and work on the code in the new draft`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`You can’t edit this experiment’s code.`})}),_jsx(_components.td,{children:`The experiment is running or paused, so saving its code republishes it, and you cannot publish on this site`}),_jsxs(_components.td,{children:[`Ask an Admin for `,_jsx(_components.strong,{children:`Publish experiments`}),` on the site`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`This experiment is locked for editing. Pause it first, then restore.`})}),_jsx(_components.td,{children:`The running experiment has 1,000 visitors since its last reset`}),_jsx(_components.td,{children:`Pause it, restore, save, then answer the reset or keep data question`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Save or cancel your open edit first.`})}),_jsx(_components.td,{children:`The inline editor is open with unsaved changes, on this variation or another one`}),_jsx(_components.td,{children:`Save or cancel that edit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`An unsaved draft is waiting. Recover or discard it in the editor first.`})}),_jsx(_components.td,{children:`A recovery banner is waiting, or this variation has an autosaved draft from an earlier visit`}),_jsxs(_components.td,{children:[`Open that variation’s editor and click `,_jsx(_components.strong,{children:`Recover`}),` or `,_jsx(_components.strong,{children:`Discard`})]})]})]})]}),`\n`,_jsx(_components.p,{children:`The last two exist so a restore never overwrites work you have not saved.\nAutosave would replace a waiting draft with the restored code within about a\nsecond, before you ever saw it.`}),`\n`,_jsxs(_components.p,{children:[`The panel checks again when a version’s code arrives. If something changed\nwhile it loaded, for example you started typing, you see `,_jsx(_components.strong,{children:`Can’t restore this\nversion`}),` with the reason, and nothing changes.`]}),`\n`,_jsx(Heading,{level:`3`,id:`libraries-in-a-restored-version`,children:`Libraries in a restored version`}),`\n`,_jsxs(_components.p,{children:[`A version holds its library keys as well as its code, and restoring brings\nthem back. `,_jsx(_components.strong,{children:`Save`}),` sends them with the code, and the save applies the usual\nlibrary rules:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A library the variation already has is kept, even if it has been deprecated\nsince.`}),`\n`,_jsxs(_components.li,{children:[`A library the variation does not have now counts as newly attached. That\nneeds Dev libraries on your plan (`,_jsx(_components.strong,{children:`Pro and above`}),`) and the library\napproved for the site under `,_jsx(_components.strong,{children:`Site → Developer libraries`}),`. Otherwise the\nsave is refused and nothing is stored. Remove the library in `,_jsx(_components.strong,{children:`Libraries`}),`,\nor approve it, then save again.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/build/dev-libraries`,children:`Dev libraries`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`autosave-keeps-a-restored-draft`,children:`Autosave keeps a restored draft`}),`\n`,_jsxs(_components.p,{children:[`After a restore, autosave treats the restored code as your draft and mirrors\nit to this browser within about a second, the same as your typing. It keeps\nthe libraries too when they differ from the saved ones. If the page reloads\nbefore you save, the recovery banner offers the draft back, and `,_jsx(_components.strong,{children:`Recover`}),`\nputs back the code and the libraries.`]}),`\n`,_jsxs(_components.p,{children:[`If someone saves the variation in the meantime, the banner warns `,_jsx(_components.strong,{children:`Unsaved\nchanges found, but the saved code has changed`}),` and the button reads\n`,_jsx(_components.strong,{children:`Recover anyway`}),`, because recovering replaces the newer saved code with your\ndraft. The same warning appears when your draft changed the libraries and\nsomeone has since changed the saved libraries. Use `,_jsx(_components.strong,{children:`Compare with saved`}),` in\nthe banner to see both first. See\n`,_jsx(_components.a,{href:`/build/autosave#recovering-an-unsaved-draft`,children:`Autosave and drafts`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`reference`,children:`Reference`}),`\n`,_jsx(Heading,{level:`3`,id:`what-stores-a-version`,children:`What stores a version`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Source label`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`A save that changes the JavaScript, the CSS or the library keys, from either editor. A new library load order counts`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Saved`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Creating an experiment, one version per variation`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Created`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cloning an experiment, one version per variation of the clone`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Cloned`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Drafting an experiment from a Signals scan`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`From Signals`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`History beginning on an experiment that already existed`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Baseline`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Finding saved code that is missing from the history`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Recovered`})})]})]})]}),`\n`,_jsx(_components.p,{children:`These store nothing new:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A save that leaves the code and the libraries as they were. Changing only a\nvariation’s weight or name, the goals, the targeting, the schedule or the\ntraffic split stores no version.`}),`\n`,_jsx(_components.li,{children:`Starting, pausing, resuming or archiving the experiment.`}),`\n`,_jsx(_components.li,{children:`Autosave. Drafts in your browser never reach history.`}),`\n`,_jsx(_components.li,{children:`Restoring. Only the save after it stores a version.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`A variation’s name is not part of a version, so renaming one stores nothing.\nThe panel title uses the name it has now.`}),`\n`,_jsx(_components.p,{children:`If you remove a variation, its versions are kept, but History is only offered\non variations the experiment still has.`}),`\n`,_jsx(Heading,{level:`3`,id:`who-can-see-and-restore`,children:`Who can see and restore`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{children:`Admin`}),_jsx(_components.th,{children:`Dev`}),_jsx(_components.th,{children:`Viewer`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Open History and compare versions`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Yes, on sites they can access`}),_jsx(_components.td,{children:`Yes, on sites they can access`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Restore a version into the editor`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`With `,_jsx(_components.strong,{children:`Code editor access`}),`, when they can edit the experiment’s code`]}),_jsx(_components.td,{children:`No`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Save the restored version`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`With `,_jsx(_components.strong,{children:`Code editor access`}),`, plus `,_jsx(_components.strong,{children:`Publish experiments`}),` when the experiment is running or paused`]}),_jsx(_components.td,{children:`No`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`A member scoped to some sites cannot open History for experiments on other\nsites. See `,_jsx(_components.a,{href:`/team/members-and-roles`,children:`Members and roles`}),` and the\n`,_jsx(_components.a,{href:`/team/permissions-catalog`,children:`Permissions catalog`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`retention-and-limits`,children:`Retention and limits`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Kept for the life of the experiment.`}),` Nothing is pruned on a timer.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Stored in full.`}),` Each file can be up to 500,000 characters, the same\nlimit a save has. A version is never shortened.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Archiving keeps them.`}),` Versions are deleted when the experiment is\npermanently deleted, when its site is deleted, and when the account is\nclosed.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`/team/activity-log#code-changes`,children:`Activity log`}),` also shows code changes,\nbut it keeps workspace changes for 6 months only, and it does not keep a file\nover 32 KB in full. Code history is the complete record.`]}),`\n`,_jsx(Heading,{level:`3`,id:`keyboard-shortcuts`,children:`Keyboard shortcuts`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Keys`}),_jsx(_components.th,{children:`Where`}),_jsx(_components.th,{children:`What happens`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Ctrl+S (Cmd+S on a Mac)`}),_jsx(_components.td,{children:`The inline editor, or its Review changes comparison`}),_jsx(_components.td,{children:`Saves the variation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Ctrl+S (Cmd+S)`}),_jsx(_components.td,{children:`Compare with saved in the experiment editor`}),_jsx(_components.td,{children:`Nothing. Save with the experiment editor’s own button`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Esc`}),_jsx(_components.td,{children:`Any comparison with a close button: Review changes, Compare with saved, a recovered draft, a History comparison`}),_jsx(_components.td,{children:`Closes the comparison. An open find widget, suggestion list, command palette or other editor popup, a selection or extra cursors take the Esc first`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Esc`}),_jsx(_components.td,{children:`The History panel, with no comparison open`}),_jsx(_components.td,{children:`Closes the panel`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Esc`}),_jsx(_components.td,{children:`The full screen editor, outside the comparison`}),_jsx(_components.td,{children:`Leaves full screen`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`api`,children:`API`}),`\n`,_jsxs(_components.p,{children:[`Two read only endpoints list a variation’s versions and return one version\nwith its code. See `,_jsx(_components.a,{href:`/developer/rest-api#variant-code-history`,children:`variant code history`}),`\nin the REST API reference. No endpoint writes versions: they are stored only\nas a side effect of the saves above.`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(Heading,{level:`3`,id:`why-does-a-version-say-recovered`,children:`Why does a version say Recovered?`}),`\n`,_jsxs(_components.p,{children:[`Storing a version happens after the save itself, and if it fails the save is\nkept anyway. Your code was saved, but the history missed that version. The\nnext time ABTestly writes to the history for that experiment, it finds that\nthe saved code differs from the newest version and stores the missing code as\n`,_jsx(_components.strong,{children:`Recovered`}),`, dated when that code was saved. Until then, History shows\n`,_jsx(_components.a,{href:`#current-not-yet-in-history`,children:`Current (not yet in history)`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A Recovered version has no author recorded, because ABTestly cannot know who\nsaved that code. Its author shows as `,_jsx(_components.strong,{children:`Author not recorded`}),`. To find who\nsaved it, look for the save in the `,_jsx(_components.a,{href:`/team/activity-log`,children:`Activity log`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`why-does-since-launch-say-history-starts-on-a-date`,children:`Why does Since launch say History starts on a date?`}),`\n`,_jsxs(_components.p,{children:[`The experiment launched before the oldest stored version. That happens with\nexperiments that existed before code history: their first version is a\n`,_jsx(_components.strong,{children:`Baseline`}),` dated at the variation’s last save. If the variation was saved\nafter launch, the code that actually ran at launch was never stored, so\nHistory compares the oldest version it has and tells you where its record\nstarts. The same applies to `,_jsx(_components.strong,{children:`Since last reset`}),` when the last reset came\nbefore the oldest version. If the variation had not been saved since launch,\nthe Baseline is the launch code and no note appears.`]}),`\n`,_jsx(Heading,{level:`3`,id:`why-is-review-changes-greyed-out-right-after-i-saved`,children:`Why is Review changes greyed out right after I saved?`}),`\n`,_jsxs(_components.p,{children:[`Once the save goes through, your draft is the saved code, so there is\nnothing left to compare. Open `,_jsx(_components.strong,{children:`History`}),` and click `,_jsx(_components.strong,{children:`Previous save`}),` to see\nwhat that save changed.`]}),`\n`,_jsx(Heading,{level:`3`,id:`two-versions-show-the-same-code-why-are-they-separate-versions`,children:`Two versions show the same code. Why are they separate versions?`}),`\n`,_jsxs(_components.p,{children:[`Look under the `,_jsx(_components.strong,{children:`Comparing revision`}),` heading. When the libraries differ, a\ndifferent library or the same libraries in a new order, a line there names\nthe difference, for example `,_jsx(_components.strong,{children:`Libraries: same libraries in a new load\norder`}),`. Whitespace changes show in the comparison too, so check the\nhighlighted lines as well. Two versions that are not next to each other can\nalso hold the same code, for example when a later save put back older code.`]}),`\n`,_jsx(Heading,{level:`3`,id:`why-does-the-author-say-former-member`,children:`Why does the author say Former member?`}),`\n`,_jsxs(_components.p,{children:[`The person who saved that version no longer has an account. The version and\nits code are kept. A `,_jsx(_components.strong,{children:`Recovered`}),` version shows `,_jsx(_components.strong,{children:`Author not recorded`}),`\ninstead, and a `,_jsx(_components.strong,{children:`Baseline`}),` version shows `,_jsx(_components.strong,{children:`Code before history began`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`why-can’t-i-find-history-on-a-variation`,children:`Why can’t I find History on a variation?`}),`\n`,_jsxs(_components.p,{children:[`History sits above a variation’s code, so it is offered wherever the code\nis. The Original shows its code section only when it has code, and variations\nin a `,_jsx(_components.a,{href:`/build/redirect-tests`,children:`Split URL test`}),` carry a redirect instead of code,\nso neither offers History. A variation that was removed from the experiment\nhas no row to open.`]}),`\n`,_jsx(Heading,{level:`3`,id:`can-i-get-back-code-from-before-code-history-existed`,children:`Can I get back code from before code history existed?`}),`\n`,_jsxs(_components.p,{children:[`No. The `,_jsx(_components.strong,{children:`Baseline`}),` is the oldest version History has. For saves in the last\n6 months, the `,_jsx(_components.a,{href:`/team/activity-log#code-changes`,children:`Activity log`}),` may still hold\nthe before and after.`]}),`\n`,_jsx(Heading,{level:`3`,id:`does-restoring-change-anything-on-my-site`,children:`Does restoring change anything on my site?`}),`\n`,_jsx(_components.p,{children:`No. Restoring only loads the version into your editor. Your site changes when\nyou save, and on a running experiment that save republishes it.`}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Review changes`,href:`/build/review-changes`,children:_jsx(_components.p,{children:`Compare unsaved edits with the saved code before you save.`})}),_jsx(Card,{title:`Autosave and drafts`,href:`/build/autosave`,children:_jsx(_components.p,{children:`The local draft that recovery and restore both work with.`})}),_jsx(Card,{title:`Editing a running test`,href:`/results/editing-a-running-test`,children:_jsx(_components.p,{children:`What happens to your data when you change code on a test that is running.`})}),_jsx(Card,{title:`Activity log`,href:`/team/activity-log`,children:_jsx(_components.p,{children:`Who changed what across the workspace, for six months.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Code history","description":"Every saved version of a variation's JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.","href":"/build/code-history"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Open History","slug":"open-history","depth":2,"children":[]},{"title":"What each version shows","slug":"what-each-version-shows","depth":2,"children":[{"title":"Sources","slug":"sources","depth":3,"children":[]},{"title":"Current (not yet in history)","slug":"current-not-yet-in-history","depth":3,"children":[]}]},{"title":"Compare two versions","slug":"compare-two-versions","depth":2,"children":[]},{"title":"Quick picks","slug":"quick-picks","depth":2,"children":[{"title":"Notes under the buttons","slug":"notes-under-the-buttons","depth":3,"children":[]}]},{"title":"Restore an older version","slug":"restore-an-older-version","depth":2,"children":[{"title":"When Restore is unavailable","slug":"when-restore-is-unavailable","depth":3,"children":[]},{"title":"Libraries in a restored version","slug":"libraries-in-a-restored-version","depth":3,"children":[]},{"title":"Autosave keeps a restored draft","slug":"autosave-keeps-a-restored-draft","depth":3,"children":[]}]},{"title":"Reference","slug":"reference","depth":2,"children":[{"title":"What stores a version","slug":"what-stores-a-version","depth":3,"children":[]},{"title":"Who can see and restore","slug":"who-can-see-and-restore","depth":3,"children":[]},{"title":"Retention and limits","slug":"retention-and-limits","depth":3,"children":[]},{"title":"Keyboard shortcuts","slug":"keyboard-shortcuts","depth":3,"children":[]},{"title":"API","slug":"api","depth":3,"children":[]}]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[{"title":"Why does a version say Recovered?","slug":"why-does-a-version-say-recovered","depth":3,"children":[]},{"title":"Why does Since launch say History starts on a date?","slug":"why-does-since-launch-say-history-starts-on-a-date","depth":3,"children":[]},{"title":"Why is Review changes greyed out right after I saved?","slug":"why-is-review-changes-greyed-out-right-after-i-saved","depth":3,"children":[]},{"title":"Two versions show the same code. Why are they separate versions?","slug":"two-versions-show-the-same-code-why-are-they-separate-versions","depth":3,"children":[]},{"title":"Why does the author say Former member?","slug":"why-does-the-author-say-former-member","depth":3,"children":[]},{"title":"Why can’t I find History on a variation?","slug":"why-can’t-i-find-history-on-a-variation","depth":3,"children":[]},{"title":"Can I get back code from before code history existed?","slug":"can-i-get-back-code-from-before-code-history-existed","depth":3,"children":[]},{"title":"Does restoring change anything on my site?","slug":"does-restoring-change-anything-on-my-site","depth":3,"children":[]}]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/abtestly/2b7ba09c10a131d7/chat-widget.js","/_mintlify/custom/abtestly/99bdab09a5894d14/consent.js","/_mintlify/custom/abtestly/247c45f8fadb8f9c/docs-code-copy.js","/_mintlify/custom/abtestly/8b522d54658179ab/ga4-init.js"],"subdomain":"abtestly","siteName":"ABTestly","title":"Code history - ABTestly","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-12T19:14:27.761Z","gitLastModified":"2026-09-12T18:41:04.000Z","originalFileLocation":"build/code-history.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Every saved version of a variation\u0026#x27;s JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ABTestly\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Code history - ABTestly\">\u003cmeta data-mint-head property=\"og:description\" content=\"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ABTestly Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.abtestly.com/build/code-history\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.abtestly.com/images/og-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Code history - ABTestly\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"ABTestly documentation: code-first A/B testing for CRO developers, agencies, and technical growth teams. Covers experiment setup, targeting, analytics integrations, and the developer API.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.abtestly.com/images/og-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/abtestly/8M9DcmNH08KxZUPp/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ABTestly\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2563EB\">\u003cmeta data-mint-head name=\"og:logo\" content=\"https://abtestly.com/assets/favicon.svg\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"ABTestly Documentation. Code-first A/B testing, documented.\">\u003cmeta data-mint-head name=\"twitter:image:alt\" content=\"ABTestly Documentation. Code-first A/B testing, documented.\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.abtestly.com/build/code-history\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/build/code-history.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.abtestly.com/#organization\",\"name\":\"ABTestly\",\"url\":\"https://docs.abtestly.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/abtestly/00G4YX1JcYDGimmE/logo/light.svg?fit=max\u0026auto=format\u0026n=00G4YX1JcYDGimmE\u0026q=85\u0026s=8e30c68a69d5838fd283382cc9a3041c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.abtestly.com#website\",\"name\":\"ABTestly\",\"url\":\"https://docs.abtestly.com\",\"publisher\":{\"@id\":\"https://docs.abtestly.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.abtestly.com/build/code-history#webpage\",\"url\":\"https://docs.abtestly.com/build/code-history\",\"name\":\"Code history\",\"description\":\"Every saved version of a variation's JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.\",\"dateModified\":\"2026-09-12T18:41:04.000Z\",\"isPartOf\":{\"@id\":\"https://docs.abtestly.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.abtestly.com/build/code-history#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.abtestly.com/build/code-history#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Build a test\",\"item\":\"https://docs.abtestly.com/build/create\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Code history\",\"item\":\"https://docs.abtestly.com/build/code-history\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.abtestly.com/build/code-history#article\",\"headline\":\"Code history\",\"name\":\"Code history\",\"description\":\"Every saved version of a variation's JavaScript, CSS and libraries, kept for the life of the experiment. Compare any two, see what changed since launch or the last reset, and restore an older version as a draft.\",\"url\":\"https://docs.abtestly.com/build/code-history\",\"mainEntityOfPage\":{\"@id\":\"https://docs.abtestly.com/build/code-history#webpage\"},\"image\":\"https://docs.abtestly.com/images/og-image.png\",\"dateModified\":\"2026-09-12T18:41:04.000Z\",\"publisher\":{\"@id\":\"https://docs.abtestly.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.abtestly.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ABTestly\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ABTestly","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"ABTestly Documentation: Code-first A/B Testing","sidebarTitle":"Introduction","href":"/introduction"},{"title":"Run your first A/B test in about fifteen minutes","sidebarTitle":"Quickstart","href":"/quickstart"},{"title":"How ABTestly works","href":"/concepts/how-it-works"},{"title":"Documentation index","href":"/index"},{"title":"Documentation changelog","href":"/changelog"}]},{"group":"Install","pages":[{"title":"Install the snippet","href":"/install/snippet"},{"title":"Verify the snippet is working","href":"/install/verify"},{"title":"Single-page apps","href":"/install/spa"},{"title":"Consent \u0026 deferred mode","href":"/install/consent"},{"title":"Visitor opt-out","href":"/install/opt-out"}]},{"group":"Build a test","pages":[{"title":"Create an experiment","href":"/build/create"},{"title":"JavaScript and CSS variations","sidebarTitle":"Variations","href":"/build/variations"},{"title":"Review changes before you save","sidebarTitle":"Review changes","description":"Compare your unsaved edits to a variation's JavaScript, CSS and libraries with the saved code, then save from the comparison or go back to the editor.","href":"/build/review-changes"},{"title":"Code history","href":"/build/code-history"},{"title":"Code check","description":"A static review of your variation JavaScript and CSS that runs on every publish, save, and resume. Warn only: it flags common mistakes but never blocks a publish.","href":"/build/code-check"},{"title":"Dev libraries","href":"/build/dev-libraries"},{"title":"Split URL redirect tests","sidebarTitle":"Redirect tests","href":"/build/redirect-tests"},{"title":"Clone an experiment","href":"/build/clone"},{"title":"Schedule an experiment","href":"/build/schedule"},{"title":"Autosave and drafts","href":"/build/autosave"}]},{"group":"Target the right visitors","pages":[{"title":"Targeting overview","href":"/targeting/overview"},{"title":"URL rules","href":"/targeting/url-rules"},{"title":"Audiences","href":"/targeting/audiences"},{"title":"Geo targeting","href":"/targeting/geo"},{"title":"Saved Locations \u0026 Audiences","href":"/targeting/saved-lists"},{"title":"Activation triggers","href":"/targeting/activation-triggers"}]},{"group":"Mutual exclusion groups","pages":[{"title":"Exclusion groups overview","href":"/exclusion-groups/overview"},{"title":"How allocation works","href":"/exclusion-groups/how-it-works"},{"title":"Long-term holdouts","href":"/exclusion-groups/holdouts"},{"title":"Managing membership","href":"/exclusion-groups/managing"}]},{"group":"Measure","pages":[{"title":"A/B test goals in ABTestly","sidebarTitle":"Goals overview","href":"/goals/overview"},{"title":"A/B test conversion goals: clicks, forms, revenue and custom events","sidebarTitle":"Goal types","href":"/goals/types"},{"title":"System default goals","sidebarTitle":"System defaults","href":"/goals/system-defaults"},{"title":"A/B test guardrail metrics and primary goals","sidebarTitle":"Primary vs guardrail","href":"/goals/primary-vs-guardrail"},{"title":"A/B test goal tracking health","sidebarTitle":"Goal firing health","href":"/goals/health"}]},{"group":"Read results","pages":[{"title":"Reading a result","href":"/results/reading-a-result"},{"title":"The three statistics engines","href":"/results/engines"},{"title":"Revenue metrics","href":"/results/revenue-metrics"},{"title":"Segments","href":"/results/segments"},{"title":"Change the baseline","href":"/results/baseline"},{"title":"Time to decision","href":"/results/time-to-decision"},{"title":"Business impact projection","href":"/results/business-impact"},{"title":"Compare LCP between A/B test variants","sidebarTitle":"Speed guardrail","href":"/results/speed-guardrail"},{"title":"The Exact Experiment Ledger","href":"/results/exact-ledger"},{"title":"Detect sample ratio mismatch and broken experiment allocation","sidebarTitle":"Sample ratio mismatch","href":"/results/srm"},{"title":"Editing a running A/B test without invalidating the results","sidebarTitle":"Editing a running test","href":"/results/editing-a-running-test"},{"title":"What the affected page loads count on your results means","sidebarTitle":"Variation errors","href":"/results/variation-errors"},{"title":"Exports","href":"/results/exports"}]},{"group":"Methodology","pages":[{"title":"Methodology","sidebarTitle":"Overview","href":"/methodology/overview"},{"title":"Underneath the statistics","sidebarTitle":"Underneath the statistics","href":"/methodology/underneath-the-statistics"},{"title":"Minimum detectable effect","sidebarTitle":"Minimum detectable effect","href":"/methodology/minimum-detectable-effect"},{"title":"Test duration","sidebarTitle":"Test duration","href":"/methodology/test-duration"},{"title":"The peeking problem","sidebarTitle":"Peeking","href":"/methodology/peeking"},{"title":"Confidence intervals","sidebarTitle":"Confidence intervals","href":"/methodology/confidence-intervals"},{"title":"Sample ratio mismatch","sidebarTitle":"Sample ratio mismatch","href":"/methodology/sample-ratio-mismatch"}]},{"group":"Signals","pages":[{"title":"Signals overview","href":"/signals/overview"},{"title":"Scan a page","href":"/signals/scan-a-page"},{"title":"Connect Google Analytics","href":"/signals/connect-google-analytics"},{"title":"Prioritize A/B test ideas: PXL scores and evidence","sidebarTitle":"Read a scan","href":"/signals/read-a-scan"},{"title":"Signals evidence contract","href":"/signals/evidence-contract"},{"title":"Build a test from an idea","href":"/signals/build-a-test"}]},{"group":"Preview \u0026 QA","pages":[{"title":"Preview links","href":"/preview/preview-modal"},{"title":"Forced variation","href":"/preview/forced-variation"},{"title":"QA session links and the QA overlay","sidebarTitle":"QA session links","href":"/preview/qa-overlay"},{"title":"Dev debugger","href":"/preview/dev-debugger"}]},{"group":"Site settings","pages":[{"title":"General settings","href":"/settings/general"},{"title":"Snippet panel","href":"/settings/snippet-panel"},{"title":"Analytics adapters","href":"/settings/analytics-adapters"},{"title":"SPA support panel","href":"/settings/spa-panel"},{"title":"Global JS","href":"/settings/global-js"},{"title":"Blocked IPs","href":"/settings/blocked-ips"},{"title":"Danger zone","href":"/settings/danger-zone"}]},{"group":"Team \u0026 access","pages":[{"title":"Members and roles","href":"/team/members-and-roles"},{"title":"Permissions catalog","href":"/team/permissions-catalog"},{"title":"Activity log","href":"/team/activity-log"}]},{"group":"Assets","pages":[{"title":"Upload an asset","href":"/assets/upload"},{"title":"How assets are served","href":"/assets/serving"},{"title":"Recycle bin","href":"/assets/recycle-bin"}]},{"group":"Integrations","pages":[{"title":"GA4 dataLayer integration","href":"/integrations/ga4-datalayer"},{"title":"GA4 export","href":"/ga4-export"},{"title":"GA4 BigQuery analysis","href":"/ga4-bigquery"},{"title":"Product analytics","href":"/product-analytics"},{"title":"Google Tag Manager","href":"/integrations/gtm"}]},{"group":"Billing","pages":[{"title":"ABTestly plans: limits, upgrades, downgrades and cancellation","sidebarTitle":"Plans \u0026 pricing","href":"/plans"},{"title":"The 14 day free trial","href":"/billing/trial"},{"title":"What is a Monthly Tracked User (MTU)","href":"/billing/mtu"},{"title":"Refunds and cancellation","href":"/billing/refunds"}]},{"group":"Trust \u0026 compliance","pages":[{"title":"Trust and compliance","href":"/trust-and-compliance"}]},{"group":"Developer reference","pages":[{"title":"window.abtestly API","href":"/developer/window-abtestly-api"},{"title":"REST API","href":"/developer/rest-api"},{"title":"Beacon protocol","href":"/developer/beacon-protocol"},{"title":"Bucketing model","href":"/developer/bucketing"},{"title":"Runtime bindings","href":"/developer/runtime-bindings"},{"title":"SPA lifecycle","href":"/developer/spa-lifecycle"},{"title":"Errors and telemetry","href":"/developer/errors-and-telemetry"},{"title":"Rate limits","href":"/developer/rate-limits"}]},{"group":"Troubleshooting","pages":[{"title":"ABTestly Script Not Working: Installation Troubleshooting","sidebarTitle":"Snippet not firing","href":"/troubleshooting/snippet-not-firing"},{"title":"Why A/B Test Results Look Wrong: SRM, Revenue and Attribution","sidebarTitle":"Numbers look wrong","href":"/troubleshooting/numbers-look-off"},{"title":"Troubleshoot CMP Consent and Deferred A/B Testing","sidebarTitle":"Consent not granting","href":"/troubleshooting/consent-stuck"},{"title":"Exclude Internal and QA Traffic from A/B Tests","sidebarTitle":"Own visits blocked","href":"/troubleshooting/blocked-ip"},{"title":"A/B Testing Diagnostic Reference: Error Codes and Debug Report","sidebarTitle":"Diagnostic reference","href":"/troubleshooting/diagnostic-reference"}]}]},"title":"Code history - ABTestly","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-BbYRHtLl.js","DynamicMarkdown-DN96a4Ur.js","zoom-image-lightbox-D7yRe3On.js","lightbox-handle-r17bVUz3.js"]}