Skip to main content

The moves

In the portal: the atoms and sequences are built under Settings, then Sequences and Atoms. Several of these moves also need something outside that screen: a schedule and a condition on the journey action that delivers the card, and one setting on a surface. Each move says which.

What this page is for​

The rest of the documentation tells you what each part does. This page tells you what to build with them.

There are ten of them. Each one is a way of getting somebody to do something rather than read about it, and each one is a named construct from the behaviour-change or clinical literature. The construct's own name comes first and our plain name sits beside it, so any move on this page is a term you can take to a clinician, or search, and find the literature it came from. The sources are named at the foot of the page.

The constructOur name for itWhat it does
Implementation intentionsthe if-then planThey write what they will do and when, then meet it at the moment
Coping planningthe barrier planThey name what will get in the way, and decide now what they will do about it
Tailoringthe read-backTheir own words become the next screen
Importance and confidence rulersthe ruler and the follow-upRate it, then say what would move it one point
Self-monitoring of behaviourthe daily recordA very short entry, most days, that they can see accumulate
Graded tasksthe rampNext week's level is agreed in advance and held to
Relapse preventionafter a missSomething did not happen, so a different card goes out
Problem solvingthe narrowingThey list many ideas, rank them, then plan one
Goal specificitythe goal checkA goal is not accepted until it is specific
Acceptancesitting with itThey stay with a feeling instead of fixing it

The first two belong together. An if-then plan says when and where you will do the thing. A coping plan says what you will do when something stops you. In the trial that separated them, only the pair changed behaviour, so build them as one pass rather than picking one.

Both are if-then sentences, and Gollwitzer's own work splits them by what the plan is for: starting something, protecting something already under way, or letting go of something that is failing. The if-then plan starts. The barrier plan protects. Knowing which one you are writing tells you when to deliver it, because a plan that starts something belongs at the cue and a plan that protects something belongs at the obstacle.

Each move produces a card. Where that card lands is the delivery's surface, which every move here assumes you have already chosen. See Anatomy of a surface.

Implementation intentions: the if-then plan​

What it does. A participant writes the situation that trips them up and what they will do instead. Later, at that moment, the app shows them their own sentence.

What the participant sees
When are you most likely to skip your walk? Morning Lunchtime After work Evening What will you do instead, in that moment?
If after work, then I'll walk at lunchtime instead. That's your plan. Nothing to fill in.
How you make it
single_select IF_TRIGGER text THEN_ACTION content THE_PLAN The plan card, closing the same sitting: "**If {{ values.IF_TRIGGER }}, then {{ values.THEN_ACTION }}.**" A card on a LATER day cannot use values, which holds only what is being typed right now. Name the atoms by their id instead: "**If {{ latestAtomResponse.<trigger id> }}, then {{ latestAtomResponse.<action id> }}.**"

Why it is first on this page. Telling somebody they should walk more rarely changes what they do. Getting them to write down where and when they will walk, before the week starts, does. The evidence for it is large and well replicated. What it does not do on its own is carry somebody past the thing that stops them, which is why the next move on this page is the one that does.

How to build it.

AtomTypeWhy this type
The triggersingle_selectYou branch on this answer to choose which timed card they get, so it has to be one of a known set
The responsetextTheir words, not yours
The plancontentQuotes both back with autofill

Set the schedule before you write the card. A plan shown once at enrolment gets read and forgotten. The same plan brought back on the day and at the hour they chose is what changes what they do. Set the delivery to weekly, write out the days, and write the hour they chose into times.

Know what each half does. days decides which days the card is due. times sets when the reminder fires. The card itself sits on their feed for the whole of a due day, so times is what gets them to it at the right moment rather than a lock on the card.

Nothing reads an answer into a schedule. Give each option its own arrow out of the node, and give each branch its own delivery with that option's hour written into times. See Schedules and Common patterns.

What breaks it. Making the trigger a free-text box. It reads better and it cannot be scheduled against, so the card arrives at a time nobody chose.

The card that brings the plan back on a later day needs different tokens, as the example above shows. See Autofill for the three ranges and when each one resolves.

Coping planning: the barrier plan​

What it does. After somebody has made a plan, it asks what will get in the way, and has them decide now what they will do when it does.

