DoneOnce › Help › How to leave DoneOnce, and take everything with you
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: 4500is $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.testevent 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
2xxanswer 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 Goneis 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-idheader. - Requests follow Standard Webhooks:
webhook-id,webhook-timestampandwebhook-signature(v1,plus a base64 HMAC-SHA256 ofid.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.
Two months free, no card. Setup is done with you, in English or Spanish.
Start free