Open-source, self-hosted client reporting for marketing agencies.
One config file → a branded, print-ready report pulling from the tools you already use: Google Analytics 4 · Google Ads · Meta Ads · HubSpot · CallRail · any CSV.
A free, own-your-data alternative to AgencyAnalytics, DashThis and Whatagraph.
Automated marketing reports · SEO & PPC client reporting · GA4 report generator · white-label agency dashboards — self-hosted, in Python.
Agencies burn hours every month copy-pasting numbers from six dashboards into a
slide deck, or pay $200–$600/month for a SaaS reporting tool that holds your
clients' data hostage. clientreport does the boring part for you and keeps
everything on your own machine:
- 📊 One command, one file. Define a client in a tiny TOML file, get a polished HTML report you can email or print to PDF.
- 🔌 The connectors agencies actually use. GA4, Google Ads, Meta Ads, HubSpot, CallRail, and a universal CSV escape hatch.
- 🎨 White-label by default. Your brand colour, your logo, your footer. No "Powered by" you have to pay to remove.
- 🔒 Self-hosted. Zero data leaves your box. No account, no vendor, no per-client pricing.
- 🪶 Zero runtime dependencies. Pure standard library. Charts are hand-rolled inline SVG, so a report is a single portable HTML file.
pip install clientreport
clientreport demoThat builds a complete four-section sample report (GA4 + Google Ads + HubSpot + CallRail) and opens it in your browser — no API keys, no config.
# 1. Scaffold a client config
clientreport init acme
# 2. Add your credentials to the environment (never in the file)
export GA4_ACCESS_TOKEN=ya29....
export HUBSPOT_TOKEN=pat-na1-....
# 3. Build it
clientreport run acme.toml --openA config is small enough for an account manager to edit:
[client]
name = "Acme Home Services"
period = "last_30_days" # or explicit start/end dates
logo = "https://acme.com/logo.png"
[agency]
name = "Bright Digital"
brand_color = "#4f46e5"
footer = "Confidential — prepared for Acme Home Services"
[[source]]
type = "ga4"
property_id = "123456789"
access_token = "env:GA4_ACCESS_TOKEN" # resolved from the environment
[[source]]
type = "hubspot"
token = "env:HUBSPOT_TOKEN"
[[source]]
type = "callrail"
account_id = "ACCxxxxxxxx"
api_key = "env:CALLRAIL_KEY"Secrets are written as env:NAME references, so configs are safe to commit.
type |
Source | Required config |
|---|---|---|
ga4 |
Google Analytics 4 | property_id, access_token |
gsc |
Google Search Console | site_url, access_token |
google_ads |
Google Ads | customer_id, developer_token, access_token |
meta_ads |
Meta (FB/IG) Ads | account_id, access_token |
hubspot |
HubSpot CRM | token |
callrail |
CallRail | account_id, api_key |
csv |
Any CSV file | path |
demo |
Sample data | — |
Run clientreport connectors to see this list any time. Full auth walkthroughs
are in docs/connectors.md.
| clientreport | AgencyAnalytics / DashThis / Whatagraph | |
|---|---|---|
| Price | Free (MIT) | ~$200–$600+/month |
| Self-hosted / own data | ✅ | ❌ (their cloud) |
| White-label, no fee | ✅ | Paid add-on |
| Open source | ✅ | ❌ |
| Runs in CI / scriptable | ✅ | Limited |
| GA4 / Google Ads / Meta / HubSpot / CallRail | ✅ | ✅ |
If you've searched for a free open-source alternative to AgencyAnalytics, a self-hosted DashThis alternative, or an automated client reporting tool for your agency — that's exactly what this is.
from clientreport import build_report, render_html
report = build_report("clients/acme.toml")
html = render_html(report)
open("acme.html", "w").write(html)HTML prints beautifully as-is (Cmd/Ctrl-P → Save as PDF). For automated PDFs:
pip install "clientreport[pdf]" && playwright install chromium
clientreport run acme.toml --pdf- Scheduled runs + email delivery (
clientreport schedule) - More connectors: LinkedIn Ads, Mailchimp, Shopify
- Multi-client batch mode (
clientreport run clients/*.toml) - Custom section ordering and commentary blocks
- Themeable report templates
Connector contributions are very welcome — see docs/connectors.md. Adding a source is one small class.
Is there a free, open-source alternative to AgencyAnalytics or DashThis? Yes — that's what clientreport is. It generates the same kind of branded client report from GA4, Google Ads, Meta Ads, HubSpot and CallRail, but it's MIT licensed, self-hosted, and free.
How do I automate client reports for a marketing agency?
Define each client in a small TOML file and run clientreport run client.toml.
Schedule it with cron or GitHub Actions to send reports every month
automatically.
Can I generate a GA4 report automatically in Python?
Yes. The ga4 connector pulls users, sessions, engagement and conversions from
the Google Analytics 4 Data API and renders them into a report — no manual
exporting.
Is my client data private? Completely. clientreport runs on your own machine and talks directly to each platform's API. No data is sent to any third-party service.
Do I need to know how to code? To build a report, no — you edit a small config file and run one command. To add a brand-new data source, a little Python helps (see the connector guide).
What does it cost? Nothing. MIT licensed, including commercial agency use.
Marketing agency reporting tool · automated client reports · white-label SEO report generator · PPC reporting · GA4 reporting Python · HubSpot report automation · CallRail reporting · self-hosted analytics dashboard · open-source AgencyAnalytics / DashThis / Whatagraph alternative · marketing report generator.
New connectors are the most valuable contribution — see CONTRIBUTING.md and docs/connectors.md.
git clone https://github.com/nawazxz/clientreport
cd clientreport
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytestMIT — do whatever you want, including commercial agency use.
