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 */15 minutes (GitHub Actions has minimum 5-min cadence, but ausdata.io's latest cache 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