Pricing that grows with your team

Start free with up to three people. When your plans get bigger, pay per person, and only for the people who plan with you.

Billing period

Plan finder

We’re a team of people and we mostly plan .

Plans

Starter

Suggested in your chat

For small teams getting their first plans out of a spreadsheet.

€0free for up to 3 people

Start for free

Includes

  • Up to 3 people
  • 3 projects
  • Timelines
  • Comments

Business

Suggested in your chat

For organisations that need control, security and a direct line to us.

€24€19.20per person / month
billed monthlybilled annually

Talk to sales

Everything in Team, plus

  • SSO (SAML)
  • Audit logs
  • Advanced permissions
  • Priority support
  • A named success manager

Prices per person per month, excluding VAT. Every workspace starts with a 30-day Team trial, no card needed.

Compare plans

StarterTeamBusiness
Planning
PeopleUp to 3UnlimitedUnlimited
Projects3UnlimitedUnlimited
TimelinesIncludedIncludedIncluded
CommentsIncludedIncludedIncluded
DependenciesNot includedIncludedIncluded
Workload viewNot includedIncludedIncluded
Working with others
Guest access, free for agencies and freelancersNot includedIncludedIncluded
IntegrationsNot includedIncludedIncluded
Security and support
SSO (SAML)Not includedNot includedIncluded
Audit logsNot includedNot includedIncluded
Advanced permissionsNot includedNot includedIncluded
Priority supportNot includedNot includedIncluded
Named success managerNot includedNot includedIncluded

Billing questions

Something else on your mind? Ask in the plan finder and get an answer in seconds.

What happens when the trial ends?

Your workspace moves to the free Starter plan, unless you choose a paid plan. Nothing is deleted: your projects stay put.

Who counts as a person?

You pay for members: the people who plan in your workspace. Guests, like agencies, freelancers and clients, are free on Team and Business.

Do invoices show our VAT ID?

Yes. Every invoice shows your company details and VAT ID. Prices on this page exclude VAT.

Can we cancel anytime?

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

Your own starter, and a conversation that points at the page

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.

Try it

  1. In the plan finder, set your team size and what you mostly plan, then click Find my plan. Your sentence becomes the first message, and the answer unfolds right there.
  2. Look at the plans below it. The plan the reply suggests gets a Suggested in your chat badge, and any other plan it names gets a quieter ring.
  3. Ask a follow-up on the line under the sentence, like "What happens when the trial ends?" The line works on its own too, for any question about plans and billing.
  4. Or : scripted, nothing is sent.
Chats here use 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.

The element

<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>

Start it from your own UI

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>

React to the conversation

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();

Make it yours

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; }

Good to know

Copy this example

npx degit standchat/examples/stand-inline my-stand-inline