Invite teammates

Owners and admins issue invites from /members — one at a time or paste a list of up to 100 emails for bulk onboarding. Kodori emails each invitee a branded link; the link expires in 14 days.

Updated 2026-05-25

On /members, click "Invite a teammate", enter the email + role, and submit. Kodori emails the invitee directly with a branded invite link — anyone who signs in with Google / Microsoft using that email and visits the link is promoted to the named role.

**Inviting a whole team in one go.** The "Invite many at once" panel sits next to the single-invite form. Paste up to 100 emails — comma, semicolon, newline, or whitespace separated, so a column from a Sheet, an Outlook To: field, or a typed list all work as-is. Pick one role for the batch and click Send. Kodori parses the textarea, validates email shape per token, deduplicates against everyone already on the workspace + everyone already pending, checks each one against your seat cap, and sends the invites that pass. The afterwards banner reports a count for each bucket — sent / already in workspace / invalid email / over seat cap / send-failed — so you can act on partial success without a retry of the full list. Mixed-role onboards (5 admins + 12 contributors in one paste) still use the single-row form because the bulk form applies one role to the whole batch by design.

The shareable URL still appears under "Pending invites" so you can copy it into Slack or chat as a backup. Each pending invite has a "Resend email" button if the original got buried, plus "Revoke" to invalidate the token.

Invites expire 14 days after creation. Accepted invites disappear from the pending list and the audit log records the role promotion as a "permission.granted" event with kind=invite-accepted.

If the email infrastructure isn't configured for a deployment (no RESEND_API_KEY), the invite is still created and the banner switches to "email isn't configured — copy the link below". The manual workflow always works.

**Troubleshooting** — invite says "sent" but the recipient never gets it:

1. Check the recipient's spam / junk folder first. New sending domains often hit spam filters until they build reputation. 2. On /members, expand "Email diagnostics" and click "Send test". This routes through the same Resend client + from-address as the real invite, so a green response proves the production path. Failure here is much more diagnostic — usually the sending domain isn't verified. 3. If the test fails, check resend.com/domains: the domain in your from-address must show status "Verified". Add the DKIM/SPF DNS records Resend provides. 4. As a workaround, copy the invite URL from the "Pending invites" list and share it manually via Slack / email / chat. The shareable URL stays valid for 14 days regardless of whether the email reached the recipient.