Skip to main content
bthebigclass
All help topics

For admins

Export your workspace — CSV, JSON, or the lot

Two ways out. Full workspace as a single JSON envelope (lossless, every byte). Or per-entity sheets — students, courses, orders — as CSV or JSON, ready to open in Excel or pipe into another tool. Re-upload any of them and you're back where you were.

Last updated May 19, 2026

Three flavours of export

  • Full workspace JSON — every byte, one file, lossless. Use for backup + cross-workspace migration.
  • Per-entity CSV — students, courses, or orders as a flat spreadsheet. Use for Mailchimp / Excel / Google Sheets.
  • Per-entity JSON — same row data as the CSV, but as a structured array with format/version metadata. Use for scripting + tool integrations.

Export everything (full workspace)

Open /dashboard/settings → Workspace data → Export workspace. We scan every tenant-scoped slice in your workspace, package it into a single versioned JSON envelope, and trigger a browser download. Nothing leaves your machine — the file is generated client-side.

What's in the file

  • Courses, modules, lessons (including quiz definitions + drip schedules)
  • Students, faculty, enrolments, completion + attendance history
  • Quiz attempts + assignment submissions + grades
  • Live sessions + past-class recordings + attendance
  • Orders, entitlements, subscriptions, products, coupons
  • Certificates + certificate batches + verification records
  • Portal config, pages, blog posts, faculty showcase, testimonials
  • Reviews, doubts (incl. guest enquiries), announcements, discussions
  • Org settings (notification prefs, currency, brand attribution)
  • Wall of Love entries, referral codes + conversions

File format

{
  "format": "thebigclass.workspace-export",
  "version": 1,
  "exportedAt": "2026-05-19T08:42:13.521Z",
  "sourceTenant": "snapied",
  "sourceTenantName": "Snapied",
  "counts": { "courses": 47, "students": 1243, "orders": 89, "posts": 12 },
  "slices": {
    "lms.courses.v1": [ /* … */ ],
    "lms.users.v1": [ /* … */ ],
    "store.orders.v1": [ /* … */ ],
    "portal.config.v1": { /* … */ },
    "portal.pages.v1": [ /* … */ ]
  }
}
Plain JSON, no proprietary container. Open it in any text editor, diff it, audit it — same shape going out as coming in.

Export by entity (CSV or JSON)

Same panel, the "Export by entity" row. Three entities, two formats each: Students, Courses, Orders × CSV or JSON. CSV is the universal spreadsheet format — Excel, Numbers, Google Sheets, Mailchimp, every CRM. JSON keeps the same shape but as a structured array with format + version metadata so a script can consume it.

  • Students CSV columns — id, name, email, phone, enrolledCourses (pipe-separated), joinedAt.
  • Courses CSV columns — id, slug, title, description, priceInr, status, facultyId, modulesCount, lessonsCount, createdAt. Curriculum trees don't fit a flat CSV — use the workspace JSON for those.
  • Orders CSV columns — id, studentEmail, itemTitle, amountInr, status, createdAt.
Filenames look like snapied.students.2026-05-19.csv — tenant slug, entity, date, format. Drop them straight into a backup folder and the chronology is obvious.

Import a CSV (students or courses)

Same panel: "Import CSV →" → Students CSV / Courses CSV. The picker accepts any RFC 4180 CSV — same shape Excel and Google Sheets export by default. We parse client-side, show you the detected columns + first-row preview in a dialog, you confirm. Existing rows get updated, new rows get added. Unlike the full workspace import, CSV import is non-destructive.

  • Students match on the email column (case-insensitive). Rows without an email are skipped + counted.
  • Courses match on id first, then slug. Module + lesson trees from the existing course record are preserved — CSV import only touches flat metadata.
  • Non-student users (admins, faculty) in your workspace are untouched by a student CSV import.

Reimport (full workspace JSON)

Same panel: "Import from a full workspace export" → Choose export file. We parse the file, validate the envelope, and surface a preview with row counts ("47 courses, 1,243 students, 89 orders, …") before anything writes. You confirm; we overwrite the target workspace and hard-reload so every store re-hydrates against the fresh state.

Full-workspace replace is destructive. CSV import is not. If you want a safety net before a full restore, export the target workspace first — that gives you a rollback point.

Cross-workspace import

The same file works in a different workspace — perfect for "I'm starting fresh, bring everything from the old account". Sign into the new workspace, open settings, pick the export file you downloaded earlier, confirm. Everything lands in the new workspace's storage.

Async + safe on big workspaces

Both export and import yield to the browser between every slice (setTimeout 0) so the dashboard never freezes — even on workspaces with tens of thousands of records. A live progress bar shows "reading lms.courses.v1 (47/89)" as it works. If browser localStorage quota is exceeded mid-import, we stop and tell you exactly where; partial writes leave the workspace in a consistent state because each slice is one atomic localStorage.setItem.

When to use this

  • Switching to a new workspace (paid plan upgrade, multi-tenant setup, fresh account).
  • Backing up before a major migration or template apply.
  • GDPR / data-portability requests from your audit team.
  • Moving everything off the platform — yes, including off our platform. Keep the file.
Once we move off browser-local storage and onto a real backend, this same tool will hit a server endpoint that streams the export back. The file format stays identical so any exports you take now stay valid forever.

Related