What the participant sees
Which of these is most likely to stop you walking this week? It hurts No time I forget Too many exercises Low mood Nobody to go with
When it hurts, what will you do instead?pre-filled, and they can change it Do the ten minute version rather than skipping it
If it hurts, then I'll do the ten minute version. If I'm short of time, then I'll walk to the shops instead. That is your plan. Nothing to fill in.
How you make it
multi_select BARRIERS text COPE_PAIN, COPE_TIME, one per barrier content THE_PLAN Each follow-up is shown by a condition reading the list: { "field": "values.<barriers atom id>", "op": "contains", "value": "PAIN" } The plan card: "**If it hurts, then {{ values.COPE_PAIN }}.**"

Why it is here, right after the if-then plan. It is the same construct family and the protecting half of it, in Gollwitzer's terms, rather than a separate idea.

In one cardiac rehabilitation study (Sniehotta and colleagues, 2006, N=211), people were assigned to action planning, action planning plus coping planning, or a control condition. The combined group reported more exercise at two months, and the action-planning-only group did not differ from control. That is one study with a self-reported outcome, and a null result in one arm is not evidence that the arm does nothing. Read it as a good reason to build the pair, not as a reason to drop planning on its own. Coping planning is the half most people leave out.

How to build it.

AtomTypeWhy this type
What gets in the waymulti_selectYou read this to decide which follow-ups to show, so it has to be a known set
What you will do insteadtext, one per barrierTheir words, for the barriers they actually picked
The plancontentQuotes the pairs back with autofill

Offer a menu, not a blank box. The barriers people hit are much the same across a programme: it hurts, no time, forgetting, too many exercises, low mood, nobody to go with. Put those on the screen and let them add their own. A blank box asks somebody to recall barriers they have not thought about yet, and a short list gets a better answer in less time.

That list is illustrative rather than canonical. Build yours from what your own participants actually say.

Read the list with contains. A multi-answer question gives you a list, and contains is how a condition reads one. Each follow-up carries a clause naming the option it belongs to, so a participant answers only for the barriers they chose.

{ "field": "values.<the barrier atom>", "op": "contains", "value": "PAIN" }

What breaks it. Collecting the barriers and never bringing them back. A coping plan written once and never shown again on the day it applies is a survey. Deliver it the way you deliver the if-then plan, at the moment it is needed.

Tailoring: the read-back​

What it does. Opens a screen with something the participant said earlier, then asks the next thing.

What the participant sees
You said the hardest part is getting to bed on time. What is one thing that would make tonight easier than last night?
How you make it
A content atom, or the label of the next question: "**You said the hardest part is {{ values.SLEEP_BLOCKER }}.** What is one thing that would make tonight easier than last night?"

Why it works. Tailoring a message to something the person has actually told you beats a message written for nobody in particular, and it is the oldest well-evidenced idea in health communication. It is also the cheapest version of it available to you, because you write one card and every person sees their own version of it.

How to build it. One content atom, or the label of the next question, carrying a token. See Autofill for the three ranges.

Put the token on its own line. A participant who skipped the earlier question leaves the token empty, so put it on its own line after a colon rather than in the middle of a clause.

Do it more than once in a sitting. An answer given on the first page can carry into every page after it.

Importance and confidence rulers​

What it does. Asks how important a change is, and how confident they are they can make it, then asks the question that does the work: what would move that by one point?

What the participant sees
How important is it to you to be walking every day by the end of the month?slider, 0 to 10 How confident are you that you can get there?slider, 0 to 10 You said 4. What would make that one point higher?
How you make it
slider IMPORTANCE slider CONFIDENCE text WHAT_WOULD_MOVE_IT The third atom's label: "You said {{ values.CONFIDENCE }}. What would make that one point higher?" Its condition, so somebody who answered 10 never sees it: { "field": "values.<confidence atom id>", "op": "less_than", "value": 10 }

The follow-up reads their own number back, so it cannot be answered in the abstract.

Why it works. Somebody writing down what would take them from a four to a five is naming the thing that has to change, in their own words, which is more use than the number.

How to build it.

AtomTypeNotes
How importantslider0 to 10
How confidentslider0 to 10
What would move ittextCarries a condition

Put a condition on the third atom. Write it to read the confidence slider from earlier in the same sitting, and show the follow-up only when the answer is under 10. Somebody who answers 10 goes straight past it.

{ "field": "values.<the confidence atom>", "op": "less_than", "value": 10 }

Inside a form, values.<atom> holds the answers given so far in this sitting.

Name the atom by its id here, not by its code. A code works in a token and matches nothing in an in-form condition, with no error either way, so take the id from the picker rather than retyping the code you used in the copy. See Conditions.

What breaks it. Asking the follow-up of everybody. Somebody who said ten and is then asked what would improve it reads the programme as not listening.

Self-monitoring of behaviour: the daily record​

