What GitHub Sync Does
GitHub Sync keeps a private GitHub repository up to date with a survey's response data automatically, on a schedule, so you never have to manually re-export and re-upload a CSV into your analysis pipeline again. Connect your GitHub account once, then create a repo for any survey you want synced — a GitHub Action already built into the repo pulls fresh data on a recurring interval and commits it to data/responses.csv.
GitHub Sync requires Standard plan or above. If you don't see a GitHub Sync card in Export, upgrade your plan in Settings.
Export: GitHub Sync
Connect Your GitHub Account
Step 1: Open Workspace Settings. This is a one-time, account-level step — it authorizes the Domandata GitHub App, it does not create any repo yet.
Step 1: Open Settings
Step 2: Click Connect GitHub. You'll be redirected to GitHub to approve the installation on your account or organization, then redirected back into Domandata.
Step 3: Confirm the connection. Once connected, Workspace Settings shows the GitHub account or organization login the app is installed on. You only need to do this once, even if you plan to sync many surveys.
Create a Repo For a Survey
Once GitHub is connected, each survey you want synced gets its own repo, created from a Domandata-owned template.
Step 1: Open Export. Scroll to the GitHub Sync card at the bottom of the tab.
Step 1: Open Export
Step 2: Click Create Repo. This is disabled, and links back to Workspace Settings instead, until GitHub is connected.
Step 3: Read and confirm the consent notice. The dialog states plainly what the sync will and won't do — see the next section for the exact guarantees. You must confirm before a repo is created.
Step 4: Review the privacy choices. The dialog shows the same Privacy panel as the Export tab (see Export Research Survey Responses), starting from Reviewers or Collaborators (change where new repos start under Workspace Settings → Default Export & Display): questions asking for a name, email, or phone number, signatures, file uploads, voice recordings, and Silicon Sample prompts are dropped, panel and respondent IDs become coded IDs that stay the same across syncs and your team's other exports, browser and device details are dropped, free-text answers are kept with email/phone/SSN-shaped text redacted, and reviewer notes are masked. Pick another audience or change any column: Keep, Broaden, Redact PII, Coded ID, Mask (the column stays, every value becomes
anonymized), or Drop. Because a sync keeps adding responses, every column group is shown, including ones with no data yet. Also scan for names and places runs an extra pass over redacted answers looking for a person's name, a place, or an organization. It runs entirely on Domandata's servers (nothing is sent to a third party) and works from grammar patterns rather than a machine-learning model, so it will miss nicknames and unusual names and can flag an ordinary word — treat it as an extra pass to review, not a guarantee. The Rare Combos switch on a kept column (on for demographic columns under The Public) adds it to small-cell suppression: Domandata checks every synced response's combination of answers across the switched-on columns and blanks that combination for any respondent whose exact combination is shared by fewer than your chosen minimum. This protects against a subtler risk than a single identifying column: an unusual combination of ordinary answers (the only 62-year-old rural veterinarian in your sample) can still narrow a respondent down.Step 5: Done. The repo is created, a scoped export API key is generated automatically for it, and the first sync runs shortly after. Export then shows the repo link and a Disconnect action.
What The Consent Notice Tells You
Before the repo is created, Domandata asks you to confirm three things — worth understanding fully before you click through:
- The repo is always private. There is no public option in this flow, and this isn't researcher-configurable after creation.
- The sync uses the privacy choices you confirm. They're saved with the repo when it's created, and every sync is held to them: the sync workflow's own settings can make a file stricter but never less protected than what you agreed to. Repos created before per-column privacy existed keep their original setting, where free-text and identifying question types (text response, signature, file upload, audio interview, text chat) along with raw device/browser info, external panel respondent IDs, and Silicon Sample's exact prompt text are left out unless they were opted in — see the next section for the default that applies when a redaction setting is left unset on an existing repo.
- Deleting a response in Domandata does not remove it from prior synced commits. Once data has synced into a commit in the repo's history, deleting that response afterward in Domandata only stops it from appearing in future syncs — it does not rewrite or purge the repo's git history. If a response needs to be fully removed from the synced repo, that has to be done in GitHub directly (for example, rewriting history or deleting the repo).
Advanced: Default Export Options and Starter Files
Workspace Settings → GitHub Sync has an Advanced section, collapsed by default, holding two account-wide defaults applied to every repo created after you set them — existing repos keep whatever they were created with:
- Data file format. Choose CSV or JSON for the synced
data/file, whether values come back as display labels or codebook recode values, and — for JSON — whether rows are flattened to one object per response. These mirror the same options available directly on/api/v1/export. - Starter files. Any number of extra files — scripts, documentation, anything — added to every new repo alongside the base template. Content can include
{{Creation Date}},{{Survey Name}}, and{{Repo Name}}tokens, filled in automatically when the repo is created — useful for something like an R script that always starts with a standard cleaning-script header.
Settings: GitHub Sync Advanced
Disconnecting a Repo
The Disconnect action on a synced survey's card stops that repo's sync for real: it disables the repo's GitHub Action and revokes the API key it was using, so no further response data can reach it. It does not delete the repo or the data already committed to its history — if you want that gone too, delete the repo directly in GitHub.
Disconnecting GitHub entirely from Workspace Settings does the same thing for every repo tied to that connection at once.
Limits
The sync pulls from the same /api/v1/export endpoint available to every API key, which caps at a fixed number of responses per call (currently 20,000). For most studies this is far more than enough, but on a very large survey the synced data/responses.csv can stall at that row count rather than reflecting every response. If you're running a very large survey and see the sync stop growing, that cap is why — use paginated export instead for the full dataset.
Sync runs on a schedule (every 15 minutes) plus on demand from GitHub's Actions tab — it is not instant or webhook-triggered. Expect a short delay between a new response arriving and it showing up in the repo.
Bringing Your GitHub Pipeline Into a Replication Package
If you draft your analysis pipeline as starter files in a synced repo (a cleaning script, an R or Python project, documentation), you don't have to separately attach it when you deposit to Harvard Dataverse or Zenodo, or download a package for another repository. Each replication-package dialog has an Advanced section with an Include GitHub Sync repo snapshot toggle (on by default when a repo is connected) that bundles a .tar.gz of the repo's current contents into the package as an extra file — the working tree at the default branch's tip, not the full git history. See Preregister and Archive a Domandata Study.