# Weekly Google Vault legal hold register snapshot

> Every Friday, log every open matter, hold, and custodian from Google Vault into a Google Sheet as a defensible weekly audit trail.

- Workflow type: code
- Services: Google Vault, Google Sheets
- Categories: Operations
- Published: 2026-07-17

## What it does

- Runs automatically every Friday at 5pm Eastern so the weekly snapshot never gets forgotten
- Pulls every currently open matter in Google Vault along with every legal hold attached to each one
- Compiles one row per held custodian with the snapshot date, matter name, hold name, data type on hold, and custodian email
- Appends the full batch to your Legal Hold Register spreadsheet as a dated, append-only audit log you can point auditors and outside counsel at

## What you'll need

- A Google Workspace account with Vault permissions to view all matters and holds across your organization
- A Google Sheet with a tab called "Legal Hold Register" ready to receive new rows each week
- A Google Sheets sign-in with edit access to that spreadsheet

## Prompt

Every Friday at 5pm America/New_York, snapshot our entire Google Vault legal hold register to a Google Sheet so we have a defensible weekly audit artifact that lives outside of Vault.

Trigger: cron, every Friday at 17:00 America/New_York.

Step 1. Call Google Vault List Matters with state=OPEN and paginate through every page until nextPageToken is empty. Collect the full list of open matters.

Step 2. For each open matter, call Google Vault List Holds against that matter's id, paginating through every page. Collect every hold under every matter.

Step 3. For each hold, call Google Vault List Hold Accounts against that matter id and hold id, paginating through every page. Collect every held account under every hold.

Step 4. Flatten the result into a single table with one row per held account per hold. Each row must have exactly these columns, in this order: snapshot_date (today's date in America/New_York, ISO format YYYY-MM-DD), matter_name, matter_id, hold_name, hold_corpus (the corpus enum from the hold: MAIL, DRIVE, GROUPS, HANGOUTS_CHAT, VOICE, or CALENDAR — pass through verbatim, do not translate), custodian_email (the email from the held account, falling back to the accountId if email is not present), hold_created_date (the updateTime of the hold in ISO format). If a hold has no accounts (e.g. it targets an org unit rather than individual accounts), still emit one row for that hold with custodian_email left blank so the hold is not silently missing from the register.

Step 5. Call Google Sheets Append Values on the target spreadsheet, range "Legal Hold Register", valueInputOption=RAW, insertDataOption=INSERT_ROWS. Append every row in one call. Do not write a header row on subsequent runs; assume the header row already exists in the sheet.

Behavior notes: every step is deterministic — no reasoning, no summarization, no drafting. Pass the corpus and timestamps through verbatim; do not interpret them. Respect Google Vault's rate limit of 60 requests per 100 seconds by pacing hold and account lookups if the matter set is large. On any Vault or Sheets error, fail the run loudly rather than writing a partial register (partial snapshots are worse than none, since they look complete to an auditor). Log the total number of matters, holds, and rows appended in the run output for verification.

The target spreadsheet id and any org-specific filters should be exposed as workflow inputs so the operator can point this at their register without editing code.

## How to customize

- Change the day and time if Friday afternoon is not your compliance review cadence
- Add or remove columns (search terms, organizational unit, hold updated date) to match your internal audit template
- Point at a different spreadsheet or tab if you keep separate registers per business unit or region

## FAQ

### Why keep a weekly snapshot when Google Vault already stores every hold?

Vault shows you the current state of holds, not the historical state. A weekly external snapshot lets you answer questions like "who was on hold for this matter on the last Friday of March?" months later, even if someone has since edited or released the hold, and it lives outside Vault so you can hand it to auditors or outside counsel without granting them Vault access.

### Does this include matters that have been closed?

No. The workflow filters to matters in the OPEN state so the register reflects only active preservation obligations. If you also need a record of recently closed matters you can broaden the filter or run a second copy of the workflow.

### Will this affect the matters or holds in Vault?

No. The workflow only reads from Vault. It never creates, edits, or releases any matter, hold, or custodian, so it cannot disturb an ongoing preservation.

### Can I run this more or less often than weekly?

Yes. Compliance teams often move to daily during active discovery and back to monthly during quiet periods. You can change the schedule at any time without changing anything else in the workflow.

### What if a custodian is on multiple holds or multiple matters?

They appear on a separate row for each hold and matter combination. That is the point of the flattened format: one row per held account per hold, so a search for a single email tells you every matter that account is preserved under as of that snapshot date.

Use this prompt in General Input: https://www.generalinput.com/prompts/weekly-google-vault-legal-hold-register-snapshot