Skip to main content

Daily Digest

The Daily Digest screen schedules a recurring email that bundles every integration error of the day and attaches the full event list as an Excel file. The body of the email summarises the period and the row counts; the attachment carries the exact data the Integration Errors page's Detailed tab exports — same columns, same shape.

The point is operational: instead of asking a team to open the SPA every morning to check for failed invoices, the digest pushes the day's errors to their inbox at a fixed time. Several digests can coexist so different teams receive different cuts of the same data — the accounting team for company ACME, the operations team for activity VRAC, the development team for everything with severity FATAL.

The page applies regardless of source system — JD Edwards, SAP, NetSuite or a custom ERP. The errors come from the validation pipeline and are stored in F564236, so the source format is transparent here.

Added in 2026.06.02

The page is brand new. It replaces the ad-hoc Export workflow on the Integration Errors page for scheduled recipients — operators who don't open the SPA daily but need the data anyway. The export workflow is still available for one-off triage.


Opening the editor

  • Sidebar → Configuration → System → Daily Digest.
  • Or directly from the Integration Errors page → toolbar → Send to digest… when the operator wants to wire a recurring email for the current filter set.

At a glance

Daily Digest+ AddSeverity ▾☑ Enabled only↻ RefreshAccounting · ACMEaccounting@acme.example · ops-acme@acme.exampleEvery day · 07:00 Europe/Paris · last 1 day · severity = ERROR / FATALFilters: KCO = 00070 · Activity = ISCENABLEDlast sent 06/02EditOperations · VRACoperations@example.comEvery day · 06:30 Europe/Paris · last 2 days · severity = allFilters: Activity = VRACENABLEDDev — FATAL onlydev-oncall@example.comEvery day · 08:00 Europe/Paris · last 1 day · severity = FATALFilters: (none — every company)DISABLEDSend timeline06:30 Operations · VRAC → operations@example.com · 12 events · 4 invoices07:00 Accounting · ACME → accounting@acme + ops-acme · 7 events · 3 invoicesAdd digestOne per recipient subsetSchedulecron + timezoneEquality filtersKCO, Activity, Source, Rule, …Enable / disablePause without deletingSend timelineToday's plan + row counts

Digest fields

Each digest is one row in the catalogue. The edit pane has four sections.

1. Identification

FieldRequiredWhat
NameyesFree text. Shown in the catalogue list and at the top of the email body. Example: Accounting · ACME.
RecipientsyesOne or more email addresses, comma- or semicolon-separated. Every address gets the same email — there's no per-address customisation here; create another digest if recipients should see different cuts.
Enabledyes (default: on)When off, the digest is kept in the catalogue but skipped at send time. Useful for pausing a digest during a maintenance window without losing the configuration.

2. Schedule

FieldRequiredWhat
Send timeyes (default: 07:00)Time of day the digest runs. Hours / minutes; seconds are ignored.
Timezoneyes (default: server timezone)A IANA timezone (e.g. Europe/Paris). Each digest runs in its own timezone so a multi-region install can send one digest at 07:00 Paris and another at 07:00 New York.
Lookback windowyes (default: yesterday and today = 1 day)How far back the digest reaches when collecting events. Values: today (current day), 1 day (yesterday + today — the default), 7 days, 30 days, or a custom N days. The window is rolling and ends at send time.

3. Severity filter

A small chip group identical to the Integration Errors toolbar:

SeverityWhen to use
AllThe team wants every error.
FATALCritical pipeline aborts only — typically the dev / oncall channel.
ERRORThe standard production set — Schematron failures, PA rejections.
WARNINGLower-severity issues that don't block submission (deprecated tax codes, optional fields missing).
INFOVerbose — typically used for diagnostic digests during incident response.

Pick one severity (or All). A multi-severity digest is two separate digest rows in the catalogue.

4. Per-column equality filters

The digest carries a list of (column, value) pairs that narrow the event set. The supported columns are the same equality-filterable columns the Integration Errors page exposes through List Views:

ColumnExample valueCommon use
Company (KCO)00070One digest per company on a multi-company install.
Activity codeISC, VRAC, BIPOne digest per business activity.
SourceEN16931, CIUSFR, FREXTIC, CPRO, XSD, UBL, INTEGSend the UBL-validation set to the template team, the integration set to the ops team.
RuleBR-CL-23, UBL_CREATIONWatch a specific failing rule.
Business unitMU-LYO, MU-PARPer-BU routing.

