---
title: Leaving DoneOnce — take everything with you
updated: 2026-10-26
snippet: Export your whole book as one ZIP from Settings → Data, and send every change to your own tools with signed webhooks. No fee to leave.
keywords: export, leave, cancel, switch, backup, data, download, zip, csv, json, webhook, webhooks, zapier, make, api, lock-in, take my data
---

# How to leave DoneOnce, and take everything with you

Your clients, addresses, visits and payments are yours. You can download all of it whenever you
like, and you can have every change sent to your own tools as it happens. Leaving costs nothing and
needs no one's permission but your own.

Both live in **Settings → Data**, and both belong to the business owner: managers and crew do not see
them.

## Export everything

**Settings → Data → Export → Export everything** downloads one ZIP, named
`doneonce-export-<date>.zip`:

- `csv/` — one spreadsheet per table, ready for Excel or Google Sheets (UTF-8, with a BOM so accents
  survive).
- `jsonl/` — the same rows as JSON Lines, one record per line, for programs. This is the canonical
  copy: ids and timestamps exactly as stored.
- `manifest.json` — what is in the archive and how many rows each file holds.
- `README.txt` — every file and column explained, in English and Spanish.

The tables are your business profile, team, zones, clients, properties (with access notes), standing
services, seasonal pauses, one-off jobs, visit history, estimates with their lines, and payments.

- **Money is in integer cents** (`price_cents: 4500` is $45.00); the CSV adds a dollars column beside
  each one. A service's price is the price of one period, never a lifetime total.
- **Spreadsheet-safe.** A cell that would run as a formula in Excel (starting with `=`, `+`, `-`
  or `@`) is written as plain text.
- **Not included, by design:** pay and compensation, passwords, access tokens, card data, recordings
  and message bodies.
- One export every 5 minutes per business. The card shows when you last exported and how many rows.

## Webhooks

**Settings → Data → Webhooks → Add endpoint.** Each time something changes, DoneOnce sends a signed
JSON request to an address you choose — Zapier, Make, a spreadsheet script, your developer.

- **HTTPS only.** Addresses on private or local networks are refused. Up to 20 endpoints.
- **Pick the events**, by family or all of them, and whether to include contact details (names,
  emails, phones and street addresses). With contact details off you still get ids, ZIP codes and
  the rest.
- **The signing secret is shown once**, when you add the endpoint. Copy it then. You can rotate it
  at any time: the old secret keeps signing for 24 hours alongside the new one, so you can switch
  without a gap.
- **Test event** — sends a `webhook.test` event and tells you what your receiver answered.
- **Delivery log** — every send with its status, the code your receiver returned and the number of
  tries. **Replay** sends a finished delivery again.

### How deliveries behave

- A `2xx` answer means delivered. Anything else is retried after 1 minute, 5 minutes, 30 minutes,
  2 hours, 6 hours, 12 hours and then daily, up to eight retries over about three days; after that
  the delivery is marked as given up.
- An endpoint that keeps failing for 5 days is switched off, and one that answers `410 Gone` is
  switched off at once. Turn it back on from the same menu; changes made while it was off are not
  backfilled automatically.
- **At least once.** A retry or a replay can deliver the same event twice, so deduplicate on the
  `webhook-id` header.
- Requests follow [Standard Webhooks](https://www.standardwebhooks.com/): `webhook-id`,
  `webhook-timestamp` and `webhook-signature` (`v1,` plus a base64 HMAC-SHA256 of
  `id.timestamp.body`). Verify with any of that project's libraries. During a rotation the header
  carries both signatures. Payloads never include pay, tokens, notes or message bodies.

### Events

Every event is a JSON object with its `type` and a `data` object; amounts are integer cents.

| Event | When |
|---|---|
| `client.created`, `client.updated` | A client is added or changed (`changed` lists which fields moved) |
| `client.deactivated`, `client.reactivated` | A client is archived or brought back |
| `property.created`, `property.updated` | An address is added or changed |
| `visit.completed`, `visit.partially_completed`, `visit.skipped`, `visit.cancelled` | A visit is closed out, with its status and skip reason |
| `estimate.accepted` | A customer accepts an estimate (total and deposit in cents) |
| `payment.succeeded`, `payment.failed` | A payment lands or fails (amount, surcharge, method, status) |
| `webhook.test` | You pressed Send a test event |

## What stays true

- **No lock-in and no fee to leave.** The export is the whole book, in open formats, any time.
- Webhooks are one-way: DoneOnce tells your tools what happened. Changes made in another tool do not
  flow back.
- Questions, or a bigger book than the export handles comfortably? hello@doneonce.app.
