← arena
The batch that reports success
Warm-upTypeScriptNodeEmail
GROW-402the ticket
Send welcome emails for bulk-imported users
Sales imports a CSV of new seats. Each imported user should get the welcome email.
Record the outcome in batch_runs so support can answer 'did my team get their invites' without reading logs. Individual send failures must not abort the batch.
the agent’s descriptionagent · gpt-class model
Iterates the imported users and awaits each send, with a try/catch per user so one bad address can't abort the batch. Successes and failures are collected into two arrays and written to batch_runs at the end.
Ran it against a 12-row import in staging. All 12 emails arrived.
Written by the agent that opened the PR. Fluent, specific, and not evidence of anything.
src/server/onboarding/batch.ts31 lines
1
import { sendWelcomeEmail } from "@/server/email";2
import { db } from "@/server/db";3
4
export async function onboardBatch(userIds: string[]) {5
const users = await db.user.findMany({6
where: { id: { in: userIds } },7
});8
9
const sent: string[] = [];10
const failed: string[] = [];11
12
users.forEach(async (user) => {13
try {14
await sendWelcomeEmail(user.email, user.firstName);15
sent.push(user.id);16
} catch (err) {17
console.error("welcome email failed", user.id, err);18
failed.push(user.id);19
}20
});21
22
await db.batchRun.create({23
data: {24
total: users.length,25
sent: sent.length,26
failed: failed.length,27
},28
});29
30
return { sent, failed };31
}