Skip to content
// Mark each drip email as sent (or record the error so the next run retries it).
const db = $getWorkflowStaticData('global');
const dueItems = $('Find Due Messages').all().map((i) => i.json).filter((d) => d.key); // "Always Output Data" adds an empty item when nothing is due
const sendRan = $('Send Drip Email').isExecuted;
const results = sendRan ? $('Send Drip Email').all().map((i) => i.json) : [];

const out = dueItems.map((d, i) => {
  const r = results[i];
  const ok = Boolean(r && !r.error && r.id);
  const error = d.dry_run ? null : ok ? null : (typeof r?.error === 'string' ? r.error : r?.error?.message) ?? 'no message id returned';
  if (!d.dry_run) {
    const step = db.leads[d.key]?.drip.find((x) => x.step === d.step);
    if (step) { if (ok) step.sent_at = DateTime.now().toISO(); else step.last_error = error; }
  }
  return { key: d.key, step: d.step, to: d.to, subject: d.subject, sent: ok, error, dry_run: d.dry_run };
});
return [{ json: { due: out.length, sent: out.filter((o) => o.sent).length, messages: out } }];