What it does. One very short entry, most days, that the participant can see building up behind them.

What the participant sees
How did the walk go today?slider, didn't happen through to easy Anything worth noting?optional
You made seven entries this week. They are all there whenever you want to look back.
How you make it
slider HOW_WAS_IT 0 to 10 text ANYTHING_ELSE optional schedule: weekly, days MO TU WE TH FR SA SU tracking: tracked, so the entries reach Progress The Sunday card is a second delivery on the same journey, not part of the daily one.

That closing line counts entries. It does not count days in a row.

Why it works. Recording a behaviour tends to change it. The reviews find self-monitoring does most where it feeds back into something the person actually uses rather than sitting in a database, so make the record visible to them.

How to build it.

PartSetting
The entryOne or two atoms, no more. A slider and an optional text is usually enough
The cadenceweekly with every day written into days
The proofLeave the sequence's tracking on tracked, which is already the default, so answers reach Progress. See Tracked and untracked

Keep a daily entry to one or two atoms. It has to be short enough to do on a bad day, which in practice means one or two atoms. If you cannot cut it to two, it is a review rather than a record, and it belongs on a weekly cadence instead.

What breaks it. Presenting the record as an unbroken run. A broken run tells somebody they have failed at the thing you were asking them to keep doing, which is a reason to stop rather than a reason to start again. Nothing in the configuration counts streaks, so this one lives entirely in your copy: write about the entries they have made, never about days in a row.

Graded tasks: the ramp​

What it does. Sets next week's level in advance, and holds it whatever the week feels like.

What the participant sees
This week: twelve minutes, four days. That is up from ten. Twelve is the number whether it feels easy on the day or hard.
This week: fifteen minutes, four days. That is up from twelve.
How you make it
One node per week, each delivering that week's own sequence. The number lives in the copy, so week three and week four are different sequences. The arrow from week three to week four: { "field": "secondsInNode", "op": "at_least", "value": 604800 } Time, never performance. A ramp that waits for a good week has stopped being a ramp.

Why it works. Graded activity runs on one rule: the level is set by the plan, not by how the day feels. A level agreed a week ahead and held to beats a level decided each morning, because deciding on the day means doing less whenever the day feels bad, and that is the pattern the programme is there to break.

Trials comparing graded activity against other forms of exercise have not settled which part of it does the work (Macedo and colleagues, 2010), so treat the pacing rule as the design principle the technique is built on rather than as a proven mechanism. Graded tasks is a named technique in the behaviour-change technique taxonomy, and it appears in the strong-evidence list of a 2023 umbrella review of behaviour-change techniques in digital health interventions, alongside prompts and cues, self-monitoring and feedback.

How to build it.

PartSetting
The stepOne node per week, each one delivering that week's sequence
The move onAn arrow with secondsInNode at least 604800
The deliveryweekly, with days written out

Write the quota into the copy. The number for the week lives in that week's sequence, which is why the ramp is a node per week rather than one node repeating. It also means you can say the number in words, which is the part the participant reads.

Gate the arrow on time, not on performance. A ramp that waits for a good week has stopped being a ramp. Use secondsInNode, which resets when they enter the node, and keep any read of how the week went for a separate card that does not decide the level.

What breaks it. Letting today's symptoms set today's level. Write the flare rule into the content instead, as a step back to the previous level for a set number of days, so the rule is agreed in advance rather than negotiated each morning.

Relapse prevention: after a miss​

What it does. Notices that something did not happen, and sends a different card because of it.

What the participant sees
You last logged a few days ago. That is normal on a twelve week programme. Pick it back up on whichever day suits this week. Start this week's plan
You have not made a first entry yet. It is two questions and about thirty seconds. Tomorrow morning is as good a place to start as any. Try it once
How you make it
Two arrows out of a self-loop, two different people. Stopped after logging for a while: { "field": "secondsInNode", "op": "at_least", "value": 259200 } Never started at all: { "field": "latestAtomResponse.<the record atom>", "op": "not_exists" } Neither card names a day or counts weeks, because a condition carries no clock and no field holds today's date. Write copy that does not need one.

Why it is here. Recovery self-efficacy is somebody's belief that they can pick a programme back up after a break. The construct is the belief; what you build is the trigger and the card that speaks to it. Every other move on this page fires when a participant does something. This one fires when they do not, which is the point most programmes go quiet.

Recovery self-efficacy is the Health Action Process Approach's name for that belief, and it is the thing your copy is either building or damaging.

How to build it. A self-loop. One node the participant comes back into every time they log, and an arrow out of it that fires when enough time has passed with nothing new.

