Data export
Everything Quorum stores for a workspace can be taken out as one archive, at any time and at no charge. This page describes how to get it, what is in it, and what is left out and why. It is generated from the same rules the export follows.
How to get it
- An administrator opens Settings → Export and deletion and asks for an export. Because it takes the workspace’s data away, it needs a second check: the administrator’s authenticator code if they have one, otherwise a sign-in within the last 15 minutes.
- The archive is built in the background. The administrator who asked is emailed a download link when it is ready.
- Downloading needs both that link and a signed-in administrator of the same workspace. While it waits, the archive is stored encrypted, and it is deleted 7 days after the request. One export runs at a time; a new request replaces the previous archive.
- The request is recorded in the workspace’s audit trail.
What the archive contains
A zip file in format quorum.workspace-export/1, with:
| File | Contents |
|---|---|
tables/<Table>.json | Every row Quorum stored for the workspace, one JSON array per table, columns as stored. Times are UTC in ISO 8601. Money columns ending in Cents are hundredths of the workspace currency. |
csv/people.csv | The directory: id, email, name, role, imported department, team, cost band, hourly rate and currency, administrator, active, deactivation date. |
csv/meetings.csv | Every stored meeting with its times, platform, series, invitee counts, planned and recorded cost, cancelled and private flags. A blank cost is unknown, not zero. |
csv/series.csv | Recurring series with their occurrences, first and last dates, planned cost and how many occurrences have no price. |
csv/costs.csv | The team cost ledger for the period it names: the workspace's retention window, at most 365 days. |
manifest.json | The format, when it was generated, the workspace, each table with its row count and any columns left out, each CSV with its row count, and every table left out with the reason. |
README.txt | A plain-text guide to the files and to what was left out. |
CSV files are comma-separated UTF-8 with a header row. A cell that starts with a character a spreadsheet would treat as a formula is prefixed with an apostrophe.
Left out of every export
- Secrets. Credentials, tokens, password hashes and authenticator secrets never leave Quorum, not even to the workspace that stored them.
- What the product shows to one person only. A person’s private-time blocks, My week settings and pulse answers are not in an administrator’s export. Each person can download them in their own export (below).
- Operational state. Queued jobs, delivery receipts, caches and the export archives themselves describe how Quorum runs, not the workspace.
- Some columns and rows, as listed in the register: for example, copies of private meetings, which would show whose calendar held them, and who took part in a conversation, which administrators see only as a count.
One person’s data
- Anyone who can open their My week can download everything Quorum stores about them in the workspace under Your data, as a JSON file in format
quorum.person-export/1. It includes what only they can see. Nobody else is told. - An administrator can download what Quorum holds about one person under People → the person → Data requests, to answer that person’s request. It holds what administrators can already see, and the download is recorded in the audit trail.
When you leave
After the agreement ends, administrators can still export for 30 days. Then the workspace is deleted after a 14-day cooling-off period. Switching to another provider under the EU Data Act, and the deletion that follows, are described in the Terms of service. What remains after deletion is described in the Privacy notice.
The archive is a snapshot in Quorum’s own table layout, documented below. It is not an industry-standard interchange format, and Quorum does not import it back. To move it to another system, map its tables to that system’s import. The CSV files are the quickest start.
Register of exported tables
Every table in the archive and the columns it carries, as Quorum stores them.
| Table | Columns | Notes |
|---|---|---|
Company | id, name, domain, transcriptsEnabled, timeZone, locale, currency, language, costDisplay, meetingRulesVersion, createdAt | Left out: referralCode. |
AccessReview | id, companyId, reviewedById, note, summary, reviewedAt | — |
AssistantQuery | id, companyId, channel, outcome, topics, model, inputTokens, outputTokens, createdAt | Left out: employeeId. Who asked is left out: Settings shows usage as a count. |
AuditLog | id, companyId, actorId, actorType, action, subject, detail, ip, userAgent, seq, prevHash, contentHash, hash, redactedAt, createdAt | — |
AuditReport | id, companyId, weekStart, memo, memoParams, source, findings, createdAt | — |
CalendarAudit | companyId, startedAt, endsAt, shareVersion, shareExpiresAt, convertedAt, convertedById | — |
CalendarEvent | id, companyId, employeeId, provider, providerEventId, iCalUid, meetingInstanceId, syncedAt, isCancelled, declined | Copies of private meetings are left out: they would show whose calendar held a private meeting. |
CostBand | id, companyId, name, hourlyCostCents | — |
Discussion | id, companyId, source, externalId, title, url, commentCount, reviewCommentCount, messageCount, participantCount, firstMessageAt, lastMessageAt, waitingSince, firstResponseAt, resolved, scope, authorKind, teamId, proposeMeeting, asyncCostCents, meetingCostCents, reason, reasonCode, reasonParams, proposedAt, decidedAt, decidedById, dismissed, createdAt, updatedAt | Left out: participantIds. Participants are a count only: who took part in which thread is not shown to administrators. |
Employee | id, companyId, email, displayName, role, department, teamId, isActive, isAdmin, costBandId, slackUserId, githubLogin, emailVerifiedAt, sessionsValidFrom, costDisplay, deactivatedAt | Left out: passwordHash. |
ExternalAccount | id, companyId, source, accountId, employeeId, createdAt | — |
HrisConnection | id, companyId, provider, upstreamSyncedAt, originId, integrationId, tool, status, syncEnabled, autoApply, connectExpiresAt, lastFetchedAt, lastAppliedAt, lastError, coverage, createdAt, updatedAt | Left out: encryptedAccountToken, encryptedConnectLink. |
McpToken | id, companyId, name, prefix, teamId, createdById, expiresAt, revokedAt, revokedById, lastUsedAt, createdAt | Left out: tokenHash. |
MeetingBudget | id, companyId, teamId, hoursPerPersonPerMonth, moneyCentsPerMonth, digestEnabled, lastDigestMonth, updatedById, createdAt, updatedAt | — |
MeetingInstance | id, companyId, canonicalKey, seriesId, title, startsAt, endsAt, originalStartsAt, calendarUpdatedAt, calendarCreatedAt, organizerCalendarSeen, organizerEmployeeId, organizerEmail, calendarProvider, meetingPlatform, joinUrl, description, feedbackAgenda, feedbackRequestedAt, isSensitive, cancelledAt, plannedCostCents, actualCostCents, createdAt, flagLowAttendance, flagPoorlyRated, flagOversized, flagNoAgenda, flagOverran, sessionStartsAt, sessionEndsAt | — |
MeetingReset | id, companyId, name, status, teamIds, departments, minInvitees, justifyBy, coolingOffDays, measurementDays, createdById, launchedAt, launchedById, closedAt, createdAt, updatedAt | — |
MeetingSeries | id, companyId, seriesKey, title, hasEndDate | — |
Policy | id, companyId, largeMeetingThreshold, maxDefaultInvitees, maxDurationMinutes, agendaRequiredOver, protectedDays, protectedStartHour, protectedEndHour, workdayStartHour, workdayEndHour, rulesSetAt, externalSharingAllowed, retentionDays, transcriptRetentionDays, deactivatedRetentionDays, pricePerUserCents, assistantEnabled, emphasis, shortNoticeHours, noMeetingDays, weeklyMeetingHoursCap, selfViewMembers, selfViewMoney, scimGroupsAsTeams, checkInTool, checkInUrl, requireMfaForAdmins, ssoOnly, ssoBreakGlassEmployeeId, privacyContactEmail | — |
ProviderConnection | id, companyId, provider, externalAccountId, calendarEmployeeIds, status, lastSyncedAt, lastErrorAt, lastError, createdAt | Left out: encryptedCredentials. |
ResponseAgreement | id, companyId, scope, scopeKey, scopeLabel, teamId, targetWorkingHours, targetShare, ownerTeamId, remindersEnabled, digestEnabled, createdById, createdAt, updatedAt | — |
ScimGroup | id, companyId, displayName, externalId, teamId, createdAt, updatedAt | — |
ScimToken | id, companyId, hint, createdById, createdAt, expiresAt, lastUsedAt, revokedAt, revokedById | Left out: tokenHash. |
ScimUser | employeeId, companyId, externalId, managerId, deletedAt, createdAt, updatedAt | — |
SlackChannel | id, companyId, channelId, name, error, checkedAt, createdAt, updatedAt | — |
SlackGroupPlacement | employeeId, companyId, groupId, teamId, createdAt | — |
SlackUserGroup | id, companyId, slackGroupId, name, handle, disabled, broad, memberSlackIds, outsideCount, teamId, importedAt, seenAt, createdAt, updatedAt | — |
SlackUserGroupRead | companyId, readAt, error | — |
SubprocessorNotice | id, companyId, version, recipients, sentAt | — |
SubprocessorObjection | id, companyId, version, subprocessor, reason, createdById, createdAt, operatorNotifiedAt | — |
Team | id, companyId, name, parentId, managerId, createdAt, updatedAt | — |
TeamLoadWeek | id, companyId, teamId, weekStart, score, band, hoursPerPersonPerWeek, focusDayRatio, method, recordedAt | — |
TeamsChannel | id, companyId, channelId, teamId, name, teamName, checkedAt, createdAt, updatedAt | — |
WorkspaceDeletion | companyId, requestedById, requestedByRole, reference, requestedAt, scheduledFor, startedAt | — |
AiRecommendation | id, meetingInstanceId, email, phase, classification, rawClassification, confidence, rationale, requiredSection, model, createdAt, analysisRunId | — |
AsyncBrief | id, meetingInstanceId, recipientEmail, content, createdAt | — |
AttendanceRecord | id, meetingInstanceId, email, employeeId, providerIdentity, providerDisplayName, joinedAt, leftAt, durationSeconds, source | Google Meet rows keep their times and durations without the person. |
HrisGroup | id, connectionId, sourceId, name, type, parentSourceId, deleted, present, teamId | — |
HrisPerson | id, connectionId, sourceId, employeeId, workEmail, displayName, jobTitle, jobTitleAmbiguous, employmentStatus, managerSourceId, groupSourceIds, startDate, terminationDate, deleted, present, lastSeenAt, lastApplied, issue | — |
InvitedParticipant | id, meetingInstanceId, email, displayName, providerIdentity, role, employeeId, isOrganizer, isExternal, rsvp | — |
MeetingAnalysisRun | id, meetingInstanceId, phase, inputHash, model, input, batchCount, meetingPurpose, agendaReview, completedAt, requestedAt, createdAt | — |
MeetingAttendanceMatch | id, meetingInstanceId, providerIdentity, employeeId, confirmedById, confirmedAt | — |
MeetingResetDelivery | id, resetId, ownerId, kind, channel, status, detail, sentAt, createdAt, updatedAt | — |
MeetingResetEntry | id, resetId, seriesId, ownerId, status, justification, changeAction, insightId, respondedAt, respondedById, retiredConfirmedAt, retiredConfirmedBy, revision, createdAt, updatedAt | — |
MeetingTranscript | id, meetingInstanceId, source, language, segments, createdAt | — |
ResponseReminder | id, agreementId, discussionId, sentAt, createdAt | — |
ScimGroupMember | groupId, employeeId | — |
SeriesInsight | id, seriesId, action, whyNow, expectedMonthlySavingsCents, riskOfChange, firstStep, reasonCode, reasonParams, confidence, abstained, model, acceptedAt, acceptedById, dismissedAt, dismissedById, dismissReason, revision, ownerId, targetDate, ownerProgress, ownerProgressAt, assignmentVersion, ownerNotifiedAt, implementedAt, implementedById, implementationNote, createdAt | — |
ChangeGuideDelivery | id, insightId, assignmentVersion, channel, status, detail, sentAt, createdAt, updatedAt | — |
OrganizerDecision | id, recommendationId, decision, decidedById, note, overrideClassification, updatedAt, createdAt | — |
Tables left out
| Table | Why it is left out |
|---|---|
AccessReviewReminder | Operational state Quorum uses to run (queues, delivery receipts, caches) — not information about the workspace. |
AnalysisSnapshot | A cache of figures Quorum computes from the exported tables. |
ChatAddress | Operational state Quorum uses to run (queues, delivery receipts, caches) — not information about the workspace. |
ConversationAuthorDigest | A keyed one-way digest held only until someone answers; never shown anywhere. |
LandingAnalyticsAccess | Quorum operator-console permissions, not workspace data. |
PrivateBusyBlock | A private meeting's time per person is shown to that person alone; the person's own export carries it. |
SelfViewPreference | My week settings are read by no administrator screen or export; the person's own export carries them. |
WorkerJob | Operational state Quorum uses to run (queues, delivery receipts, caches) — not information about the workspace. |
WorkspaceExport | The export archives themselves. |
MfaCredential | Secret material — never leaves Quorum, not even to the workspace that stored it. |
MfaRecoveryCode | Secret material — never leaves Quorum, not even to the workspace that stored it. |
PulseResponse | Pulse answers are shown only as shares across several answers, never one by one; the person's own export carries theirs. |
SlackWebhookReceipt | Operational state Quorum uses to run (queues, delivery receipts, caches) — not information about the workspace. |
WorkspaceExportChunk | The export archives themselves. |
MeetingAnalysisBatch | Per-batch model answers kept a week to finish a run; the stored recommendations are exported. |