Starter
Suggested in your chat
For small teams getting their first plans out of a spreadsheet.
€0free for up to 3 people
Start for freeIncludes
- Up to 3 people
- 3 projects
- Timelines
- Comments
Start free with up to three people. When your plans get bigger, pay per person, and only for the people who plan with you.
Suggested in your chat
For small teams getting their first plans out of a spreadsheet.
€0free for up to 3 people
Start for freeIncludes
Most popular
Suggested in your chat
For teams that run launches, events and campaigns together.
€12€9.60per person / month
billed monthlybilled annually
Everything in Starter, plus
Suggested in your chat
For organisations that need control, security and a direct line to us.
€24€19.20per person / month
billed monthlybilled annually
Everything in Team, plus
Prices per person per month, excluding VAT. Every workspace starts with a 30-day Team trial, no card needed.
| Starter | Team | Business | |
|---|---|---|---|
| Planning | |||
| People | Up to 3 | Unlimited | Unlimited |
| Projects | 3 | Unlimited | Unlimited |
| Timelines | Included | Included | Included |
| Comments | Included | Included | Included |
| Dependencies | Not included | Included | Included |
| Workload view | Not included | Included | Included |
| Working with others | |||
| Guest access, free for agencies and freelancers | Not included | Included | Included |
| Integrations | Not included | Included | Included |
| Security and support | |||
| SSO (SAML) | Not included | Not included | Included |
| Audit logs | Not included | Not included | Included |
| Advanced permissions | Not included | Not included | Included |
| Priority support | Not included | Not included | Included |
| Named success manager | Not included | Not included | Included |
Something else on your mind? Ask in the plan finder and get an answer in seconds.
Your workspace moves to the free Starter plan, unless you choose a paid plan. Nothing is deleted: your projects stay put.
You pay for members: the people who plan in your workspace. Guests, like agencies, freelancers and clients, are free on Team and Business.
Yes. Every invoice shows your company details and VAT ID. Prices on this page exclude VAT.
Yes, from your workspace settings. Your plan runs to the end of the month or year you've paid for, then moves to Starter.
How it works · Stand Inline
Every pricing page raises the same question: which plan is right for us? The answer depends on the team, so this page asks back, with a sentence the visitor completes. The reply unfolds right above the plans, and the plans it names light up.
site="demo", Stand Chat's shared demo site. Its demo Stand-in reads the page's private prompt, but it may still decline to speak for a made-up planning tool. With your own Site ID, your own Stand-ins answer, trained on your website.<script type="module" src="stand-inline.js"></script>
<stand-inline
id="ask-plan"
site="YOUR-SITE-ID"
look="line"
grow="unfold"
placeholder="Or ask about plans and billing"
prompt="The visitor is on Loomwork's pricing page. Starter €0 for up to 3 people; Team €12 per person a month, or €9.60 billed annually… Recommend one plan, and name it first. Use the plan names Starter, Team and Business exactly."
analytics-id="pricing-plan-finder">
</stand-inline>
look="line" is a sentence-sized input on a rule. Under the page's own sentence, it's the quieter second way in, for any other question.grow="unfold" opens the conversation in place, inside the plan finder, right above the plans it talks about.suggestions: the sentence is the starter.prompt holds the plans, prices and billing rules as private context. It also asks for the plan names exactly as the page writes them, with the recommended plan first, because the page's highlight reads those names.id lets the page's script find the element. analytics-id labels the placement in Stand's analytics.The sentence is an ordinary form, styled like the rest of the page. On submit, the page puts the sentence together and calls ask(), which sends it as the visitor and starts the conversation if there isn't one yet.
<form id="sentence">
We’re a team of <input name="people" type="number" value="12">
people and we mostly plan <select name="work">…</select>.
<button>Find my plan</button>
</form>
<script type="module">
const chat = document.getElementById('ask-plan');
const sentence = document.getElementById('sentence');
sentence.addEventListener('submit', (event) => {
event.preventDefault();
const { people, work } = sentence.elements;
chat.ask(`We’re a team of ${people.value} and we mostly plan ${work.value}.`);
});
</script>
Every new message fires a stand-inline-message event with { from, text, type }. For each reply, the page looks for plan names and marks those cards. A conversation restored after a reload, or replaced by a new one, doesn't replay its events: stand-inline-reset fires instead, and the page reads the last reply from el.state, where messages have the same shape.
const plans = document.querySelectorAll('.plan[data-plan]');
function highlight(text) {
const named = [...new Set(text.match(/\b(Starter|Team|Business)\b/g) ?? [])];
for (const plan of plans) {
const rank = named.indexOf(plan.dataset.plan);
plan.classList.toggle('suggested', rank === 0); // badge and ring
plan.classList.toggle('mentioned', rank > 0); // a quieter ring
}
}
const isReply = (message) => message.from !== 'visitor' && message.type === 'text';
chat.addEventListener('stand-inline-message', (event) => {
if (isReply(event.detail)) highlight(event.detail.text);
});
const fromState = () => highlight(chat.state?.messages.findLast(isReply)?.text ?? '');
chat.addEventListener('stand-inline-reset', fromState);
fromState();
It takes its font and text color from the page. Loomwork sets four tokens, styles two parts, and uses the element's data-state to style the page around it:
stand-inline {
--si-accent: #E4572E;
--si-visitor-bg: #FFE3D3;
--si-line: #E6D9C8;
--si-max-height: min(56vh, 460px);
}
/* Replies keep a readable line length in the wide band. */
stand-inline::part(host) { max-width: 46em; }
/* A hairline between the page's sentence and the conversation. */
stand-inline[data-state="conversation"]::part(conversation) {
padding-top: 22px;
border-top: 1px solid #EDE4D8;
}
/* Nobody can answer: the plan finder steps aside, the plans stay. */
.finder:has(stand-inline[data-state="offline"]) { display: none; }
ask() waits for Stand to find someone who can answer, then starts a conversation or adds to the open one. The prompt only applies when a conversation starts.npx degit standchat/examples/stand-inline my-stand-inline