{ "field": "secondsInNode", "op": "at_least", "value": 259200 }

Time in the node is what measures the gap. secondsInNode resets when a participant arrives at a node, so if they re-enter this node every time they log, three days in the node means three days without a log. That reset is the whole mechanism, which is why this one is a loop rather than a straight line. See Common patterns pattern 8 for the loop and pattern 9 for the routing.

not_exists is a different test, and it is worth having as well. It is true when there is no answer to that atom at all, from any source, ever. That is the person who never started, not the person who has stopped: once somebody has logged once, the answer stays on file and not_exists will not be true again. Two arrows, two cards.

Write the "they did it" arrow first. It is the one that carries them back into the loop, and a node whose only arrow is the absence arrow leaves somebody stuck there when it never becomes true.

What breaks it. Writing it as a chase. A card that leads with how long it has been, or that asks them to account for themselves, is a reason to stop opening the app rather than a reason to come back.

Problem solving: the narrowing​

What it does. Generate as many ideas as possible, rank them for how realistic they are, pick one, then plan the one.

What the participant sees
What could make the morning walk easier to start? Anything at all. Bad ideas are fine, we are after a long list rather than a good one.four boxes
"Put my shoes by the front door the night before" How realistic is that, this week?slider, 0 to 10
Your three most realistic: 1. Put my shoes by the front door the night before 2. Walk with the dog instead of driving to the park 3. Ask Sam to come on Tuesdays Which one are you doing this week? Put my shoes by the front door the night before Walk with the dog instead of driving to the park Ask Sam to come on Tuesdays
How you make it
Page 1 text x4 IDEA_1 to IDEA_4 Page 2 slider per idea, the idea in the LABEL Page 3 single_select the ideas in the OPTIONS Page 4 text what, where and when Page 2's slider label: "{{ values.IDEA_1 }}" Page 3's atom label: "Your three most realistic: 1. {{ values.IDEA_1 }} 2. {{ values.IDEA_2 }} 3. {{ values.IDEA_3 }}" Page 3's options: "1. {{ values.IDEA_1 }}" "2. {{ values.IDEA_2 }}" "3. {{ values.IDEA_3 }}" An option's label autofills like any other, so the choice is between the things they wrote. Keep the number in the authored label: if that idea was skipped the option still reads "1." and stays pickable, because an option falls back to its authored label rather than to nothing.

Why it works. People stuck on a problem generate one bad option and argue with it. The move separates producing ideas from judging them, which is what makes new ones appear.

How to build it. Four pages in one sequence:

  1. Three or four text atoms, labelled to encourage quantity rather than quality
  2. One slider per idea to rank them, each slider's label quoting that idea back with autofill
  3. A single_select to choose, with the ideas quoted in the options themselves
  4. text atoms for what, where and when, with the chosen option quoted in the label

Every page after the first has to quote their own words back. Without it they are re-reading their ideas from memory and the ranking is guesswork.

The choice page is where this matters most, and it is the one people build wrong. An option's label autofills, so the participant picks between the things they wrote. A list reading "The first one, The second one, The third one" makes them hold the mapping in their head at the exact moment they are deciding, which is where the move loses people. Keep a number in the authored label (1. {{ values.IDEA_1 }}), because an option with no answer behind it falls back to what you authored rather than rendering empty, and an empty row in a list of three cannot be picked. See Autofill.

What breaks it. Asking for the plan on the same page as the ideas. The judging starts immediately and the list stops at two.

Goal specificity: the goal check​

What it does. Takes a goal somebody has written and checks it is specific enough to act on before the programme accepts it.

What the participant sees
Your goal: "Get fitter" Does it say what you will actually do? Yes No Does it say when? Yes No Does it say how often? Yes No Could someone else tell whether you had done it? Yes No
Have another go, and put the missing part in.their own sentence is already in the box Get fitter
How you make it
boolean SAYS_WHAT, SAYS_WHEN, SAYS_HOW_OFTEN, IS_CHECKABLE all four marked required text GOAL_REWRITE, default {{ values.GOAL }} The rewrite is shown when any test came back no: { "any": [ { "field": "values.<says what>", "op": "is", "value": false }, { "field": "values.<says when>", "op": "is", "value": false } ] } required matters: an unanswered test reads as absent, a condition on an absent answer is false, and a skipped page would let the goal through untested.

Why it works. A specific goal outperforms a vague one, and "get fitter" is not something anybody can do on a Tuesday.

