Team-Einladungs-E-Mails sind entscheidend für das Wachstum von SaaS. Eine gut gestaltete Einladung verwandelt Empfänger in aktive Nutzer. So optimieren Sie Ihren Einladungsablauf.
Anatomie von Einladungs-E-Mails
Wesentliche Elemente
interface TeamInvitation {
inviter: {
name: string;
email: string;
avatarUrl?: string;
};
organization: {
name: string;
logoUrl?: string;
};
invitee: {
email: string;
role: string;
};
invitation: {
id: string;
expiresAt: Date;
message?: string;
};
}
Template mit hoher Conversion
await sendEmail({
to: invitee.email,
subject: `${inviter.name} invited you to join ${org.name}`,
template: 'team-invitation',
data: {
inviter,
organization: org,
role: invitee.role,
personalMessage: invitation.message,
acceptUrl: `${baseUrl}/invitations/${invitation.id}/accept`,
expiresAt: invitation.expiresAt,
previewText: `Join ${org.name} on YourApp`
}
});
Conversion-Optimierung
Social Proof
// Include team context
const teamContext = {
teamSize: org.memberCount,
recentActivity: `${org.activeMembers} team members active this week`,
popularFeatures: await getOrgTopFeatures(org.id)
};
Dringlichkeit ohne Druck
// Soft expiration
const expirationCopy = {
'7days': 'This invitation expires in 7 days',
'3days': 'Expires in 3 days',
'1day': 'Expires tomorrow',
'expired': 'This invitation has expired'
};
Erinnerungssequenz
const invitationReminders = [
{
daysAfter: 3,
subject: `Reminder: ${inviter.name} invited you to ${org.name}`,
template: 'invitation-reminder-1'
},
{
daysAfter: 6,
subject: `Your invitation to ${org.name} expires soon`,
template: 'invitation-reminder-2'
}
];
async function scheduleReminders(invitation: Invitation) {
for (const reminder of invitationReminders) {
await scheduleEmail({
sendAt: addDays(invitation.createdAt, reminder.daysAfter),
to: invitation.email,
subject: reminder.subject,
template: reminder.template,
data: { invitation },
cancelIf: [
{ condition: 'invitation_accepted' },
{ condition: 'invitation_cancelled' }
]
});
}
}
Rollenspezifische Einladungen
Admin-Einladung
await sendEmail({
to: invitee.email,
subject: `You've been invited as an admin of ${org.name}`,
template: 'admin-invitation',
data: {
inviter,
organization: org,
role: 'Admin',
permissions: [
'Manage team members',
'Access billing',
'Configure integrations',
'View all projects'
],
acceptUrl: `${baseUrl}/invitations/${invitation.id}/accept`
}
});
Einladung für eingeschränkte Rolle
await sendEmail({
to: invitee.email,
subject: `${inviter.name} invited you to collaborate on ${org.name}`,
template: 'member-invitation',
data: {
inviter,
organization: org,
role: 'Member',
accessScope: 'You\'ll have access to projects you\'re added to',
acceptUrl: `${baseUrl}/invitations/${invitation.id}/accept`
}
});
Ablauf nach der Annahme
Willkommen im Team
// After invitation accepted
await sendEmail({
to: newMember.email,
subject: `Welcome to ${org.name}!`,
template: 'team-welcome',
data: {
member: newMember,
organization: org,
invitedBy: inviter,
gettingStarted: [
{ step: 'Complete your profile', url: `${baseUrl}/settings/profile` },
{ step: 'Explore your projects', url: `${baseUrl}/projects` },
{ step: 'Meet your team', url: `${baseUrl}/team` }
],
helpResources: {
docs: `${baseUrl}/docs`,
support: `${baseUrl}/support`
}
}
});
Einladenden benachrichtigen
await sendEmail({
to: inviter.email,
subject: `${invitee.name} joined ${org.name}`,
template: 'invitation-accepted',
data: {
inviter,
newMember: {
name: invitee.name,
email: invitee.email,
role: invitee.role
},
teamUrl: `${baseUrl}/team`
}
});
Umgang mit Sonderfällen
Einladung an bestehenden Nutzer
if (await userExists(invitee.email)) {
await sendEmail({
to: invitee.email,
subject: `${inviter.name} invited you to join ${org.name}`,
template: 'existing-user-invitation',
data: {
inviter,
organization: org,
// Different CTA - just accept, no signup
acceptUrl: `${baseUrl}/invitations/${invitation.id}/accept`,
note: 'You already have an account. Just click to join.'
}
});
}
Einladung an falsche E-Mail-Adresse
// Allow forwarding to correct email
await sendEmail({
to: invitee.email,
template: 'invitation',
data: {
// ...
wrongEmailUrl: `${baseUrl}/invitations/${invitation.id}/wrong-email`,
wrongEmailNote: 'Not the right email? Let us know.'
}
});
Best Practices
- —Klarer Kontext zum Absender - Wer hat eingeladen und warum
- —Zeigen Sie das Team - Social Proof erhöht die Annahmequote
- —Rolle erklären - Welche Zugriffsrechte sie haben
- —Einfacher CTA - Ein Button zum Annehmen
- —Behutsam erinnern - 2-3 Erinnerungen max
- —Leicht ablehnen - Ermöglichen Sie eine unkomplizierte Absage
- —Herzlich willkommen heißen - Toller erster Eindruck nach der Annahme
Team-Einladungen sind oft die erste Interaktion mit Ihrem Produkt. Nutzen Sie diese Chance.