Esta página aún no está traducida al español — mostrando la versión en inglés.

Invitations

Accept or decline invitations to join another workspace.

If someone invited you to their ChatbotGen workspace, the invitation shows up at /app/invitations.

The page

  • : Pending Invitations

  • Subtitle: "You've been invited to join these accounts."

Each invitation card

┌───────────────────────────────────────────────┐
│  Acme Inc.                                    │
│  Invited Apr 12, 2026 as Admin                │
│                                               │
│  [ Accept ]  [ Decline ]                      │
└───────────────────────────────────────────────┘

Per invitation:

  • Card title: inv.account_name
  • Card description: "Invited {date}" (formatDate(inv.inserted_at)) + "as Admin" when inv.roles?.admin is truthy, else "as Member"
  • Accept button (primary) → POST /app/invitations/{token}/accept
  • Decline button (outline) → POST /app/invitations/{token}/reject

Both actions use the invitation's token.

What Accept does

Verified from InvitationController.accept/2:

  • Success: Accounts.accept_invitation(token, user) creates an account_user record, the controller flashes "Invitation accepted!", and redirects you to /app.
  • Error: flashes "Could not accept invitation." and redirects back to /app/invitations.

What Decline does

Verified from InvitationController.reject/2:

  • Success: Accounts.reject_invitation(token) runs, the controller flashes "Invitation declined." and redirects to /app/invitations.
  • Error: flashes "Invitation not found." and redirects to /app/invitations.

Empty state

If there are no pending invitations, the page shows a dashed panel with:

No pending invitations.

How invitations are listed

The controller calls Accounts.list_pending_invitations_for_email(user.email) — invitations are matched by the email address they were sent to, which must equal your logged-in user's email.