How to build it. After the goal is written, a short page of boolean atoms, each one a test: does it say what, does it say when, does it say how often, could somebody else tell whether you did it. Then a text atom, shown by a condition when any test failed, handing the goal back for a rewrite with autofill.

Mark every test required. An unanswered test reads as absent rather than as failed, and a condition on an absent answer is false, so a skipped page would let the goal through untested, which is the one outcome this move exists to prevent.

{ "any": [
{ "field": "values.<says what>", "op": "is", "value": false },
{ "field": "values.<says when>", "op": "is", "value": false }
] }

Give them their own sentence back to edit. Put it in the input's default rather than telling them what was wrong with it.

What breaks it. Running the check and then accepting the goal anyway. If nothing happens when a test fails, the tests are a quiz.

Acceptance: sitting with it​

What it does. Asks somebody to stay with an uncomfortable feeling for a short time rather than fix it.

What the participant sees
Some soreness is uncomfortable to sit with. You do not have to do anything about it right now.
What did you notice while you were sitting there?optional
How you make it
content SITTING_WITH_IT text WHAT_DID_YOU_NOTICE, optional On the surface this card sits on: showCompletionState: off Give this card a surface of its own, because that setting belongs to the surface and would take the ring and tick off everything else sitting there.

Why it is here. Every other move on this page ends with the participant doing something. This one does not, and building it like the others ruins it.

How to build it.

PartSetting
The contentA content atom, then one short text reflection. A breathing atom can sit between them, but only where the copy frames it as something to do while the feeling is there, never as a way to make it go
CompletionTurn showCompletionState off, on a surface this card has to itself

A green tick would teach the wrong thing here. It tells the participant the feeling was a task and they have now cleared it, which is the opposite of what the exercise teaches. The setting sits on the surface rather than the card, so every item on that surface loses its ring and tick together: give this one a surface of its own. A card they have opened still dims its content, which is all the acknowledgement this move needs. See Anatomy of a surface.

Anything that tells a participant what a symptom means is your clinician's to write, not ours. The worked example below deliberately says nothing about the cause of the soreness. Reassurance about what a symptom does or does not indicate belongs in copy your clinical lead has approved, with the escalation route you already use.

What breaks it. Congratulating them afterwards. Nothing was achieved and nothing was meant to be. And framing the breathing atom as a way to calm down, which turns the exercise into one more way of getting rid of the feeling.

Where these come from​

Every heading on this page is a construct name from the behaviour-change or clinical literature, so each one is a search that returns evidence rather than marketing. Implementation intentions come from Gollwitzer's planning work, and coping planning from the Health Action Process Approach, which is also where recovery self-efficacy comes from. Importance and confidence rulers come from motivational interviewing. Self-monitoring of behaviour, graded tasks, problem solving and goal setting are all named techniques in the behaviour-change technique taxonomy. Goal specificity comes from goal-setting theory. Relapse prevention comes from the Marlatt lineage. Acceptance comes from the acceptance and commitment literature. Tailoring comes from the health communication literature on tailored interventions, and appears as its own feature in the persuasive systems design framework.

Two of them carry a specific result worth knowing before you build. Pairing implementation intentions with coping planning is what changed behaviour in the rehabilitation trial that separated them; planning alone did not. And in graded activity the pacing rule is the design principle the technique rests on, so the effort belongs in the progression logic rather than in the exercise library.

The sources. Implementation intentions come from Gollwitzer and Sheeran's meta-analytic work. Coping planning and recovery self-efficacy come from Schwarzer's Health Action Process Approach, and the cardiac rehabilitation study quoted above is Sniehotta, Scholz and Schwarzer, 2006. Importance and confidence rulers come from Miller and Rollnick on motivational interviewing. Self-monitoring of behaviour, graded tasks, problem solving and goal setting are named techniques in the behaviour-change technique taxonomy, Michie and colleagues. Goal specificity comes from Locke and Latham's goal-setting theory. Relapse prevention comes from Marlatt and Gordon. Acceptance comes from the acceptance and commitment literature, Hayes and colleagues. Tailoring comes from the health communication work on tailored interventions, Kreuter and colleagues. The graded-activity comparison is Macedo and colleagues, 2010, and the digital behaviour-change list is a 2023 umbrella review in Annals of Behavioral Medicine.

Take these as the door into the literature rather than as a reading list we have checked for you. Where a claim on this page matters to a decision you are making, read the paper.

What the platform adds is the delivery. The plan comes back at the moment it was written for, the barrier plan arrives on the day the barrier turns up, the record stays short enough to keep, an absence is something a journey can act on, and the words on the screen are the participant's own.

Next​