Browse the docs

Journeys

Publishing and sharing a journey

Publish a journey, share its learner link, preview the draft, export it for an LMS, and see how many learners open and finish it.

Plans: All plansView as Markdown
On this page

Publishing a journey makes it live at its own learner link, which you can share directly or wrap in an LMS package. Journeys are available on every plan, and any member of the workspace can publish, unpublish, preview and export a journey. Building the journey itself is covered in Building a journey.

Before you start

  • Every simulation and coach the journey embeds belongs to the same workspace as the journey. An embedded item that was deleted, or that lives in another workspace, is listed as (missing) when you publish and must be removed from the journey.
  • Publishing needs a workspace with hosting, which every plan includes. Downloading an LMS package needs one of these plans: Core, Team, Enterprise.

Steps

Publish the journey

  1. Open the journey in its editor.
  2. Select Publish Changes. Any unsaved edits are saved first, so what is published is what is on screen.
  3. If the button is disabled, the draft has issues that block publishing. Hover over the button to see how many, fix them, and try again. If the server finds issues after you select the button, they are listed under Resolve these issues to publish:.
  4. If the journey embeds a simulation or coach that is not published, a Publish these first panel lists each one. Select Publish all to publish them one after another. When all of them succeed, the journey publish is tried again without another click. If one fails, the reason is shown under its row and the journey stays unpublished. If any listed item was deleted, Publish all publishes none of them: the deleted item shows "This item was deleted and must be removed from the journey." and nothing is published until you remove it from the journey.
  5. When publishing succeeds, the editor shows Journey published! Live at with the learner link, a Copy link button and a View live link.

What publishing checks:

  • Every simulation block, coach block and the coach dock is connected to a real simulation or coach. Empty placeholders are allowed in a draft but not in a published journey.
  • Every checkpoint, path and scorecard entry points at a simulation block or knowledge check that exists in the journey.
  • No checkpoint locks a page or chapter behind a simulation, simulation bank, knowledge check or page that sits inside that same page or chapter. A learner could never unlock it.
  • Every simulation block that shows a character has a character portrait chosen. In a simulation bank set to show a character, a simulation that has a character chosen must have its portrait. One with no character chosen is published without a character beside it.
  • Every image, video and download block has an address, every video has a title, every download and button block has a label.
  • Every custom code block has a title, which screen readers say, and its code. Notes chosen under Beside the simulation on a simulation or simulation bank are written: otherwise the message reads "write the notes, or remove them".
  • Every knowledge check question and option has its text, and each question has its correct option marked (exactly one for a question that does not allow multiple answers).
  • A simulation bank holds at least one simulation and no more than 20, each one chosen, and Simulations each learner gets is a whole number of at least one and no more than the number of simulations in the bank. Its Pass mark is a percentage.
  • A simulation appears once in the journey, in one simulation block or one bank: otherwise the message reads "this simulation is already used in this journey" followed by where it was first used and "A simulation can appear once, because its result is recorded once".
  • No checkpoint, path or scorecard entry points at a simulation inside a bank. The messages read "this simulation is inside a simulation bank and may not be drawn. Require the bank instead", "a simulation inside a simulation bank cannot start a path. Choose another or remove the branch" and "this simulation is inside a simulation bank. Score the bank instead".
  • Every bank requirement and bank scorecard component has a bank chosen, and the bank is in the journey: "choose a simulation bank for this requirement", "the simulation bank this requirement points to is not in the journey. Choose another or remove the requirement", "choose a simulation bank for this scorecard component" and "the simulation bank this component scores is not in the journey. Choose another or remove the component".
  • Every Knowledge check passed requirement has a check chosen, every Pages viewed requirement has at least one page, and a scorecard that is turned on has at least one component.
  • Every theme color is a hex code, such as #1a2b3c or #abc.
  • A simulation that shows a character does not use a custom character that is not ready or is no longer in this workspace. The message names a character that is not ready. Finish its images, or choose another character for that simulation, then publish again. A simulation set to Notes or Nothing under Beside the simulation is not checked, whatever character it was given before.
  • Every embedded simulation and coach is published. This is checked again on the server at the moment of publishing, and not afterwards: if you later unpublish or delete a simulation or coach that a published journey embeds, the journey stays published, and in place of that item learners see "Simulation not found or not available." or "Coach not found or not available." A checkpoint that requires that item can then no longer be met, so learners cannot get past it.

