Use case
Google SheetsPostgreSQLStripeAGNT

Recurring reports, assembled and written for you

Give an agent the job of assembling your weekly numbers — it pulls from the tools you already use, drafts the report, and delivers it with a receipt showing exactly where every figure came from.

What this actually involves

The jobGive an agent the job of assembling your weekly numbers — it pulls from the tools you already use, drafts the report, and delivers it with a receipt showing exactly where every figure came from.
Tools it needsGoogle Sheets, PostgreSQL, Stripe, Slack, Google Slides
Setup4 steps, about ten minutes
Runs whenSomething happens in Google Sheets
ApprovalYours, per category — nothing is sent on your behalf unless you say so
Where it runsYour own machine. Credentials stay in a local vault.

What the agent actually does

The report is waiting when you wake up

The agent queries the systems the numbers actually live in — your database, Stripe, the CRM, the analytics sheet — rather than a stale export somebody pasted last month. Each figure is fetched at run time, so the report cannot quietly describe a world that no longer exists.

Draft on schedule

A timer fires, the data is collected, and the narrative is written to your template: what moved, by how much, and what the agent believes explains it. You receive a draft with the analysis already attempted rather than a blank document and a folder of CSVs.

Receipts on every number

Every figure carries its provenance — which query, which system, at what time. When somebody asks where a number came from, the answer takes seconds and does not depend on anyone remembering.

The tools this job needs

Google Sheets

Where the work arrives. The database every team already has open. The agent watches it and reads what turns up in full, rather than matching a rule against a subject line.

PostgreSQL

Context the agent pulls in before deciding. The production database your reports should come from. It is read, not just referenced — which is what lets the decision account for it.

Stripe

Context the agent pulls in before deciding. Payments, subscriptions and the events behind revenue. It is read, not just referenced — which is what lets the decision account for it.

Slack

Where the result lands. Team chat where operations actually surface. Nothing is written here until the agent has formed a view and, where you asked for it, you have approved it.

Get this agent

Report Assembler

Give an agent the job of assembling your weekly numbers — it pulls from the tools you already use, drafts the report, and delivers it with a receipt showing exactly where every figure came from.

Runs on your own machine. Asks for Google Sheets, Stripe, Slack and nothing else — you approve the connection, and the agent inherits whichever AI model you already use.

You can see exactly what it did

Nothing happens behind your back.

Every run leaves a receipt: what the agent read, which tools it called, what it decided and why, and precisely what it changed. Anything irreversible — sending, paying, publishing, deleting — waits for you to approve it. It runs on your own machine, with your own credentials, and the whole trail is yours to read afterwards. The point is not that you trust it. The point is that you never have to.

The real cost of the weekly report

The visible cost is the two hours somebody spends assembling it. The hidden cost is larger: reports get skipped when the person is busy, numbers get copied wrong under time pressure, and definitions drift so that this quarter’s figure is not quite comparable with last quarter’s. Automation fixes the drift as much as the hours, because the query is written once and then re-run identically forever.

Narrative is the part worth automating

Pulling numbers into a table is the easy half and plenty of tools do it. What makes a report useful is the sentence explaining why a figure moved, and that requires reading across sources — noticing that churn rose in the same week a deploy went out, or that a spike traces to one enterprise account. An agent can hold all of the sources at once and attempt that connection, which a dashboard cannot.

Keeping a human in the last mile

The agent should draft, not publish. A report that goes to a board or a client wants a person to read it first, adjust emphasis and remove the paragraph that is technically true but unhelpful. Sitting an approval gate between draft and delivery costs a few minutes a week and removes the entire category of risk where an unattended system says something embarrassing with authority.

Build it in AGNT

  1. Connect the systems the numbers live in — PostgreSQL, Stripe, HubSpot, Google Sheets, whichever apply.
  2. Give the agent your existing report as a template so the output matches what people already read.
  3. Set the schedule and the delivery channel: email, Slack, a Google Doc, or all three.
  4. Review the first few drafts against the receipts, then let the cadence run.

Copy this workflow

Here is the shape in full rather than in prose: a trigger, a decision, an action. Paste the definition below into a new workflow and it loads exactly as drawn.

