Un flow n8n qui orchestre un cycle d’émission de mesures conservatoires de litige — envoi de la notice de conservation par email et Slack aux dépositaires désignés, suivi des accusés de réception avec des rappels à une cadence configurable, escalade des non-accusés vers le responsable legal-ops et le manager du dépositaire, journalisation de chaque action dans une table d’audit immuable que le cabinet utilise si l’adéquation des mesures conservatoires est ultérieurement contestée. Remplace le cycle manuel de l’assistant legal-ops basé sur tableur et règles Outlook (typiquement une charge continue de 2-4 heures par semaine une fois que quelques mesures conservatoires sont actives) par un flow déterministe qui ne peut pas oublier un dépositaire.
Quand l’utiliser
Le cabinet émet des mesures conservatoires à une fréquence où le suivi manuel commence à glisser — généralement plus de 3 mesures conservatoires actives simultanément.
Vous avez une source de dépositaires de référence : une table de gestion des dépositaires dans la plateforme ediscovery (Relativity, Everlaw, Logikcull) ou dans un CSV legal-ops maintenu.
Le cabinet a besoin d’une piste d’audit défendable pour l’adéquation des mesures conservatoires. La table d’audit du flow est la réponse à “montrez-nous que vous avez agi raisonnablement pour préserver”.
Le responsable legal-ops et le conseil externe approuvent l’émission des mesures conservatoires ; le flow gère le suivi continu, pas la décision d’émettre.
Quand NE PAS l’utiliser
Engagements avec une seule mesure conservatoire où le suivi manuel convient. Le coût de setup (120 minutes, plus l’intégration avec la source des dépositaires) devient rentable à environ 3 mesures conservatoires actives, pas à une.
Escalade automatique contournant le conseil. Les chemins d’escalade du flow sont configurables, mais la valeur par défaut envoie au responsable legal-ops, PAS directement au DG ou au conseil externe. Le responsable applique son jugement sur les non-accusés qui méritent l’attention du conseil.
Notices de conservation nécessitant un langage personnalisé par dépositaire. Le flow crée des templates par affaire ; si chaque notice nécessite un langage sur mesure, le goulet d’étranglement n’est pas l’orchestration.
Remplacement du jugement du conseil sur le périmètre des mesures conservatoires. Le flow suit les mesures conservatoires aux dépositaires désignés par le conseil. Ajouter ou supprimer des dépositaires est une décision du conseil, pas une décision du flow.
Setup
Importez le flow. Déposez apps/web/public/artifacts/litigation-hold-orchestration-n8n/litigation-hold-orchestration-n8n.json dans votre instance n8n.
Câblez les credentials. Quatre requis : PLACEHOLDER_CUSTODIAN_DB_CRED_ID (accès en lecture à la source des dépositaires), PLACEHOLDER_SMTP_CRED_ID (SMTP pour l’email de notice de conservation), PLACEHOLDER_SLACK_CRED_ID (Slack pour la notification en canal), PLACEHOLDER_AUDIT_DB_CRED_ID (accès en écriture à la table d’audit immuable).
Rédigez le template de notice de conservation. Par affaire, écrivez un template Markdown sous n8n/data/hold-notices/<matter-id>.md. Le template inclut le langage approuvé par le conseil sur le périmètre de conservation, les actions interdites (suppression, altération), et les instructions d’accusé de réception.
Configurez les chemins d’escalade. La valeur par défaut du flow : rappel à +3, +7, +14 jours ; escalade vers le responsable legal-ops à +14 ; escalade vers le manager du dépositaire à +21. Ajustez selon le profil de risque du cabinet.
Configurez la table d’audit. Une table Postgres / Snowflake indexée sur (hold_id, custodian_id, action, timestamp) avec une contrainte append-only appliquée au niveau DB (immuable ; le conseil doit démontrer que le journal d’audit ne peut pas être modifié rétroactivement).
Dry-run sur une mesure conservatoire clôturée. Rejouez la liste des dépositaires d’une mesure conservatoire clôturée. Confirmez que les timings de notification, rappel et escalade correspondent à ce que l’assistant legal-ops faisait manuellement auparavant.
Ce que fait le flow
Sept nœuds, en deux phases. La phase 1 (émission) se déclenche une seule fois par mesure conservatoire. La phase 2 (suivi) est un cron quotidien vérifiant les non-accusés et envoyant des rappels / escalades.
Issue Trigger — déclencheur manuel ou webhook depuis la plateforme legal-ops quand le conseil marque une mesure conservatoire prête à être émise.
Load Custodian List — extrait la liste des dépositaires depuis la source configurée pour l’affaire.
Send Hold Notice — email + Slack à chaque dépositaire. L’email inclut le template de notice de conservation et un lien d’accusé de réception unique par dépositaire. Journal d’audit : une ligne par dépositaire par notice_sent.
Daily Cron Tracker (déclencheur de workflow séparé) — du lundi au vendredi à 9h00 heure du bureau. Vérifie la table d’audit pour les dépositaires qui n’ont pas accusé réception dans la fenêtre configurée.
Determine Action — nœud Code. Pour chaque non-accusé, détermine : envoyer un rappel (à +3, +7), escalader vers le responsable legal-ops (à +14), escalader vers le manager (à +21).
Dispatch Reminder / Escalation — envoie un email de rappel ou d’escalade selon l’action déterminée. Entrée de journal d’audit par envoi.
Acknowledgement Webhook — webhook séparé qui reçoit le clic d’accusé de réception du dépositaire. Enregistre dans la table d’audit ; arrête les rappels supplémentaires pour ce dépositaire.
Réalité des coûts
Coût n8n — auto-hébergé gratuit ; n8n Cloud au nombre d’exécutions de workflow généré (~3-5/jour par mesure conservatoire active) est confortablement dans le plan Starter.
Tokens LLM — aucun. Le flow est déterministe.
SMTP / Slack — dans les quotas standard.
Temps de l’assistant legal-ops — le bénéfice. Le suivi manuel de 5-10 mesures conservatoires actives représente 4-8 heures/semaine. L’exploitation du flow consiste à surveiller la table d’audit pour les vraies exceptions, ~30 min/semaine.
Temps de setup — 120 minutes incluant le provisionnement de la table d’audit, plus 30-60 minutes par affaire pour la rédaction du template de notice de conservation.
Métrique de succès
Délai d’émission depuis la décision “émettre” du conseil — devrait passer à moins d’1 heure (manuellement, c’est souvent une journée pour de grandes listes de dépositaires).
Taux d’accusé de réception à +14 jours — devrait dépasser 95 % sur les mesures conservatoires de routine. En dessous, le template de notice doit être retravaillé ou la liste des dépositaires contient des enregistrements périmés.
Complétude de l’audit lors de la revue du conseil — part des mesures conservatoires pour lesquelles le conseil peut produire une piste d’audit complète et défendable à la demande. Devrait être 100 % ; la table d’audit est la source.
Comparaison avec les alternatives
vs module de conservation intégré de la plateforme ediscovery (Relativity Legal Hold, Logikcull, Everlaw). Choisissez le module de la plateforme si vous vivez dans l’outil ediscovery. Choisissez le flow si vos dépositaires s’étendent sur Slack, email et les systèmes RH et que vous avez besoin de surfaces de notification au-delà des valeurs par défaut de la plateforme.
vs outils SaaS de gestion des mesures conservatoires (Onna, Exterro Legal Hold). Choisissez ceux-là pour le self-service avancé des dépositaires et la conservation intégrée. Choisissez le flow si vous voulez l’orchestration dans votre propre infrastructure avec le journal d’audit dans votre propre base de données.
vs tableur + règles Outlook. La solution par défaut et la source de dépositaires oubliés à l’échelle. Le flow est le remplacement déterministe.
Points de vigilance
Dérive de la liste des dépositaires.Garde-fou : le flow ré-extrait la liste des dépositaires à chaque vérification, avec le last_updated_at de la source contrôlé. Si la liste a dérivé (dépositaire ajouté/supprimé) sans approbation du conseil, le flow présente le diff au responsable legal-ops plutôt que d’agir silencieusement sur la nouvelle liste.
Mutabilité de la table d’audit.Garde-fou : la table d’audit doit être append-only au niveau DB (Postgres : REVOKE UPDATE, DELETE FROM ALL). Le flow n’applique pas cela — la base de données le fait. Le README documente le schéma avec la contrainte en ligne.
Dérive du texte de la notice.Garde-fou : les templates de notice par affaire font l’objet d’un hash SHA au moment de l’émission ; le journal d’audit capture le SHA. Si le conseil veut modifier la notice, la modification est une action distincte dans le flow, pas une ré-émission silencieuse.
Opt-out du dépositaire / ignore silencieux.Garde-fou : l’escalade vers le manager à +21 jours convertit le problème d’un problème de dépositaire en un problème de management. Au-delà, le responsable legal-ops peut avoir besoin d’impliquer le conseil externe — le flow présente mais n’agit pas.
Différences de conservation entre juridictions.Garde-fou : le flow suppose la sémantique américaine des mesures conservatoires de litige. Le “devoir de conservation” de style européen au titre du futur AI Act et du RGPD a un périmètre différent ; le template de notice par affaire gère ceux-là.
Posture de confidentialité sur l’email du dépositaire.Garde-fou : les notices de conservation peuvent signaler l’existence d’une affaire de litige au dépositaire ; le chemin SMTP utilise le serveur mail du cabinet (pas un SaaS tiers) pour la confidentialité.
Stack
Le bundle se trouve dans apps/web/public/artifacts/litigation-hold-orchestration-n8n/ :
litigation-hold-orchestration-n8n.json — l’export du flow
_README.md — setup des credentials, schéma de la table d’audit, procédure de dry-run
audit-table-schema.sql — DDL pour la table d’audit immuable
hold-notice-template.md — template de notice de conservation à compléter par affaire
Outils : n8n (orchestration), Slack (notification en canal), Claude (optionnel — pour le résumé quotidien de l’activité du journal d’audit vers le responsable legal-ops, pas pour les étapes de décision).
# Litigation hold orchestration — n8n flow
Orchestrates a litigation-hold issue cycle: notification, acknowledgement tracking, reminder cadence, escalation paths, and an immutable audit log. Replaces the spreadsheet-and-Outlook-rules manual cycle with a deterministic flow that can't drop a custodian.
## Import
1. Import `litigation-hold-orchestration-n8n.json` into n8n.
2. Set workflow timezone to your office TZ.
3. Provision the audit table (DDL in `audit-table-schema.sql`).
4. Wire credentials.
5. Do NOT enable until dry-run confirms behavior on a closed hold.
## What ships in this bundle
This n8n export covers the **issuance** half of the cycle (Phase 1). The tracking + escalation half (Phase 2 — daily cron, reminders, escalation) is intentionally a separate workflow you wire to the same audit table; that lets the issuance flow be triggered fresh per hold while the tracker runs continuously across all active holds.
The Phase 2 tracker is a 4-node workflow:
1. Cron daily 9am office TZ.
2. Postgres query against the audit table: select hold/custodian pairs without `acknowledged` action.
3. Code node: determine action (reminder at +3, +7; escalation to legal-ops lead at +14; escalation to manager at +21).
4. Email send + audit-log append.
The DDL and the audit-query are in this README's appendix below; the Phase 2 export is left to the legal-ops engineer to assemble per the firm's escalation paths (which vary by jurisdiction and matter type more than the issuance step does).
## Credentials
### `PLACEHOLDER_CUSTODIAN_DB_CRED_ID` — Custodian source
Read access to wherever the custodian list lives:
- **In-house Postgres** — the default. Schema documented in the `Load Custodian List` node.
- **Relativity / Everlaw / Logikcull** — replace the Postgres node with an HTTP node calling the platform's custodian endpoint.
- **HRIS** — possible if HRIS is the source of truth, but legal-ops typically maintains the custodian list separately.
### `PLACEHOLDER_SMTP_CRED_ID` — SMTP
Use the **firm's own mail relay**, not a third-party SaaS like SendGrid. Hold notices may flag the existence of a litigation matter; routing them through a third party expands the privilege exposure.
### `PLACEHOLDER_SLACK_CRED_ID` — Slack bot token
`chat:write` scope. The bot needs to be invited to the workspaces where custodians live; per-custodian DMs require user-level scope which Slack handles automatically when the bot is in the workspace.
### `PLACEHOLDER_AUDIT_DB_CRED_ID` — Audit table
Write access to the audit table. The table itself must be append-only at the DB level (DDL below).
## Audit table schema
```sql
CREATE TABLE hold_audit (
audit_id BIGSERIAL PRIMARY KEY,
hold_id TEXT NOT NULL,
custodian_id TEXT NOT NULL,
action TEXT NOT NULL CHECK (action IN (
'notice_sent',
'reminder_sent',
'escalated_to_lead',
'escalated_to_manager',
'acknowledged',
'released'
)),
template_sha TEXT,
payload_json JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX hold_audit_lookup_idx ON hold_audit (hold_id, custodian_id, action);
-- Immutability: the audit table is the firm's defensibility chain.
-- Counsel needs to be able to demonstrate the log can't be edited.
REVOKE UPDATE, DELETE, TRUNCATE ON hold_audit FROM PUBLIC;
REVOKE UPDATE, DELETE, TRUNCATE ON hold_audit FROM <legal_ops_app_role>;
GRANT INSERT, SELECT ON hold_audit TO <legal_ops_app_role>;
```
The `REVOKE` statements are NOT optional. Without them the table is editable, and counsel cannot demonstrate the audit log's defensibility under e-discovery scrutiny.
## Hold-notice template
Save per-matter templates as `n8n/data/hold-notices/<matter-id>.md`. The template uses these placeholders, replaced per custodian by the `Personalize Notice` node:
- `{{custodian_name}}` — custodian's full name
- `{{matter_id}}` — matter identifier
- `{{hold_id}}` — hold identifier
- `{{ack_url}}` — per-custodian acknowledgement URL
Sample template structure (counsel approves the actual language):
```
Dear {{custodian_name}},
This is a litigation hold notice for Matter {{matter_id}}.
You are required to preserve all documents, communications, and electronic
data related to [counsel-defined scope]. This includes [specific systems
and document types].
You must NOT delete, alter, or destroy any potentially relevant material,
even if it would be deleted under normal retention policy.
Please acknowledge receipt of this notice by clicking the link below
within 7 business days:
{{ack_url}}
If you have questions about scope or what to preserve, contact [legal-ops
contact].
This hold remains in effect until you receive a written release notice
from the legal department.
[counsel signature block]
```
## Phase 2 tracker query
The Phase 2 daily cron uses this query to find non-acknowledgers:
```sql
WITH last_action AS (
SELECT hold_id, custodian_id, MAX(created_at) AS last_action_at,
BOOL_OR(action = 'acknowledged') AS acknowledged
FROM hold_audit
WHERE action IN ('notice_sent', 'reminder_sent', 'acknowledged', 'released')
GROUP BY hold_id, custodian_id
)
SELECT
la.hold_id,
la.custodian_id,
la.last_action_at,
EXTRACT(EPOCH FROM (NOW() - la.last_action_at)) / 86400 AS days_since_last_action,
(SELECT MIN(created_at) FROM hold_audit ha
WHERE ha.hold_id = la.hold_id AND ha.custodian_id = la.custodian_id
AND ha.action = 'notice_sent') AS first_notice_at
FROM last_action la
WHERE la.acknowledged = false
AND NOT EXISTS (
SELECT 1 FROM hold_audit ha
WHERE ha.hold_id = la.hold_id AND ha.custodian_id = la.custodian_id
AND ha.action = 'released'
);
```
The tracker computes `days_since_first_notice`, decides action, dispatches.
## Dry-run procedure
1. Provision the audit table on a non-production DB.
2. Wire credentials against staging endpoints (test SMTP, test Slack workspace).
3. Replay a closed hold's custodian list manually.
4. Confirm: notification fires once per custodian; audit log records each send; per-custodian acknowledgement URLs are unique.
5. Switch to production DB. Issue your next real hold via the flow.
## Known limits
- Phase 1 issuance only ships in this n8n export; Phase 2 tracker is documented but not bundled.
- The flow assumes per-custodian email + Slack. Custodians without Slack accounts (contractors, alumni) get email only — the Slack node fails gracefully but the failure is silent in the audit log. The Phase 2 tracker should treat email-only custodians the same as Slack+email.
- Acknowledgement URL routing requires a separate webhook endpoint (the `/ack/<hold>/<custodian>/<token>` URL) — deploy that as a small Express / Flask endpoint that writes `action: acknowledged` to the audit table. The endpoint is NOT bundled.
- The flow does not handle hold-release. Release is its own action — when counsel releases, a separate webhook writes `action: released` to the audit table per custodian. The tracker stops sending reminders to released custodian/hold pairs.
-- Litigation hold audit table — append-only DDL.
-- Counsel's defensibility chain depends on this table being immutable.
CREATE TABLE hold_audit (
audit_id BIGSERIAL PRIMARY KEY,
hold_id TEXT NOT NULL,
custodian_id TEXT NOT NULL,
action TEXT NOT NULL CHECK (action IN (
'notice_sent',
'reminder_sent',
'escalated_to_lead',
'escalated_to_manager',
'acknowledged',
'released'
)),
template_sha TEXT,
payload_json JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX hold_audit_lookup_idx
ON hold_audit (hold_id, custodian_id, action);
CREATE INDEX hold_audit_created_idx
ON hold_audit (created_at);
-- Immutability constraints. NOT optional.
-- Replace <legal_ops_app_role> with the DB role your n8n flow uses.
REVOKE UPDATE, DELETE, TRUNCATE ON hold_audit FROM PUBLIC;
GRANT INSERT, SELECT ON hold_audit TO <legal_ops_app_role>;
-- Optional: row-level revisioning if you anticipate legitimate
-- corrections (e.g. a custodian acknowledged offline and the lead
-- needs to record it). Even then, NEVER UPDATE existing rows —
-- INSERT a 'corrected_offline' action with a payload_json reference
-- to the prior row's audit_id, preserving the original record.
# Hold notice template
Per-matter template the litigation-hold flow personalizes per custodian. Copy this file to `n8n/data/hold-notices/<matter-id>.md` per matter and customize counsel-approved language.
The template uses these placeholders, replaced per custodian by the `Personalize Notice` node:
- `{{custodian_name}}`
- `{{matter_id}}`
- `{{hold_id}}`
- `{{ack_url}}`
---
# Litigation Hold Notice — Matter {{matter_id}} — Hold {{hold_id}}
Dear {{custodian_name}},
The firm's legal department is issuing a litigation hold related to Matter {{matter_id}}. As a custodian whose records may be relevant, you are required to take immediate steps to preserve potentially relevant material.
## What you must preserve
You must preserve all documents, communications, and electronic data related to [counsel-defined scope — replace with matter-specific scope]. This includes, but is not limited to:
- Email (work and any personal email used for work-related communication on this matter)
- Slack messages, including DMs and channel posts
- Documents (Google Drive, SharePoint, OneDrive, local files)
- Calendar entries
- [Other systems specific to this matter — replace with named systems]
The scope covers material from [counsel-defined date range] to the date this hold is released in writing.
## What you must NOT do
You must NOT delete, alter, modify, or destroy any potentially relevant material, even if the firm's normal retention policy would otherwise permit deletion.
You must NOT discuss this hold's scope or substance with anyone outside the legal team and your direct counsel of record.
## What this means in practice
- **Auto-deletion settings:** check email, Slack, and document-system retention settings. If any are set to delete material in the relevant scope, contact [legal-ops contact] immediately.
- **Personal devices:** if you have used personal devices or accounts for any work related to this matter, [legal-ops contact] will work with you on appropriate preservation.
- **Departing the firm:** if you leave the firm while this hold is in effect, [legal-ops contact] will work with HR and IT to preserve your records before any account decommissioning.
- **Replacement of equipment:** do not destroy or recycle hardware in scope until [legal-ops contact] confirms preservation.
## Acknowledgement
You must acknowledge receipt of this notice within 7 business days. Please click the link below:
[{{ack_url}}]({{ack_url}})
If you have not received an automated reminder by [date + 14 days], please contact [legal-ops contact] to confirm your acknowledgement was recorded.
## Questions
For questions about scope or what to preserve, contact:
- [legal-ops contact name and email]
- [outside counsel contact, if applicable]
Do NOT discuss the substance of the matter outside this channel.
## When this hold ends
This hold remains in effect until you receive a written release notice from the legal department. Verbal release is not sufficient. Until you receive written release, you must continue to preserve material in scope.
---
[counsel signature block]
[firm letterhead — match firm's standard hold-notice formatting]