A draft with any of these unfinished still saves, with these exceptions, which stop the draft from saving: a simulation used a second time where a bank is involved, a bank with no simulations or more than 20, a Simulations each learner gets value outside its range, and a Pass mark that is not a percentage. Two simulation blocks that use the same simulation still save and are refused only at publish. The count beside the save indicator in the editor lists what to fix before publishing, except for the last two checks in the list, which are made only when you select Publish Changes.

Journey publishing has no moderation step of its own.

Publishing and unpublishing act on the journey as it was when you selected the button. If the journey is saved in between, for example by a teammate or from another tab, nothing changes and you see "This journey changed while it was being published. Review it and publish again." or "This journey changed while it was being unpublished. Try again."

A published journey is a snapshot. Learners keep seeing the last published version while you edit the draft, and your edits reach them only when you select Publish Changes again. Each publish also adds an entry to the journey's Version history.

Journeys can also be published and unpublished from Publish → Overview, which lists journeys alongside simulations and coaches.

Unpublish the journey

  1. In the journey editor, select Unpublish. The button appears only while the journey is published.
  2. Confirm in the Unpublish this journey? dialog.

The learner link stops working right away and shows a not-found page until you publish again. An LMS package for the journey stops working too, because the package loads the learner link. Your draft is not changed.

The learner link has the form /j/ followed by the journey's key. Anyone who has the link can open a published journey. No sign-in is asked for. The link can be placed in a frame on another site, such as a course page.

Copy the link from the banner shown after publishing, or open the Publish stage of the journey editor and use Copy link or View live.

Preview the draft

  1. In the journey editor, select Preview. The preview opens in a new tab at the learner link followed by /preview.
  2. Use Desktop and Mobile to switch between a full-width view and a phone-sized frame.
  3. When the journey is published, Copy share link copies the learner link. When it is not, the button reads Publish first to share and is disabled.

The preview shows the draft, not the published snapshot, under a banner that marks it as a draft preview. It requires sign-in, and it opens for any member of the workspace that owns the journey, even when a different workspace is active. Everyone else sees a not-found page.

In the preview, embedded simulations and coaches load even when they are still drafts. The access that allows this lasts 60 minutes from when the page loads, so reload the preview after a long break. The preview starts from the beginning on every load, saves no progress, and is never counted in Results.

To collect comments from someone outside the workspace, open the Publish stage of the journey editor and select Create review link under Share for review. A reviewer sees the published snapshot when the journey is published and the draft when it is not. A review link cannot be created while the version the reviewer would see embeds an unpublished or deleted simulation or coach. For a published journey, an unpublished item that is only in the newer draft does not block the link. The same Publish these first panel appears. See Stakeholder review links and comments for how links, expiry and comments work.

Export for an LMS

  1. Publish the journey. Until it is published, Export in the header and Export for LMS… on the Publish stage are disabled, with the reason "Publish this journey to export it for your LMS". On a plan without LMS packages, both are disabled whether or not the journey is published, and the reason names the plans that include them.
  2. Select Export in the editor header, or Export for LMS… on the Publish stage.
  3. In Export for LMS, choose SCORM 1.2, SCORM 2004 or xAPI (Tin Can).
  4. Select Download package and upload the zip file to your LMS.

The package does not contain the journey. It opens the live learner link in a frame, so when you publish changes, learners in the LMS get them without a new upload. Learners need an internet connection, and the package shows a notice when the journey cannot be loaded.

