{"name":"user-stories","title":"User story template with acceptance criteria","description":"A user story template with the As a, I want, so that format and Given, When, Then acceptance criteria, shown on an example feature with three stories.","category":"specs","updated":"2026-11-08","url":"https://sniptide.com/templates/user-stories","files":[{"name":"docs/stories/team-invites.md","language":"markdown","content":"# Team invites\n\nEpic: Workspaces for teams\nUpdated: 2026-11-08\n\n## Story 1: Invite a teammate by email\n\nAs a workspace owner, I want to invite a teammate by email, so that they can see and edit our\ninvoices without sharing my login.\n\n### Acceptance criteria\n\n- Given I am an owner on Settings > Members, when I enter a valid email and choose a role, then\n  the invite appears under \"Pending\" and the person receives an email with a link.\n- Given the email already belongs to a member, when I send the invite, then I see \"This person\n  is already in the workspace\" and no email is sent.\n- Given the workspace is at its seat limit, when I open the invite form, then the button is\n  disabled and links to the billing page.\n\n### Notes\n\n- Roles: Owner, Editor, Viewer. Viewer is the default.\n- Invite links expire after 7 days.\n\n## Story 2: Accept an invite\n\nAs an invited teammate, I want to join with one click, so that I can start working without\nsetting up a separate workspace.\n\n### Acceptance criteria\n\n- Given I have an account, when I open a valid invite link, then I land in the workspace with\n  the role I was invited with.\n- Given I have no account, when I open the link, then I sign up with the invited email filled in\n  and join the workspace after verifying it.\n- Given the link has expired, when I open it, then I see \"This invite has expired. Ask the\n  owner for a new one.\"\n\n## Story 3: Revoke a pending invite\n\nAs a workspace owner, I want to revoke an invite I sent by mistake, so that the wrong person\ncan't join.\n\n### Acceptance criteria\n\n- Given an invite is pending, when I choose Revoke, then it disappears from the list and its\n  link shows the expired message.\n\n## Out of scope\n\n- Inviting by link without an email.\n- Custom roles.\n"}]}