Rent collected. Funds held. Money forwarded. Every cycle, without exception.
Calmony DD orchestrates the full BACS Direct Debit lifecycle — from mandate registration through to agent client account — for every agent in parallel, with strict data isolation between them.
[ OVERVIEW / THE FULL CYCLE ]
Register the mandate Payer bank details validated and submitted to Modulr via AUDDIS — tracked over 3 working days until activated or rejected.
Submit & reconcile collections Scheduled collections hit the BACS rail at the right cutoff, with daily reconciliation against Modulr settlement files.
Hold funds through the clawback window Collected funds land in a Griffin holding account for 5 BACS working days before any forwarding — so returns and indemnity claims can be handled cleanly.
Forward verified funds to the agent Releasable amounts move from holding to the agent's Griffin client account on the configured cadence, with a PDF statement attached.

An operator creates a payer record — UK sort code, account number, email, full address — Calmony DD validates bank details including modulus check, then fires a Temporal workflow that calls Modulr's AUDDIS API. The system polls for the mandate result, transitions status to active or rejected with reason, and sends the payer their legally required advance-notice email.
A daily cron picks up collections due in the next window, checks the BACS working-day calendar (seeded from Pay.UK's published schedule), verifies the mandate is active, then submits each collection to Modulr with an idempotency key equal to the collection ID. The collection transitions through scheduled → submitted → in_clearing → collected. A BACS 3-day timeline is visible on every collection detail page.
On settlement confirmation, HoldCollectedFundsWorkflow creates a hold record in the Griffin holding account. The hold_until date is settlement date plus 5 BACS working days — no configuration, no shortcuts. Every morning the reconciliation cron matches Modulr settlement files against Griffin holding-account transactions and surfaces mismatches in the Exceptions queue.
Once the clawback window closes, ForwardFundsWorkflow computes the releasable amount — total holdings past Day+5, minus reserve top-up, minus any pending indemnity holds — and calls Griffin createTransfer from the holding account to the agent's designated client account. A PDF forwarding statement is generated and emailed automatically.
[ FORWARDINGS / AGENT CLIENT ACCOUNT ]
The forwardings view shows every sweep to the agent's Griffin client account — date, amount, included collection count, reserve held, and a PDF download link. The underlying double-entry ledger records every debit and credit across payer bank, Modulr in-transit, Griffin holding, Griffin client, reserve, and indemnity loss accounts. Reports query the ledger directly — not aggregated domain tables.

Join the waitlist and we'll walk you through onboarding your first agent, registering your first mandate, and watching the first collection move through the full BACS cycle.
Questions before you sign up? Email sf-core-org-support-calmony-dd@saas-factory.ai
[ WHEN THINGS GO WRONG / EXCEPTIONS ]
When Modulr delivers an ARUDD return, a child workflow decodes the BACS reason code — 'Refer to Payer', 'Instruction Cancelled', 'Payer Deceased', and the full canonical catalogue — recalls any funds already moved to holding, notifies the agent, and if the code is retry-eligible, schedules a single re-submission for the next available BACS processing date.
ADDACS and AWACS messages auto-cancel or auto-amend the mandate and write structured records to mandate_events.
Indemnity claims clawback funds from the Griffin holding account and create a negative ledger entry visible on the agent's statement.
[ WHAT THE OPERATOR SEES ]
Month and week views of scheduled collections, submission cutoffs, settlement dates, and forwarding dates — colour-coded by status. Click any event to jump straight to the entity.
Funds in the Griffin holding account grouped by agent, with days remaining in the clawback window shown per row. Aggregate totals update in real time as collections settle.
[ BACKGROUND AUTOMATION / ALWAYS ON ]
Runs daily. Finds mandates stuck in pending_auddis beyond 5 BACS working days, collections stuck in submitted or in_clearing beyond 4. Writes an exception record with a deep link for each stall — no manual queue scanning required.
Every Monday at 08:00 UK time, each agent org owner receives a summary of the past week — total collected, total forwarded, open exceptions by severity, mandates activated or cancelled, and BACS return retry status.
[ API / FOR CONSUMING APPLICATIONS ]
A versioned REST API — authenticated by org-scoped API keys, with idempotency-key support on every endpoint — exposes the full lifecycle to consuming applications. API keys cannot read or act on another organisation's data.
Register a new payer with full bank detail validation — sort code, account number, address — before any mandate is created.
Trigger the full AUDDIS workflow and receive webhook events as the mandate moves from pending through to active or rejected.
[ FAQ / COMMON QUESTIONS ]
The Exceptions queue surfaces stuck workflows, reconciliation mismatches, and overdue collections — all triageable via a drag-and-drop kanban.

Every forwarding generates a PDF statement — transfer amount, included collections, reserve top-up, any clawbacks — stored and attached to the forwarding email automatically.

[ COLLECTIONS / BACS LIFECYCLE ]
The collections list shows due date, payer, amount, and every status transition from scheduled through to settled or returned. The detail page renders the BACS 3-day cycle as a visual timeline and links through to the associated holding and forwarding records.
Filter by status, agent, mandate, and date range.
Return reason decoded from the full BACS reason-code catalogue.
Bulk import from CSV for agent migrations.
Daily double-entry verification across the ledger_entries table. Checks that every completed forwarding has a corresponding ledger pair, every collected holding has a debit entry, and flags orphaned entries as exceptions.
BACS rules require cancellation of mandates inactive for 13 months. A weekly sweep finds them, transitions status to expired, cancels scheduled collections, and notifies the agent — automatically, without operator intervention.
Submit a collection for a future due date and query the full collection history with BACS status at every stage.
Outbound signed webhooks fire on every lifecycle transition: mandate.activated, collection.settled, collection.returned, forwarding.completed, and more. Endpoints and secrets managed via the webhook subscription UI.