Home / Blog / Embedding live AU economic data in a Notion page
2026-05-20 ยท Harry Vass
Embedding live AU economic data in a Notion page
A working recipe for keeping a Notion page synced with live AU cash rate, CPI, real wages, and cost-of-living numbers, no manual refresh, no copy-paste from rba.gov.au.
Notion is where a lot of household budgets, financial-advisor client dashboards, and personal-finance blogs actually live. It's not a database, not a CMS, not a spreadsheet, but somehow it ends up running all three.
What it isn't natively is a place where live external numbers refresh themselves. The RBA cash rate doesn't update inside your Notion page when the board hikes. Your CPI callout still says "3.4%" from when you last edited it in February. You know it's stale; you just don't fix it because the round-trip through rba.gov.au is annoying.
Here's a 20-minute setup that fixes it permanently.
<!-- IMG: notion-economic-dashboard-screenshot.png -->
What you'll build
A Notion database with one row per economic indicator. Each row's value field updates every 15 minutes via a GitHub Actions cron. Your dashboard page renders the database as a clean callout grid:
๐ฆ Cash rate 4.35% (last updated 09:14 AEST)
๐ CPI annual 2.8% (last updated 09:14 AEST)
๐ท Unemployment 4.1% (last updated 09:14 AEST)
๐ฐ Real wages YoY +0.4% (last updated 09:14 AEST)
โก NSW1 power 24h avg $84/MWh (last updated 09:14 AEST)
Every number is sourced from ABS, RBA, AEMO, or WGEA, with CC-BY attribution. No copy-paste. No manual refresh.
Step 1, create the Notion database (5 min)
In Notion: New page โ Database (full page). Name it AU Economic Indicators. Schema:
| Property | Type |
|---|---|
| Name | Title |
| Value | Number |
| Unit | Select (%, $/MWh, index, AUD m) |
| Period | Text |
| Source | URL |
| Updated at | Date |
Add the rows (Name only, leave other fields empty, the script populates them):
- Cash rate
- CPI annual
- Unemployment
- Real wages YoY
- NSW1 power 24h avg
Open one row, copy its block_id from the URL (notion.so/<workspace>/<page-id>?v=..., you want the page-id portion). Repeat for all 5. You'll paste these into the sync script.
Step 2, get the Notion API token (3 min)
Go to notion.so/my-integrations โ New integration โ Internal integration โ give it update content capability. Copy the secret.
Then, on your AU Economic Indicators database page: top-right "..." menu โ Add connections โ pick your new integration. (This step is the one people miss. The integration token alone gives you nothing; you have to share the page with it.)
Step 3, the sync script (10 min)
import os, requests
from notion_client import Client
notion = Client(auth=os.environ["NOTION_TOKEN"])
api_key = os.environ["AUSDATA_API_KEY"]
BASE = "https://api.ausdata.io"
def fetch(path):
r = requests.get(f"{BASE}{path}",
headers={"X-API-Key": api_key}, timeout=30)
r.raise_for_status()
return r.json()
# Single dashboard call returns everything we need
d = fetch("/v1/economic-dashboard")["data"]
real = fetch("/v1/real-rate-regime")["data"]
nsw = fetch("/v1/data/aemo/trading_price")["data"]
rows = {
"ROW_ID_CASH_RATE": {
"value": d["cash_rate_pct"],
"unit": "%",
"period": d["cash_rate_period"],
"source": "https://www.rba.gov.au/statistics/cash-rate/",
},
"ROW_ID_CPI": {
"value": d["cpi_annual_pct"],
"unit": "%",
"period": d["cpi_period"],
"source": "https://www.abs.gov.au/statistics/economy/price-indexes-and-inflation/consumer-price-index-australia",
},
"ROW_ID_UNEMP": {
"value": d["unemployment_rate_pct"],
"unit": "%",
"period": d["unemployment_period"],
"source": "https://www.abs.gov.au/statistics/labour/employment-and-unemployment/labour-force-australia",
},
"ROW_ID_REAL_WAGES": {
"value": d["real_wages_yoy_pct"],
"unit": "%",
"period": d["real_wages_period"],
"source": "https://ausdata.io/signals/real-wages",
},
"ROW_ID_NSW1": {
"value": nsw["nsw1_24h_avg_aud_mwh"],
"unit": "$/MWh",
"period": nsw["window_end"],
"source": "https://aemo.com.au/energy-systems/electricity/national-electricity-market-nem/data-nem/aggregated-data",
},
}
for row_id, fields in rows.items():
notion.pages.update(
page_id=row_id,
properties={
"Value": {"number": fields["value"]},
"Unit": {"select": {"name": fields["unit"]}},
"Period": {"rich_text": [{"text": {"content": fields["period"]}}]},
"Source": {"url": fields["source"]},
"Updated at": {"date": {"start": d["retrieved_at"]}},
},
)
print("Notion dashboard updated.")
Replace ROW_ID_* with the actual page IDs you copied from each Notion row.
Step 4, schedule it (2 min)
GitHub Actions free tier handles this without a server. .github/workflows/notion-sync.yml:
name: Notion AU economic sync
on:
schedule: [{cron: '*/15 * * * *'}]
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: pip install requests notion-client
- run: python notion_sync.py
env:
AUSDATA_API_KEY: ${{ secrets.AUSDATA_API_KEY }}
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
That's every 15 minutes, ~2,880 runs/month. Each run makes 3 ausdata.io calls = ~8,640/month, fits Analyst tier ($29/mo) with room to spare. On the free tier (500 calls/month) drop the cron to hourly: '0 * * * *'.
Step 5, embed the database on your dashboard page (1 min)
On your main Notion page: /linked-database โ pick AU Economic Indicators โ switch view to Gallery. Card front: Name + Value + Unit. Card back: Period + Source + Updated at.
It now renders as a clean grid of cards, each card showing one indicator. The cards auto-refresh whenever the cron job runs.
What this isn't
This recipe isn't:
- A way to display arbitrary time-series in Notion. Notion doesn't render charts; you'd need a third-party embed (e.g. an Observable notebook) for that.
- Live in the sub-second sense. The shortest reasonable cron is
*/15minutes (GitHub Actions has minimum 5-min cadence, but ausdata.io'slatestcache TTL is 15min, so finer polling wastes quota). - Suitable for financial-advice publication without disclaimer. The numbers are accurate macro indicators; they are not personalised financial advice. If you're a licensed adviser embedding this in a client-facing Notion page, attach the standard "general information only" disclaimer.
- Useful for sub-state geographies. The ABS publishes labour force by state quarterly, but not weekly by SA4. The dashboard shows national figures.
A note on Notion's API limits
Notion's API allows ~3 requests/second per integration. 5 row updates every 15 minutes is nowhere near that. If you scale to 30+ rows, batch the updates: collect all property changes for a row and send one update per row, not one per property.
Pricing
- Free: 500 calls/month, works with hourly cron, 5 indicators.
- Analyst: $29/mo, 10k calls, works with 15-min cron, 5-10 indicators.
- Pro: $99/mo, 100k calls, works with 5-min cron and ~50 indicators, plus webhooks if you want push instead of poll.
Free key at ausdata.io.
Sources
All posts ยท Get a free key ยท Docs