What the package reports when the learner finishes the journey:

  • SCORM 1.2: the lesson is marked incomplete at launch, unless the LMS already holds it as passed, failed or completed. On finish, the status becomes passed or failed when the scorecard reached a result, and the score is recorded as a percentage. Otherwise the status becomes completed and no score is recorded.
  • SCORM 2004: the lesson is marked incomplete at launch, unless the LMS already holds it as completed. On finish, completion is set to completed. Success is set to passed or failed, and the score is recorded, only when the scorecard reached a result.
  • xAPI (Tin Can): an initialized statement is sent at launch, then a passed or failed statement that carries the score when the scorecard reached a result, or a completed statement with no pass or fail result and no score otherwise. A terminated statement follows the result when the learner has no restart left. Otherwise it is sent when the learner leaves the package after finishing at least once, and a learner who leaves before finishing gets no terminated statement. Statements are sent only when the LMS launch supplies a record store address and a learner.

A simulation bank counts as one component of the scorecard, so a package needs no new export: it reports the journey's pass, score and completion as before.

A journey without a scorecard reports as completed, with no pass or fail result and no score. With a scorecard, the pass or fail result and the score come from the scorecard. A learner who finishes before the scorecard can decide a result, because some components are not done, is reported as completed, with no pass or fail result and no score.

In both SCORM formats, the best result is kept. A passed result that the LMS already holds is replaced only by a pass with a higher score: a later failed result, or a later finish with no pass or fail result, does not replace it or its score. Otherwise a later result replaces the one held only when it is a pass or has a higher score. The journey itself also reports the best result of any run, after a restart (see Restart inside an LMS package below).

What is reported on finish comes from the live journey, so it applies to every package, including ones already uploaded to an LMS. Keeping a finished lesson's status at launch, keeping the best result, and recording a result after a restart are part of the package file, so a package downloaded before a rule was added does not follow it. A package from before the launch rule marks the lesson incomplete at every launch. A package from before restarts reports only the first result (see Restart inside an LMS package below). Export the journey again and upload the new package to get every rule.

Both SCORM formats also save the learner's place in the LMS, so a learner who returns on another device resumes where they left off. If the saved progress is too large for the LMS field, that save is skipped. The xAPI package does not save progress in the LMS and relies on the learner's browser.

The export is limited to a number of requests a minute for each person.

Result

What learners see

The learner link opens the journey in its own theme on the Core plan or higher, and on any plan for a workspace that devlin.ai has granted journeys: the background, surface, text and accent colors, corner radius, font, scene and card style set for the journey. Below those plans and without that grant, learners see the default devlin.ai theme and no scene. The stored theme is kept and shows again when the workspace upgrades. The draft preview and review links show what a learner would see.

