figma guide

Designing member invitations and pending invites UI in Figma: bulk invite, resend, and handoff

Design member invitation and pending invites UI in Figma with bulk email invite, role assignment, resend/revoke flows, seat limits, and Dev Mode specs for B2B onboarding.

Published
Updated
Jul 13, 2026
Read time
7 min
Level
Intermediate

Quick answer

Member invitations let admins add people before they have accounts—usually under Organization → People → Invite, with a pending invites table for sent, expired, and revoked rows. Design a single and bulk invite modal (emails, role, optional teams/groups); a pending invites list with status, sent date, inviter, and actions (resend, revoke, copy link); seat-limit gates tied to org billing; and accept-invite landing that handles wrong account, expired link, and already-member states. Block invites to domains under SSO enforcement when policy requires SSO-only join. Log invite events to audit activity. Start from the Figma guides hub and pair with Dev Mode handoff for invite token and expiry specs.


Who this is for

  • Product designers building People tabs, admin consoles, and onboarding flows for team products.
  • Design system teams extending member roles and custom roles into invite-time assignment.
  • Engineers implementing email invites, magic links, seat caps, and SCIM-vs-manual invite precedence.

Invite entry points

Entry pointTypical userDefault roleNotes
People → InviteOrg adminMemberPrimary path
Empty teamTeam leadMember for that teamScoped invite
Billing seat addBilling adminMemberAfter purchase CTA
SSO JITN/AAuto-provisionNot manual invite—show banner
SCIMIT adminMapped from groupSCIM supersedes manual

Verdict: one Invite members button on People; secondary entry from team settings should open the same modal with team pre-selected.


Invite modal layout

FieldSpecValidation
Email(s)Textarea or tag input; comma/newline splitValid email format
RoleDropdown: fixed + custom rolesPermission to assign role
Teams / groupsMulti-select optionalInherited permissions
Personal messageOptional textareaMax 500 chars
Send invitePrimary CTADisabled at seat cap
InviteModal
├── Header: Invite members to Acme Org
├── EmailInput (tags with invalid highlight)
├── RoleSelect + TeamsMultiSelect
├── SeatBanner: "3 seats remaining" → link billing
├── OptionalMessage
└── Footer: Cancel | Send invites (count)

Bulk paste should show a preview table before send: email, role, team, status (valid / duplicate / already member).


Pending invites list

ColumnSpecNotes
EmailInvitee addressMask if GDPR-sensitive
RoleAssigned role chipEditable before accept
StatusPending / Expired / Revoked / AcceptedColor + icon
SentDate + relative”3 days ago”
Invited byAdmin name + avatarLink to audit
ExpiresCountdown or dateDefault 7–14 days
ActionsResend, Revoke, Copy linkKebab on mobile
PendingInvitesTab
├── Filter: All | Pending | Expired
├── Search by email
├── InvitesTable
│   └── Row: Email, Role, Status, Sent, By, Expires, Actions
└── BulkActions: Revoke selected (admin only)

Expired rows stay visible 30 days for audit, then archive—or move to audit log only.


ActionConfirmationSide effect
ResendNone or light toastNew token; extends expiry
RevokeModal: “They can no longer join”Invalidates link immediately
Copy linkToast: “Link copied”Same token until expiry
Change roleInline edit if pendingUpdates before accept

Revoke must invalidate all outstanding tokens for that email+org pair. Show Revoked status—not delete the row.


Seat limits and billing gates

When org billing seat cap is reached:

┌─────────────────────────────────────────────┐
│  ⚠ No seats available (48/48 used)          │
│  Add seats or remove members to invite more. │
│  [ Manage billing ]  [ View members ]       │
└─────────────────────────────────────────────┘
ScenarioUI
At capDisable Send; show billing CTA
Over cap (legacy)Banner on People; block new invites only
Pending invites + capPending does not consume seat until accept—or product policy banner
SCIM pre-provisionSeat reserved on create vs on first login—document in handoff

