Tools
Services
WorkKompendioAbout
ende
Octinex Summa

Summa turns Search Console and Google Analytics into a marketing report with a fixed design. The numbers come from the data, Claude drafts the words around them, and a person approves each page.

  • In a pilot at a large MVZ in Berlin
  • Reports in German or English
  • Runs locally on a Mac
  • numbers: from the data
  • words: drafted by Claude
  • approved: by a person

A personal project, built in my own time.

The report nobody can check

A slide can show the numbers. It can’t say where they came from.

  1. Thu 21:10

    The report is due tomorrow. Two Google tabs, one slide, every number copied by hand.

  2. 21:40

    Visits are up 38 %. One Tuesday brought eight times the usual traffic. It was a bot.

  3. 22:15

    The slide says 3,912 users. The client’s own screen says 4,105. Both are called “users”.

  4. Fri 09:05

    “Our best month yet!” goes out. By ten, the client asks where the numbers come from.

Summa splits the work: code owns the numbers, Claude writes the words, a person signs.

The numbers from Search Console and Analytics are fetched, not typed. A day like that Tuesday is flagged before anyone praises it, and every report ends with its sources and a definition of every number.

How it works

  1. 01 · A brand is set up

    Set up once, read-only.

    Summa reads Search Console and Google Analytics through its own account, with read-only access. Each brand gets a goal, a report language, a colour and a logo; enquiry events are optional.

    Gone logging in to two dashboards every month

  2. 02 · Only finished periods

    Only once the numbers have settled.

    Google keeps correcting the last few days, so a period can be reported from the third day after it ends. Summa also freezes its own copy of Search Console, month by month, past the 16 months Google keeps.

    Gone numbers that change after the report went out

  3. 03 · Fetched and checked

    Fetched for the exact period, then checked.

    Summa asks Google for the period’s own totals and checks them: missing days, days that don’t add up to the month, a sudden drop to zero. A source that fails shows no numbers at all, never older ones.

    Gone copying numbers from tabs

  4. 04 · Fixed rules judge

    The status comes from a rule, not a mood.

    Each question on page 1 gets its status from thresholds written in the code: Good from +5 %, Needs attention below −15 %. A day above 2.5 times the typical one is flagged. More visits only count as Good if more of them stayed.

    Gone praising a bot

  5. 05 · Claude drafts

    Claude writes the words, never the numbers.

    Claude drafts the headline, one sentence, the next steps and a short note per page, with a named placeholder for every figure. Summa refuses any digit outside one, asks once more, and leaves a box empty rather than use a text that breaks the rule.

    Gone commentary from a blank page

  6. 06 · A person approves

    Nothing is final until someone signs.

    Every page’s text is read, edited if needed and approved on its own. Only then can the report be approved. From that moment it is locked, with the settings and the logo it was made with.

    Gone “which version did we send?”

  7. 07 · The PDF

    A PDF that says where it’s from.

    Printed in A4 landscape, in German or English, ending with Sources and Definitions. A page that overflows its frame refuses to print, and a draft prints marked DRAFT.

    Gone fixing the layout by hand

Rules judge. Claude suggests. A person signs.

Every threshold is written down in the code. Claude never picks a status or a number, and nothing is final until someone has read it and approved it.

Try it

Write page 1 the way Claude has to.

Figures go in only as placeholders. Type a digit and Summa’s own rule refuses it; the page beside it fills in the values.

  • Passes Summa’s check.

Try typing visits rose 40 %, or {overview.revenue}, or a year like 2026.

Page 1, with the values filled in

Example Joinery · Marketing reportSeptember 2026

Good monthMore enquiries, and more people finding the site

In September 2026, 31 enquiries came through the website, +29.2 % on September 2025.

  • Enquiries?

    Good

    31 enquiries

    7 more than Sept 2025 (24)

  • How many visits?

    Good

    2,480 visits

    350 more than Sept 2025 (2,130)

  • Found on Google?

    Good

    1,120 clicks

    60 more than Sept 2025 (1,060)

  • Do visitors stay?

    Watch

    6 in 10 stayed

    2 points more than Sept 2025 (60 %)