The learner sees one full screen at a time, over a scene when the journey or the page has one. A video screen has no scene behind it.

  • Opening: when the journey has a title page turned on, it is shown first, across the whole screen. It shows the heading and the body, then a button that starts the journey. It never shows the journey's characters. The button reads Begin unless the journey sets its own label. The opening is shown only until the learner has viewed a page, and again after a restart.
  • Top bar: above every content screen, but not on the opening or the completion page, a thin bar shows Menu at the start, the current screen's title (the page's heading, or the page's name when the heading is hidden), a row of segments with one for each screen of the journey, and Back and Next arrows. Back returns to the screen before, which from a page's first screen is the last screen of the page before. On the journey's last screen the forward arrow is named Finish, because selecting it there finishes the journey. A long journey shows one continuous bar in place of the segments. A long title wraps to a second line. On a simulation, simulation bank, coach, video or custom code screen, this title is the screen's heading for screen readers, and focus moves to it after every move; a card's heading is inside the card.
  • Menu: Menu opens the list of chapters and pages over the screen, from the same side as the button, with the journey's name at its top unless the journey hides it. Visited pages show a check mark and locked pages show a lock. Unless the journey allows free navigation, a learner can jump only to pages already visited, the first page, and the next page.
  • Restart journey: the menu offers Restart journey while the journey is in progress, and the results screen offers it once the journey is finished, as long as the learner has a restart left. A journey allows any number of restarts unless its Restarts allowed setting limits them, and offers none when it is set to None. It asks "Start again from the beginning? Your progress in this journey will be cleared." with Restart and Cancel. When restarts are limited, the question adds how many are left, or "This is your last restart." Restarting clears the learner's progress, returns the learner to the opening when the journey has one, and starts every simulation and coach as a new session. Each new session is a new attempt, so it counts toward any attempt limit the simulation sets: a learner who restarts can run out of attempts at a simulation before running out of restarts. The cleared progress replaces what was saved in the browser. Inside a SCORM package it is also saved to the LMS, so the learner does not resume the earlier run on another device. Results already sent are not withdrawn. The number of restarts used is saved with the progress, so reloading the page does not give restarts back. When a run finishes, a page that frames the journey is sent the best result of any run so far, so a later run that goes worse never replaces a better result. When an earlier run went better and the completion page shows the scorecard, the results screen says "Your best result so far is" with that score, and that the best result is the one that counts. The best result is still the one reported when the scorecard is hidden.
  • Restart inside an LMS package: a SCORM package records each later result that is better than the one the LMS already holds: a pass replaces anything that is not a pass, and otherwise a higher score replaces a lower one. A pass is never replaced by a fail. An xAPI package sends a later result statement when it is better, by the same rule, than the last one it sent while the package was open. The package keeps its LMS session open after a result so that a restarted run can still be recorded, and ends it when the learner leaves, or straight after the result when the learner has no restart left. The results screen offers Restart journey inside a package once the package has said that it records later results. A package downloaded before packages did so reports only the first result: inside one, the results screen offers no restart, and the menu still offers Restart journey before the journey is finished. Download the package again to allow restarts after finishing. The journey recognises a package when the package answers its request for saved progress. When the journey is framed by a page that never answers, the results screen offers Restart journey after a few seconds. An older xAPI package, and a SCORM package exported before packages answered that request, do not answer it: there the results screen still offers Restart journey, and only the first run's result is sent.
  • Screens: a page is shown as one or more screens. Text, callouts, images, downloads, dividers, buttons and knowledge checks that follow one another share a card. A simulation, a coach and a video each take a screen of their own. Next moves through a page's screens and then to the next page. The left and right arrow keys move between screens in the same way: the arrow that points the way Next points goes forward and the other goes back, so the two keys are swapped in a language read from right to left. They do nothing while the learner is typing, answering a question, using a video's controls or working inside a simulation or coach, while the menu or the coach panel is open, and on the opening and the completion page. The forward key does nothing where Next is unavailable. An arrow key never finishes the journey: finishing takes Finish, either the button on the screen or the top bar's forward arrow, which is named Finish on the last screen.
  • Moving on: a card with no button of its own ends with Continue, right after its last block. On a card with a knowledge check, Continue appears once the learner has answered it. Continue is the size of the journey's body text and starts on the same edge as the content above it. A simulation, coach or video screen has a Continue button of its own; on a simulation screen it sits under the simulation, at its start edge, and appears once the simulation has finished, and until then a line in the same place reads "Finish the simulation to continue." (on a bank's call, "Finish this call to continue."). When the journey is set to Move on when a simulation finishes, the finished simulation's screen also shows "Moving on in" with the seconds left and Stay here, and moves to the next screen when the countdown ends. A custom code screen has Continue in a bar under it. On the last screen the button reads Finish, and so does the top bar's forward arrow. Next is unavailable while a simulation on the screen has not finished, and while the next page is locked. A coach, a video and a knowledge check do not hold Next: the learner can move on without finishing them, unless a checkpoint on the next page requires the knowledge check. The exception is the journey's last screen: an unfinished simulation there does not hold Finish, although a scorecard set to require every component still does.
  • Headings: each screen's heading is the page's heading, which can differ from the page's name in the menu. A card shows it at the top of the card. Any other screen shows it in the top bar, never over the scene. When the heading is hidden, a card shows no heading and the top bar shows the page's name.
  • Custom code: a custom code page fills the screen in a sandboxed frame. Its scripts run, but it cannot read the journey, the learner's session or their answers.
  • Simulations: an embedded simulation runs in a frame on its own screen. Its completion, pass or fail result and score are passed to the journey, which keeps the learner's best result. The simulation's start screen takes the journey's font, text sizes and spacing, and lines up with the start edge like the journey's cards, so moving from a journey screen to the simulation looks like one piece. While Use the journey's colors in simulations is on in the journey's Theme, the simulation takes the journey's background, surface, text and accent colors in the journey, with no devlin.ai gradient on its buttons and outlines, and keeps its own sizes and corners; its own appearance and its links outside the journey are not changed. With the switch off, while the journey uses the default devlin.ai colors, or where learners see the default theme (see Theme below), it keeps its own colors. When the simulation shows a character, the character stands on the stage beside it as a cut-out, with no frame, box or shadow behind it, on the side the block sets (by default the side the journey's theme sets). It fills that side of the screen from the top bar down, its feet, or the cut of a closer framing, on the bottom edge of the screen, and it is drawn as close as the journey's Character framing sets. It changes mood as the simulation sets its mood variable, and the simulation's own portrait is hidden. A simulation can show notes beside it instead, in a panel the learner can scroll, on the side the block sets. A simulation with no character or notes, or whose custom character is no longer available, is centered and wider and keeps its own portrait. On a narrow screen the character stands below the simulation, smaller, on the bottom edge, never over the message box, and the screen scrolls when the simulation and the character do not both fit, so the simulation stays reachable. Notes beside a simulation sit above it on a narrow screen and shrink first on a short one. On a very short screen, such as a phone held sideways, part of the journey can still fall outside the visible area.
  • Coaches: a coach can sit on a screen of its own or in the coach dock, a round button at the bottom of the screen that opens a panel at the side. Closing the panel keeps the conversation. On a narrow screen the panel covers the screen. The menu and the coach panel are never open together: opening one closes the other, and the conversation is kept. Escape closes whichever is open. The dock is shown on content screens, not on the opening or the completion page. A coach's start screen takes the journey's font, text sizes and spacing, like a simulation's, and a coach takes the journey's colors under the same switch, in a screen of its own and in the dock.
  • Knowledge checks: questions are shown one at a time. Check answer shows whether the answer was correct, with any feedback written for the options. After the last question, See results shows the score and Passed or Not passed. A learner who did not pass can select Retry while attempts remain. Otherwise the check shows "No attempts remaining." Attempts are counted across visits: a learner who leaves the page and returns, or reloads it, continues with the attempts they have left. A check with no attempts left shows the saved score, Not passed and "No attempts remaining." in place of the questions. A check the learner has passed shows the score and Passed and cannot be taken again. The journey keeps the best result.
  • Checkpoints: a page or chapter can stay locked until the learner passes a simulation, completes a simulation, passes a knowledge check, views certain pages, or completes or passes a simulation bank. In the list of what is left, a bank reads "Complete every call in the simulation bank on ‘’" or "Pass the simulation bank on ‘’". When the next page is locked, the page's last screen shows Complete these to continue: with a plain list of what is left in place of Continue. A button that goes to a locked page or chapter does not move the learner. The reason shows under the button, starting "Complete these to continue:" and followed by what is left. Only a path moves a learner past a lock. A button set to go to the next page moves to the page's next screen or the next page. On the journey's last screen it does nothing: finishing takes Finish.
  • Paths: when a simulation or knowledge check reports a pass or fail result that matches a path, the learner is taken to that path's page or chapter automatically, even if a checkpoint would otherwise lock it. A simulation that reports no pass or fail result does not trigger a path. A passed knowledge check triggers its path straight away. A failed knowledge check triggers its path only once the learner has no attempts left, so Retry stays available until then. A failed check with unlimited attempts never triggers a path. If several paths match, the first one in the journey applies.
  • Simulation banks: a bank shows one screen for each simulation the learner was given, in the order they were drawn. The top bar names where the learner is, for example "Call 2 of 3". A finished call that is not the last offers Take the next call, and the last offers Continue. Until a call is finished, Next is unavailable and reads "Finish this call to continue.", and the same line is shown under the call. Before the calls are drawn, for example while an LMS package is still handing over saved progress, the bank shows "Getting your calls ready." and Next reads the same. The menu lists the calls by number. The calls are drawn the first time the learner reaches the bank and kept for that attempt, so reloading the page or coming back shows the same calls. On the learner link, a new published version starts from the beginning and draws again. In a SCORM package the saved draw is kept while it still fits the bank, and is drawn again when the bank changed. A restart always draws again. A draft or preview of a bank with fewer simulations connected than it shows gives one screen for each simulation it has; publishing refuses such a bank. The best result of each call is the one that counts toward the bank.
  • Completion: selecting Finish shows the completion page as a card. When the scorecard is set to require every component, Finish is replaced by Finish these to complete the journey: until all of them are done. When the journey has a scorecard and the completion page is set to show it, the learner sees Your score, a table with each component's weight, score and status, and Passed or Not passed once the scorecard has a result. A bank's line opens to its calls, each with its score or "Not finished". When every call has the same criteria, they are added up under "Across all calls". Otherwise each call shows its own.

