team-invitation
Source of truth:
packages/notifications/src/translations.ts
Quick facts
Section titled “Quick facts”| Domain | Channels | Recipients |
|---|---|---|
| teams | in-app + email | Invited user |
Trigger sites
Section titled “Trigger sites”| Source | Context |
|---|---|
packages/api/src/services/teams.ts:549 | inviteToTeam |
Payload — TeamInvitationData
Section titled “Payload — TeamInvitationData”interface TeamInvitationData { inviterName: string; teamName: string; acceptUrl: string;}Channel steps
Section titled “Channel steps”Trigger step
Section titled “Trigger step”The caller invokes triggerWorkflow('team-invitation', recipientIds, data) where data is the TeamInvitationData shape above. The server pre-translates the payload via getTranslatedPayload('team-invitation', recipientLocale, data) from @repo/notifications before sending, producing { inAppBody, emailSubject, emailBody } for the dashboard templates to render.
In-app feed
Section titled “In-app feed”Knock dashboard template body: {{ inAppBody }}.
| Locale | Preview source |
|---|---|
es | 👥 ${p.inviterName} te invitó a unirte a ${p.teamName} |
en | 👥 ${p.inviterName} invited you to join ${p.teamName} |
Subject: {{ emailSubject }}. Body: {{ emailBody }} (HTML mode, dashboard escaping OFF — every user-supplied string is escaped server-side via escapeHtml from @repo/notifications).
| Locale | Subject preview |
|---|---|
es | Te invitaron a unirte a ${p.teamName} |
en | You're invited to join ${p.teamName} |
Email body is composed by emailBody.es in packages/notifications/src/translations.ts via the layout components in packages/notifications/src/email-layout.ts (wrapEmailLayout, ctaButton, calloutBox, quoteBlock, propertyCard, detailTable / detailRow). Body source is not inlined here because it spans tens of lines per locale — open the source file for the full template.
See also
Section titled “See also”- Notifications overview — the workflow grid, source-of-truth file map.
- Configuration — env vars, dashboard checklist, channel mapping.