Guest access
Guests interact with their conversation without ever creating an account. Pigeon keeps this private and spam-resistant using signed access tokens.
How tokens work
- When a guest needs a link, Pigeon mints a random token and stores only a hash of it — the raw token is only ever sent by email.
- Each token is scoped to a single thread. Opening
/pigeon/t/<token>resolves the participant and shows only that conversation — a token can never reach another thread. - Tokens have a sliding expiry (configurable, 30 days by default, measured from the last activity). Every notification email includes a fresh link, so guests always have a working one.
Expired links
If a guest opens an expired or invalid link, they’re shown a short form to request a new one. Pigeon emails a fresh link to the address on file for any matching open conversation — it never reveals whether an email exists, avoiding enumeration.
Anti-spam
Guest-facing forms (start, reply, request-link) are protected by:
- Per-IP rate limiting — a fixed window you configure in settings.
- An optional honeypot field — submissions that fill it are silently dropped.
- CSRF protection on every form (standard Craft
csrfInput()).
Privacy
Guests only ever see normal messages — internal notes are never included in their view or notifications. Because the conversation is scoped by the token, a guest can’t list or guess other threads.