Filters combine with AND. Empty filters = all rows. Adding two values to the same column requires two digests.


What the email looks like

The body summarises the period, the row counts and a top-5 of failing rules:

Daily digest email body
Subject: NomaUBL daily digest — Accounting · ACME — 7 errors, 3 invoices

Period: last 1 day (2026-06-01 07:00 → 2026-06-02 07:00 Europe/Paris)
Filters: company = 00070, activity = ISC, severity = ERROR / FATAL
Events: 7
Invoices: 3

Top failing rules
BR-CL-23 Currency code must follow ISO 4217. 5
BR-FR-12 SIRET BT-46 must be present on a French B2B invoice. 1
PA_SEND PA submission rejected at HTTP level (timeout / 4xx / 5xx). 1

The full event list is attached (errors-2026-06-02.xlsx).

The attachment is the same Excel file the Detailed tab of Integration Errors exports — every event of every invoice in scope, with columns matching the table.

When the period has zero errors, the digest is sent anyway with a short no errors in this period body (no attachment). Operators have asked for the positive signal — knowing the digest ran without failures is itself information.


How it runs

The scheduler is a daemon inside NomaUBL that wakes up every minute and checks the catalogue for digests whose next send time has just elapsed. The query is fast (the catalogue is small) and stateless — the digest's last-sent timestamp lives on the row itself.

StateWhat
Enabled = onThe next firing of <send_time> in <timezone> collects events, builds the Excel and sends. The row's last sent badge updates.
Enabled = offThe catalogue row is skipped at every tick.
SMTP failureThe send is retried on the next tick (one minute later) for up to 5 attempts; after that the failure is logged in the Processing Log with the SMTP error, and the digest is marked failed for the day. Manual re-send via the Send now button at any time.

The digest runtime reads SMTP configuration from the platform-wide System → Global smtp section — the same SMTP that drives Notification Rules and the per-invoice notifications. Make sure the credentials work there before wiring a daily digest.

Send-now button

Each row in the catalogue has a Send now button that fires the digest immediately, regardless of the scheduled time. The window, the filters and the severity from the row are used as-is. Useful for:

  • Verifying a digest after creating or editing it.
  • Pushing a one-off after an incident — the same data, sent now instead of waiting for the next tick.

The Send now run also updates the last sent badge, so the scheduled run that day still goes out if the schedule hasn't fired yet.


Tips & best practices

  • One digest per team, not per recipient. A single digest with three CC addresses costs less to maintain than three digests with one address each — the cuts are typically aligned by team, not by individual.
  • Keep the lookback window short. The default 1 day is usually right. A 7 days window means re-reading the same errors every morning, which dilutes the signal.
  • Use the Enabled toggle for maintenance windows. Pausing a digest during a planned outage prevents a flood of expected errors from reaching the recipients. Re-enable when the window closes.
  • Send-now is the smoke test. After creating or editing a digest, click Send now. The email lands in seconds and confirms the configuration before the next scheduled tick.
  • Severity routing keeps the on-call clean. A FATAL-only digest to the on-call channel + an ERROR digest to the production team is the typical setup — the on-call doesn't drown in Schematron noise.

Troubleshooting

SymptomLikely causeFix
The digest's row in the catalogue shows failed.SMTP rejection (auth, relay refused, recipient bounce).Open the Processing Log, filter by daily-digest, read the SMTP error. Fix the Global → SMTP credentials, then Send now.
The email arrived but the attachment is empty.The filter set has no matching events in the lookback window.Loosen one filter (e.g. drop the activity code) or extend the window to 7 days; Send now to re-check.
The attachment contains errors older than the lookback window.The lookback window selects invoices that have at least one error in the window, then exports every error of those invoices — the same behaviour as the Detailed view. This is intentional.If you need strict-window export, do it from the By event tab manually.
Two recipients get the same digest twice.Two digest rows in the catalogue have overlapping recipient lists.Audit the catalogue; merge or de-dup.
The digest fires at the wrong hour.Timezone is set to the wrong zone.Open the digest, set the correct IANA timezone (Europe/Paris, Africa/Casablanca, …) and save.
The form lost the values after Save. (2026.05.x)Fixed in 2026.06.02.Upgrade to the current build — the form now refreshes from the freshly-saved record.

What's next