synthmind

Every message, judged as things stood when it went out.

Answer the complaint with a message-by-message record. Each send is checked against your agreed policy at the instant it went out, with the supporting rows shown and every gap in the history named.

Discuss my deadline 4,000 € per audit · one history up to 100,000 input rows · one corrected re-run · a sample month first, free
Illustrative example · one campaign, three messages
Blocked at sendm-4472 · sent 2026-02-15 10:03 UTC
Rule 3, from your sentence: a message may be sent to a contact whose consent is confirmed and not revoked at the time of sending.
consent confirmed 2025-11-02 09:14 consents.csv line 118
revoked 2026-01-20 16:40 consents.csv line 2207
no re-confirmation before 2026-02-15 10:03 consents.csv read to its end, feed finished 2026-03-01
Certificate: the verdict follows from these rows and rule 3. Checked by a part of the system that did not compute it. Passed.
Mailable at send, barred todaym-4480 · sent 2026-02-20 08:30 UTC
revoked 2026-01-20 16:40, re-confirmed 2026-02-01 11:02 consents.csv lines 2207, 2391
suppressed since 2026-03-04 suppressions.csv line 77
Listed apart from the breaches, with both dates. A query against today's suppression list would have called this one a breach.
Not yetm-4490 · sent 2026-03-01 09:00 UTC
suppression feed ends 2026-02-28 suppressions.csv, last row
The verdict waits on the March suppression export. It is not guessed.

What you get back

Blocked at sendThe list Legal asked for. Each message with the rule and the rows it rests on.
Lawful then, barred nowListed apart, with the dates. These are the ones a query against today's list gets wrong.
Not yetWhat the history cannot say, and which feed closes it.

Check it yourself

Nobody has to trust us, and nobody has to read the code. The listing is built so a paralegal can check it.

Ten lines at randomPick any ten verdicts. Open the file, go to the line, compare the timestamp. A minute each, no help from us.
One planted faultBefore the sample run we remove one row and alter one timestamp. The listing names what changed, or says “not yet” and names the gap. We tell you which rows afterwards. Plant one of your own as well and don’t tell us.
The same answer twiceRun the same files again next week and the listing comes back byte for byte the same. Change one row and exactly the verdicts that rest on it move, each shown with its old and new grounds.
A refusal you can seeA verdict that cannot be shown from the rows is refused and named, never printed. The example above has one: m-4490 waits on a feed that ends too early.

Start with a sample, free

Send one month of sends with the consent and suppression exports for the same contacts, pseudonymised. You get that month’s listing back at no charge, planted fault included, so you see what the record looks like before deciding anything. If a reply to the regulator is due on a date, say the date and we work back from it.

How it runs

File in, listing out. We run it. A one-page intake tells us which column is which and which clock the timestamps use. You get the listing the same working day after we accept complete files and you approve our reading of the policy; files accepted before 12:00 CET count for that day. If a feed was wrong, you send a corrected one and we run it again.

What you give us

Price

4,000 € per audit

One history of up to 100,000 input rows across all files. One re-run after a corrected feed. Invoiced before the run. If your files or your policy cannot support the audit, we say so before the invoice and nothing is owed.

Not included: legal advice, a dashboard, an integration with your email platform, or the software itself.

What the listing establishes

That each verdict follows from the agreed rules and the supplied records, and that a separate checker confirmed it from the rows. It does not establish that the records are complete, or that your policy meets the law. Those stay with you and your counsel, and the listing is built so they can check them: every verdict names its rows, and every gap says what is missing.

Who runs it

Harri Sarsa, Sarsa Formation OÜ, Tallinn. One person reads your policy, writes the rules you approve, runs the audit and signs the intake. Before this: chief product officer at AppGyver, acquired by SAP in 2021, and at ASILAB.

The audit is one run of synthmind, a reasoning engine whose every answer carries the rows it rests on and whose checker is separate from the part that computes. No language model is involved anywhere in it.

Start

Write to Harri Sarsa with the date on the letter, or send the sample month. You get the intake page the same day.

hello@muoto.xyz