BigQuery, webhooks, retention, and compliance
Export governance data, subscribe to webhook alerts, set retention, and generate compliance reports.
Best for: Admins exporting governance data and reading compliance reports
BigQuery export, webhooks, retention, and compliance
These four cards are on Governance. The Governance item in the top nav is there when the account includes governance. Back to Governance on each page returns to that hub.
| Card | Line under the card | Opens |
|---|---|---|
| BigQuery Export | Export governance data to Google BigQuery | /meridian/settings/bigquery |
| Webhooks | Connect your apps to governance alerts | /meridian/settings/webhooks |
| Data Retention | GDPR-compliant data lifecycle | /meridian/governance/retention |
| Compliance Reporting | Regulatory + controls tracking (SOC 2-aligned program) | /meridian/compliance |
/meridian/settings/retention only says "Redirecting to Governance..." and opens Data Retention. The card line "SOC 2-aligned program" is the label on Governance. It is not a certification statement.
BigQuery Export
The title is BigQuery Export. The line under it is "Export governance data to Google BigQuery". Create Export opens the setup dialog.
The note is "Export your organization's governance data to your own Google BigQuery project. Data stays in your GCP account. Requires governance (settings.manage) permission."
A load without that permission says "Governance permission required. You need audit.view or settings.manage to access BigQuery exports." Any other failed load says "Failed to load exports".
How to set up Google Cloud for BigQuery export
The panel starts closed. Open How to set up Google Cloud for BigQuery export. The steps are:
- Create a Google Cloud project (or use an existing one). The link is console.cloud.google.com.
- Create a BigQuery dataset in your project. "BigQuery → Create dataset → Choose a name (e.g. meridian_governance)".
- Create a service account. "IAM & Admin → Service Accounts → Create Service Account → Name it (e.g. meridian-bigquery-export)".
- Grant roles to the service account. "Add roles: BigQuery Data Editor, BigQuery Job User".
- Create and download a JSON key. "Service account → Keys → Add Key → Create new key → JSON → Download".
- Use the JSON file here when creating an export. "The key is encrypted and stored securely for your organization only."
Quick CSV Export
Quick CSV Export says "Download governance data as CSV (last 30 days by default). No cloud setup required."
Table starts on ai_requests. The choices are ai_requests, session_events, sso_audit_log, ip_access_log, department_spend, and compliance_reports.
Last N days is 7 days, 30 days, 60 days, or 90 days. It starts on 30 days.
Download CSV saves the file named in the response, or {table}_last{n}days.csv. Success says "Downloaded {filename}". A failure says the server message, "Export failed", or "CSV export failed".
Report Templates
Report Templates says "Predefined filtered reports. Curated queries—safe, no SQL required."
Report lists the templates the server returns, each with its description under the menu. While they load, the menu says "Loading templates...". Last N days is the same 7, 30, 60, and 90 day list, starting on 30 days. Download Report stays disabled until a report is selected. The file name comes from the response, or {template}_last{n}days.csv. Success says "Downloaded {filename}". A failure says "Template export failed", or the server message.
Saved exports
An empty list says No exports configured and "Create an export to start syncing governance data to BigQuery", with Create Export.
Each saved export shows its name, description, {project}.{dataset}, schedule, last run time, a status badge, and "{n} tables". Logs opens Export Logs: {name}. An empty log says "No logs yet". Run Now says "Export started (log: {id})", or "Failed to trigger export". Delete asks "Delete this export configuration?" Success says "Export deleted". A failure says "Failed to delete".
Create BigQuery Export
Create Export opens Create BigQuery Export. Five steps, with Next, Back, and Cancel.
| Step | Fields |
|---|---|
| 1 | Export Name. Placeholder "Daily Governance Export". Description (optional). Placeholder "Export governance data daily". |
| 2 | Service Account JSON. A loaded file says "Credentials loaded". A file that is not JSON says "Invalid JSON file". The note is "Need a key? Close this and expand "How to set up Google Cloud" above for step-by-step instructions." |
| 3 | Project ID. Placeholder "your-gcp-project". Dataset ID. Placeholder "meridian_governance". Test Connection. Missing project or key says "Project ID and credentials required". Success says "Connection successful". A failure says the server error, "Connection failed", or "Connection test failed". |
| 4 | Tables to Export. The same six table names as Quick CSV Export. Check at least one. |
| 5 | Schedule: Hourly, Daily, or Weekly. It starts on Daily. Daily also shows Export Time, which starts at 03:00. |
Create is the button on the last step. Missing name, project, dataset, credentials, or tables says "Name, Project ID, Dataset ID, credentials, and at least one table required". Success says "Export created successfully". A failure says the server message, or "Failed to create export".
Webhooks
The title is Webhooks. The line under it is "Connect your apps to governance alerts". Create Webhook is at the top right.
The note is "Receive HTTP POST requests when governance events occur. Use HMAC-SHA256 (X-Webhook-Signature) to verify authenticity."
With no organization, the page says "Organization context required."
Active only hides inactive endpoints.
An empty list says "No webhooks configured" and Create your first webhook.
Each endpoint shows its name, an active or inactive badge, the last delivery status, the description, Endpoint URL, and Subscribed Events ({n}). The row actions are Pause or Activate, Send test, View logs, and Delete. When a delivery has already run, the row also shows "Last delivery: {time}" and View Logs →.
Pause says "Webhook paused". Activate says "Webhook activated". Send test says "Test webhook sent", or "Test failed". Delete asks "Delete this webhook endpoint?" Success says "Webhook deleted". A failure says "Failed to delete".
Create Webhook
| Field | What it is |
|---|---|
| Name | Placeholder "e.g. Slack Alerts". |
| URL | Placeholder "https://your-app.com/webhook". |
| Description (optional) | Placeholder "What this webhook is for". |
| Events to subscribe | One checkbox per event the account can subscribe to. |
| Max retries | A number from 0 to 10. It starts at 3. |
The descriptions shown beside those events are:
| Event | Description on the form |
|---|---|
| spending.alert_triggered | Org spending alert exceeded (like Slack) |
| department.budget_exceeded | Department exceeded budget |
| department.budget_warning | Department at 80% of budget |
| compliance.finding_created | New compliance finding |
| compliance.critical_finding | Critical compliance issue |
| session.suspicious_activity | Suspicious session detected |
| ip.access_denied | IP access denied |
| sso.login_failed | SSO login failed |
| retention.policy_executed | Data retention cleanup ran |
| export.completed | Export completed successfully |
| export.failed | Export failed |
Cancel closes the dialog. Create Webhook sends it. Success says "Webhook created successfully". A failure says the server message, or "Failed to create webhook".
Delivery Logs
Delivery Logs — {name} columns are Time, Event, Attempt, Status, Response, and Actions. An empty log says "No deliveries yet". Time is the delivery time, "Retry: {time}" when a retry is waiting, or an em dash. Attempt is "#{n}". Status includes the HTTP code when there is one. Response shows milliseconds and, in red, any error text. A failed row has Retry. Success says "Retry scheduled".
Data Retention
The title is Data Retention. The line under it is "Manage data retention policies and automated cleanup".
The four figures, when a log summary is available, are Active Policies, Total Deleted (30d), Executions (30d), and Success Rate. Success rate is successful executions divided by total executions over 30 days, rounded. With no executions it shows 100%.
When there are no policies, the banner is No retention policies configured and "Create default policies to start automated cleanup".
Initialize Defaults asks "Create default retention policies for all data types?" Enable GDPR Mode asks "Enable GDPR compliance mode? This will set minimal retention periods (30-365 days)." Each button then shows the server message.
The tabs are Policies ({n}), Cleanup Logs ({n}), and Statistics.
Policies
Add Policy opens Create Retention Policy.
Data Type starts on "Select data type...". Each choice is "{name} (Recommended: {n} days)". Choosing one fills Retention Period (days) with that recommended number. The period accepts 1 to 7300. Under the box: "{years} years, {remainder} days".
Cleanup Schedule is Daily (2:00 AM), Weekly (Monday 2:00 AM), or Monthly (1st day, 2:00 AM).
Create Policy stays disabled until a data type is chosen. Success says "Policy created successfully". Cancel closes the form.
Active Policies is empty with "No retention policies configured". Each policy shows its name, category, Active or Disabled, "Retention: {n} days", "Schedule: {schedule}", Last run, and Next run.
Edit opens Edit Retention Policy with the policy name, Retention Period (days), and Cleanup Schedule (the same three schedules). Save says "Policy updated successfully". Cancel closes it.
Run Now asks "Execute cleanup for {name} now? This will delete old data immediately." Success says "Cleanup executed: {log id}". Disable says "Policy disabled". Enable says "Policy enabled".
Cleanup Logs
The heading is Cleanup Execution Logs. Empty logs say "No cleanup executions yet". Each row is the data type, "Deleted {n} records in {seconds}s", the start time, and the status (completed, failed, or the status text returned).
Statistics
Each data type is a card with Total Records, Oldest Record (or N/A), and Storage Size.
Compliance Reporting
The title is Compliance Reporting. The line under it is "Generate audit-ready reports of your Meridian governance controls".
With no organization, the title is Organization Required and the line is "You need to be part of an organization to manage compliance reports."
Compliance Score
Compliance Score is "{score}/100" and Grade {letter}. How is this calculated? opens this list. The score starts at 100:
- −20 if SSO is disabled
- −15 if IP allowlist is disabled
- −10 if session timeout is over 480 minutes
- −10 if session limits are not enforced
- −5 per open high or critical finding
"Grade: A (90+), B (80+), C (70+), D (60+), F (<60)".
Quick Stats are Users, Departments, and SSO (Enabled or Disabled).
This score is the control checklist on this page. It is not an outside attestation.
Generate Report
The tabs are Generate Report, Report History ({n}), and Findings ({n}).
Select Report Type lists each template the server returns: the template name, its description, and "{n} sections". Pick one. The selected card shows a check.
Report Settings are Period Start Date and Period End Date. Generate Report stays disabled until a type and both dates are set. While it runs, the button says Generating.... Success says "Report generated successfully (ID: {id})".
Report History
The heading is Generated Reports. Empty history says "No reports generated yet" and Generate Your First Report.
Each row is the report title, "Period: {start} - {end}", "Generated: {time} • {milliseconds}ms", and, when the summary has them, "Score: {n}/100" and "{n} findings". View opens the report. PDF downloads it. The open report repeats the title and period and has Download PDF.
Findings
The heading is Compliance Findings. With none open, the page says "No open findings" and "Your governance controls are compliant".
Each open finding shows its severity, title, Get notified when similar findings occur, the control area, the description, and "Found: {date}".