Runs in your browser with Summa’s own check for page 1, on a made-up business. The verdict and the four statuses come from fixed rules, so nothing typed here changes them. The draft was written in advance; this page never calls Claude.

The report, page by page

Page 1 answers four questions. The rest shows why.

Cover, Page 1, Trend, What changed, Leads, Website, Google Search. optional pages: Articles, PageSpeed, Social media. always last: Sources, Definitions. the goal sets this order: Leads, Website traffic or Search visibility.

  • If you make reports

    Set it up once.

    Pick a goal and a role for each brand. Summa sets the page order and page 1’s blocks, so every month looks the same.

  • If you read them

    Four questions first.

    Page 1 asks how many visits came, whether Google found the site, whether visitors stayed and how many enquiries arrived, each with its status.

  • If you check them

    The last two pages.

    Sources names the accounts, periods and limits behind every number. Definitions lists each metric under Google’s own name, with the report’s name beside it.

The role decides page 1’s last row. For findings only, it shows where visits came from and whether they stayed, and recommends next steps. When the work is done for the client, it lists what was done and marks each of next month’s steps with who takes it.

Numbers you can trace

Follow a number back to Google.

  • Checked against Google’s own screens.

    Once per brand, a month’s numbers are typed in from Google’s own screens, and Summa puts ✓ or ✗ beside its own, rounded the way the screen rounds. For a ✗, Summa says to find the cause and never to change a number to make it match.

  • A broken day is left out, and the report says so.

    A bot spike or a tracking glitch can be left out of one source for every report. Google Analytics recounts without it, and the Sources page lists the date and the reason.

  • History past Google’s 16 months.

    Google deletes old Search Console data day by day. Summa freezes each finished month once and keeps it for as long as you choose, forever by default, so a year-on-year chart still has last year in it.

One number can be an estimate, and says so. For months with a cookie banner, Google Analytics counts can be scaled up by a factor I set, for visitors who declined cookies. Every page that uses it is marked “GA4 estimated”, and the Sources page explains it.

How it’s built

For the people who’ll ask how.

  • 214commits since September 2026
  • 714tests, all passing
  • 23report pages checked against approved pictures
  • 8outside packages in its dependencies

Figures as of 13 October 2026.

Why placeholders? A language model is good with words and unreliable with figures. So Claude gets every figure as a named placeholder, answers in a fixed JSON shape, and any digit it writes outside a placeholder is refused. Summa fills in the values from the report’s own data, and a person approves the result. Claude sees the figures it may use and the names around them: channels, search terms, pages, articles and who wrote them, and the notes typed in for the report. It never sees the database or Google’s day-by-day data.

  • TypeScript
  • React
  • Vite
  • Node.js
  • Express
  • SQLite
  • Playwright
  • Claude API
  • Search Console API
  • Google Analytics Data API
  1. Claudegets the figures as placeholders · answers in a fixed JSON shape
  2. The checkno stray digits · no unknown placeholders · one more try, then the box stays empty
  3. A personreads each page with the numbers filled in · approves it, or rewrites it
  • Charts are drawn by hand in SVG, and Google is called with plain, read-only requests: no chart library and no Google SDK.
  • A visual test prints all 23 pages of the sample report and fails on any difference from the pictures that were signed off.
Where it stands

From first commit to a pilot.

  1. 25 Sept 2026First commit
  2. 27 SeptThe first report, from Google to PDF
  3. 2–10 OctAny period and goal; PageSpeed, social media and articles
  4. 11–12 OctIts own archive, removed days and the new page 1
  5. NowIn a pilot at a large MVZ in Berlin
Write to me

Want to talk about Summa?

Whether you’re hiring, write reports that could use it, or want to back it: one message reaches me.

I use what you send here only to answer you. Privacy policy

The other tools