Embedded simulations and coaches run in frames on the same address as the journey, and the journey page passes its microphone and autoplay permission on to them, so a voice simulation or coach can use the microphone inside a journey where the browser allows it. The LMS package allows the microphone for the journey. A site that puts the learner link in a frame of its own must allow the microphone for that frame, or voice is not available there.

A simulation built for voice opens in voice inside the journey. The learner sees the simulation's start screen, if it has one, then the voice screen, and taps the microphone button (Tap to start): nothing starts by itself. In Safari the conversation opens in a small window of its own, where the learner selects Start voice session. The character's mood on the stage, the simulation's result, and any checkpoint, path or scorecard that waits on it work as they do for a text simulation. A simulation without voice opens as a text chat.

Progress and learner identity

  • Progress is saved in the learner's browser: the current page, pages viewed, simulation and knowledge check results, and whether the journey was finished. A learner who returns in the same browser resumes where they left off. A learner who has finished sees the completion page again when they return. From there, Restart journey starts the journey again from the beginning while the learner has a restart left (see Restart inside an LMS package above for packages). A different browser or device starts from the beginning, unless the journey runs inside a SCORM package.
  • The screen a learner was on inside a page is not saved. A learner who returns lands on the first screen of the page they were on.
  • Progress saved in the browser belongs to one published version. After you publish again, learners on the learner link start the new version from the beginning. Learners in a SCORM package keep the progress saved in the LMS, as long as the page they were on still exists in the new version.
  • Unless the journey asks, it does not ask learners who they are. It creates a random identifier in the browser and shares it with the simulations and coaches it embeds.
  • When the journey asks for learner identity (see Ask learners who they are once in Building a journey), a card titled "Before you start" appears after the opening, or first when there is no opening. The start button is unavailable until the required answers are filled in, and the card says "Fill in the required answers to start." Adding ?learner= and an identifier to the journey's address supplies the identifier, so it is not asked for. Its text fields keep typed text readable whatever colors the journey's theme uses. What the learner types is kept for the browser tab, so a new session asks again. It is not stored with saved progress and not sent to the LMS. Each simulation in the journey records it the way a start screen would.
  • Criteria on the results card reach the journey only from embeds on the same site as the journey, which is the case for the journey's own simulations, and they are kept for the browser session.
  • When the journey is framed by another page, it sends that page the result on finish: whether the learner passed and the score, or neither when the journey has no scorecard or the scorecard did not reach a result. After a restart it sends the best result of any run.

Views and completions

Each time a learner opens the published journey, one view is counted. When a learner selects Finish, one completion is counted. These are counts per journey per day. They are not tied to a learner, and reopening the journey counts another view. Restarting the journey also counts another view, so each run is one view and at most one completion.

Results shows them in a Journeys table with Views, Completions, Completion rate and Last activity. The table appears when at least one journey had activity in the selected date range.

Counting is best effort. Requests are limited for each network address, and a view or completion over the limit is not counted. The learner link itself is limited the same way. A learner over that limit sees "Too many requests. Please try again in a moment."

Publishing with an AI tool

AI tools connected over MCP can publish a journey's draft changes or unpublish it with set_journey_publish_state. The tool must send an explicit confirmation, and the change then applies directly, with the same checks as the editor. The exception is a workspace that requires approval for live changes over MCP: there the change waits under MCP access → Pending changes until an owner or admin approves it, and the journey is published or unpublished only then. After publishing, the result includes the learner link. See MCP server and AI tool connectors. devlin can prepare the same change, always as a proposal that you apply.