@cfxlabsinc/b2b-services
    Preparing search index...
    EmailSendOutcome:
        | { reason: "NO_RECIPIENTS"
        | "NO_ACTIVE_TEMPLATE"; sent: false }
        | {
            contentHash: string;
            sent: true;
            statusVariant: StoredEmailTemplate["statusVariant"];
            templateKey: EmailTemplateKey;
            version: number;
        }

    What a send actually did. The skip arms are deterministic non-sends the caller may surface (the lambda logs them; admin sendTest reports them to the operator); the sent arm identifies the exact copy that went out, so an audit row can record it (emailTemplate.testSendRequested carries the content hash — EMAIL_TEMPLATES.md §4.6).

    Type Declaration

    • { reason: "NO_RECIPIENTS" | "NO_ACTIVE_TEMPLATE"; sent: false }
    • {
          contentHash: string;
          sent: true;
          statusVariant: StoredEmailTemplate["statusVariant"];
          templateKey: EmailTemplateKey;
          version: number;
      }
      • contentHash: string

        sha256 over the rendered version's subject + "\n" + body.

      • sent: true
      • statusVariant: StoredEmailTemplate["statusVariant"]
      • templateKey: EmailTemplateKey
      • version: number

        Human-facing version counter of the live template that rendered.