Clarify in FAQ whether pending invite reserves a seat. Most products do not until acceptance.


Accept-invite landing page

StateScreenCTA
Logged out, validOrg name, inviter, roleSign up / Log in to accept
Logged in, matching emailConfirm joinAccept invitation
Logged in, wrong email”Switch account”Log out + use invited email
ExpiredExplain + contact adminRequest new invite
RevokedSame as expiredSupport link
Already memberRedirect to workspaceGo to dashboard
AcceptInvitePage
├── OrgLogo + "You're invited to Acme"
├── InviterLine: "Jane invited you as Member"
├── RoleSummary (read-only)
├── AuthCTA: Create account | Sign in
└── Footer: Wrong account? Switch

After accept, route to onboarding checklist or default project—not a blank dashboard.


SSO, domain capture, and invite conflicts

PolicyManual invite behavior
Invite-onlyNormal flow
Verified domain auto-joinInvite optional; warn duplicate paths
SSO required for @acme.comBlock password invite OR send SSO-only invite email
SCIM enabledBanner: “IT may provision via directory”

When inviting @acme.com under SSO enforcement:

This domain uses SSO. The invite email will direct them to sign in with your company IdP.
[ ] Also allow password setup (not recommended)

Pair with login UI so accept flow lands on SSO button, not password form.


ModeUse caseSettings
Email inviteKnown colleaguesDefault
Shareable invite linkWorkshops, contractorsAdmin enables; optional expiry
Domain linkAuto-join verified domainSeparate from personal invite link

Shareable link settings (Security → Invitations):

  • Expiry: 24h / 7d / 30d / never
  • Max uses: 1 / 10 / unlimited
  • Default role: Member (locked or selectable)
  • Regenerate link invalidates previous

Show who created link and use count in audit log.


Notifications

EventRecipientChannel
Invite sentInviteeEmail + optional in-app
Invite acceptedInviter + adminsEmail digest
Invite expiredInviterOptional reminder day before
Seat cap blockedAdmin who tried inviteIn-app only

Email template should include: org name, inviter, role, expiry date, accept button, and “If you didn’t expect this” footer.


Common mistakes

MistakeWhy it hurtsFix
No pending listAdmins spam resendTable with status
Revoke deletes rowNo audit trailStatus = Revoked
Bulk invite no previewTypos become sendsValidate table step
Seat cap silent failConfusion at billingInline banner + CTA
Wrong-email acceptUser in wrong orgHard block + switch account
Duplicate invite rowsTwo links, chaosMerge or show “already pending”
Role change after acceptSupport ticketsLock role on accept
SCIM + manual raceDuplicate usersDedupe by email; show merge UI
Expired link generic errorUsers give upName inviter + request resend
No audit on inviteCompliance gapLog sent, accepted, revoked

  1. Design invite modal with email tags, role, teams, and seat banner.
  2. Build pending invites table with filters and row actions.
  3. Prototype accept-invite states: valid, expired, wrong account, already member.
  4. Wire seat cap to billing and disable rules.
  5. Add SSO/domain policy warnings for enterprise domains.
  6. Specify email template content blocks for marketing handoff.
  7. Hand off token TTL, seat reservation rules, and role enums in Dev Mode.

FAQ

Should pending invites count against seats?

Usually no until the user accepts. If your product reserves seats, show “1 seat reserved” on the pending row and document in billing FAQ.

Can one email have multiple pending invites to different orgs?

Yes in multi-tenant products. Accept page must show which org clearly to avoid wrong joins.

Product choice. Resend with new token is safer; document whether old links die on resend.

Invite contractors without SSO?

Common pattern: allow password invite for non-domain emails; enforce SSO only for verified domain matches.

Bulk CSV import?

Enterprise add-on. If supported, design upload → map columns → error report download—not only textarea paste.


Next steps

Share on X

§ Keep reading

Related guides.