Recurring reports, assembled and written for you: watch google sheets → read it and decide → act in stripe TRIGGER google-sheets-new-row Watch Google Sheets Fires the moment it happens. ACTION agnt-agent Read it and decide Judged against your own rules. ACTION stripe-invoice Act in Stripe Writes the result back.
Nothing leaves your machine: AGNT talks to Google Sheets and PostgreSQL directly, and each run leaves a receipt.
Recurring reports, assembled and written for youpaste into a new workflow
{
  "id": "fd4f8227-9367-4b0b-aa96-b1520832d2be",
  "name": "Recurring reports, assembled and written for you",
  "nodes": [
    {
      "id": "c06a66ac-59ea-45d2-a870-523c059eb940",
      "text": "Watch Google Sheets",
      "x": 512,
      "y": 144,
      "isEditing": false,
      "type": "google-sheets-new-row",
      "icon": "connect",
      "category": "trigger",
      "isSelected": false,
      "parameters": {},
      "description": "Listen for new rows added to a specified Google Sheet and trigger the workflow when a new row is detected.",
      "error": null,
      "isActive": false,
      "output": null,
      "outputs": {}
    },
    {
      "id": "33070a77-ba96-4b5c-a19d-1267884c5f6c",
      "text": "Read it and decide",
      "x": 512,
      "y": 336,
      "isEditing": false,
      "type": "agnt-agent",
      "icon": "connect",
      "category": "action",
      "isSelected": false,
      "parameters": {
        "instructions": "The agent queries the systems the numbers actually live in — your database, Stripe, the CRM, the analytics sheet — rather than a stale export somebody pasted last month. Each figure is fetched at run time, so the report cannot quietly describe a world that no longer exists."
      },
      "description": "Give an agent the job of assembling your weekly numbers — it pulls from the tools you already use, drafts the report, and delivers it with a receipt showing exactly where every figure came from.",
      "error": null,
      "isActive": false,
      "output": null,
      "outputs": {}
    },
    {
      "id": "ef6954ee-2731-4a1a-abb5-40b61f077a6c",
      "text": "Act in Stripe",
      "x": 512,
      "y": 528,
      "isEditing": false,
      "type": "stripe-invoice",
      "icon": "connect",
      "category": "action",
      "isSelected": false,
      "parameters": {},
      "description": "Create and send a Stripe invoice with support for single or multiple line items",
      "error": null,
      "isActive": false,
      "output": null,
      "outputs": {}
    }
  ],
  "edges": [
    {
      "id": "2488b1b3-fa3b-4efb-ab2b-b21e71baab1e",
      "start": {
        "id": "c06a66ac-59ea-45d2-a870-523c059eb940",
        "type": "output"
      },
      "end": {
        "id": "33070a77-ba96-4b5c-a19d-1267884c5f6c",
        "type": "input"
      },
      "startX": 800,
      "startY": 168,
      "endX": 512,
      "endY": 360
    },
    {
      "id": "bacfd643-8f7f-46d0-a4bd-82b55f6dce00",
      "start": {
        "id": "33070a77-ba96-4b5c-a19d-1267884c5f6c",
        "type": "output"
      },
      "end": {
        "id": "ef6954ee-2731-4a1a-abb5-40b61f077a6c",
        "type": "input"
      },
      "startX": 800,
      "startY": 360,
      "endX": 512,
      "endY": 552
    }
  ],
  "zoomLevel": 1,
  "canvasOffsetX": 0,
  "canvasOffsetY": 0,
  "isTinyNodeMode": false
}

Get this running today

Free, local, and it asks for Google Sheets, PostgreSQL, Stripe, Slack, Google Slides and nothing else.

Common questions

What if a data source is down when the report runs?

The run reports the failure rather than silently omitting the section. A missing number is visible as missing, which is the only safe behaviour for something people make decisions on.

Can it produce different versions for different audiences?

Yes — the same collected data can drive a detailed internal version and a summarised client-facing one, from one run, without gathering the numbers twice.

Does this replace our BI tool?

No. A dashboard answers questions you already know to ask. This writes the recurring narrative around the numbers and delivers it to people who were never going to open the dashboard.

Give AI a job. Get the proof.