Weekly
Email yourself a weekly Notion database backup
Each week a CSV copy of your database properties lands in your inbox.
- Runs
- Weekly
- Apps
- Notion
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every Sunday at 10pm, export all rows of my Notion Clients database to a CSV file and email it to me.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A small agency keeps its whole client roster in one Notion database: company, contact, retainer amount, renewal date, owner. Then an intern bulk-edits the Status column, a relation property gets deleted while tidying up, or a workspace admin archives the wrong page. Notion's page history helps with single pages but is awkward for recovering a hundred rows, and most teams have never exported anything.
Once a week, the database is read page by page, every property is flattened into a plain column (select names, multi-select lists, people, dates, relations), and the result is built into a CSV that lands in your inbox as an attachment. It runs on the weekly schedule, so the copy exists whether or not anyone remembered.
It suits anyone whose Notion database doubles as a system of record: CRM tables, inventories, content calendars, vendor lists.
What you get out of it
A dated copy outside Notion
If rows are overwritten or a property is wiped, the attachment from last Monday still holds the old values. You can open it in Excel or Google Sheets and copy the missing cells straight back.
Recovery from bulk edits
A mistaken bulk change to a Status or Owner column can touch hundreds of rows in seconds. A recent CSV lets you compare before and after and restore only the rows that were damaged.
Proof for audits and handovers
When a client asks what their retainer looked like in March, or a new hire needs last quarter's list, the emailed files act as a dated record that does not depend on anyone's Notion permissions.
Freedom to leave the tool
A CSV opens in almost anything, so moving the data to another database or CRM later means importing a file you already have, not scrambling to build an export under pressure.
No reliance on someone's memory
Manual exports get skipped during busy weeks. A scheduled run produces the file on the same day each week, so the gap between your data and your latest backup never grows past seven days.
How it works
What happens, step by step
Once a week, ClickRuntime reads every row in your Notion database, however many there are.
It turns each row's properties, like name, status, owner and dates, into plain spreadsheet columns.
The rows are saved as a CSV file and emailed to you, with the row count in the subject line.
Before it runs live
- Connect Notion and share the database you want it to use
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Notion steps into one automation
Under the hood
The code that runs this automation
import csv, io
from clickruntime import on_trigger, credentials, http, notify
DATABASE_ID = "your-clients-database-id"
def plain(prop):
kind = prop["type"]
value = prop.get(kind)
if kind in ("title", "rich_text"):
return "".join(t["plain_text"] for t in value)
if kind in ("select", "status"):
return (value or {}).get("name", "")
if kind == "multi_select":
return ", ".join(o["name"] for o in value)
if kind == "date":
return (value or {}).get("start", "")
return "" if isinstance(value, (dict, list)) else str(value or "")
@on_trigger
def run(event):
headers = {"Authorization": f"Bearer {credentials.connection('notion', 'work')}",
"Notion-Version": "2022-06-28"}
rows, body = [], {"page_size": 100}
while True:
page = http.post(f"https://api.notion.com/v1/databases/{DATABASE_ID}/query",
headers=headers, json=body).json()
rows += [{k: plain(v) for k, v in r["properties"].items()} for r in page["results"]]
if not page.get("has_more"):
break
body["start_cursor"] = page["next_cursor"]
out = io.StringIO()
writer = csv.DictWriter(out, fieldnames=sorted({k for r in rows for k in r}))
writer.writeheader()
writer.writerows(rows)
notify.email_me(f"Notion Clients backup: {len(rows)} rows", out.getvalue())
return {"rows": len(rows)}FAQ
Common questions
Which Notion property types end up in the CSV?
Does the backup include page content or only properties?
Will it work on a database with thousands of rows?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Archive empty and duplicate Notion pages
Your database stays clean, and you get an email listing what was archived so you can restore anything from the trash.
See how it worksGet reminders for Notion tasks due soon
Each morning you get the tasks due in the next two days, overdue ones move to today, and anything a week late is flagged as stale.
See how it worksLog daily prices and exchange rates in Notion
A new dated row with the latest prices and rates is added to your database every day.
See how it worksKeep exploring
Set up “Email yourself a weekly Notion database backup” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.