---
title: "Quarterly earnings PDFs turned into an analyst report"
kind: "Kit"
category: "Finance & accounting"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/605168e5-a1ab-4160-95e1-916a889473ff"
updated: "2026-11-12"
---

# Quarterly earnings PDFs turned into an analyst report

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow that loads quarterly earnings PDFs from Google Drive into a Pinecone index with Gemini embeddings. An OpenAI agent then searches that index for a report on the last three quarters and adds it to a Google Doc.

Quarterly earnings PDFs turned into an analyst report is an n8n workflow in the Finance \& accounting category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-12. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow turns a stack of quarterly earnings PDFs into a written analyst report. Run its first half once and it reads each PDF listed in a Google Sheet, cuts the text into chunks and stores them in a Pinecone index, with Gemini embeddings. Its second half starts an OpenAI agent that searches that index and writes a markdown report on the last three quarters. The report is added to the end of a Google Doc. Sixteen nodes do the work, beside three sticky notes.

### Who it suits

Private investors, junior analysts and finance students who follow a few listed companies and want a first draft of how recent quarters compare. Skip it if you need audited figures or cannot check the numbers against the PDFs. As imported, the prompt and the system message are written for Google.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Investing | Private investors | Load the last three earnings PDFs of a stock they hold and ask for the trends | A retired engineer reads the draft before deciding whether to add to a holding. |
| Equity research | Junior analysts | Start from a structured draft of the quarter-on-quarter changes | An analyst gets revenue, costs and outliers laid out, then checks each figure against the filing. |
| Finance education | Students and teachers | Compare a generated report with the PDFs it came from | A class marks which claims the filings back up and which they do not. |
| Strategy | Product and strategy leads | Load a listed rival’s latest reports and ask what changed | A product lead asks where a rival’s costs grew fastest. |

You need solid n8n for this one: six credentials, a Pinecone index of the right size and a sheet of PDF links.

### Where to use it

Any n8n that can reach Google, Pinecone and OpenAI will run it. The report lands in a Google Doc, so a shared document lets a team read it.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file and steps
- Google Drive: keep the PDFs there, with the sheet beside them
- Another place for the report: replace the last node with Gmail or Slack

### How to set it up

Download saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Make the Pinecone index before you load anything.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| Google | One account for Sheets, Drive and Docs credentials, and a Gemini API key from Google AI Studio |
| Pinecone | An account, an API key and an index named \`company-earnings\` with 3072 dimensions |
| OpenAI | An API key |
| Your files | The PDFs in Drive, a sheet with \`File URL\` and \`10Q\` columns, and an empty Google Doc |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. In Pinecone, create the index `company-earnings` with 3072 dimensions.
3. Give the sheet two headings, `File URL` and `10Q`, and add one row for each PDF: its Drive link and the name to save it under.
4. Add the credentials and select each one in its nodes. The README lists which node takes which.
5. In `List Of Files To Load (Google Sheets)`, replace `YOUR_SHEET_ID` and `YOUR_SHEET_TAB`. In `Save Report to Google Docs`, replace `YOUR_GOOGLE_DOC_ID`.
6. Press play on `Load earnings PDFs` and wait for the loop to end.
7. Edit the prompt and system message in `AI Agent` for your company, then run `When clicking ‘Test workflow’`.

### How to use it

Load the PDFs once, then ask for a report whenever you like. Open your Google Doc to read it. To follow another company, change the sheet’s rows and the agent’s prompt, and empty the index or make a new one.

What to change for a different result

| To change | Where |
| --- | --- |
| Company and quarters | The sheet’s rows, and the prompt and system message in \`AI Agent\` |
| The report’s sections | The numbered list in the system message |
| Chunk size | \`Chunk Size\` in \`Recursive Character Text Splitter\` |
| Passages for each search | \`Limit\` in \`Vector Store Tool\` |
| The models | \`OpenAI Chat Model\` and \`Google Gemini Chat Model1\` |

### Example

An investor saves three of Alphabet’s quarterly earnings PDFs in Drive and lists them in the sheet. After the load, the typed prompt asks for a markdown report on the last three quarters, with the differences, the trends and any outliers.

The agent searches the index for revenue, expenses, profit and management comments. It then writes the report in the sections its system message lists, and the text is added to the end of the Google Doc. Check every figure against the PDFs before you use it.

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. This one has two separate lines. The first fills the index and the second asks the questions. The index holds each chunk of text as a vector, a list of numbers that places similar passages close together, so the agent can look up the passages nearest a question.

**For experts.** The tool is a Vector Store Tool, which runs a question-answering chain with the Gemini model over the four nearest chunks. The agent’s model sees that answer, never the raw chunks.

Where to look closer

| Node | What it does | What to know |
| --- | --- | --- |
| \`Pinecone Vector Store\` | Inserts chunks into \`company-earnings\` | No namespace is set, so every load adds to the same space and repeats pile up |
| \`Default Data Loader\` | Reads each downloaded file as a PDF | Version 1 uses the connected splitter, 1000 characters with no overlap |
| \`Vector Store Tool\` | Answers the agent’s questions from the index | Its own Gemini model writes each answer from four chunks |
| \`AI Agent\` | Runs the prompt with that one tool | The system message promises a Google Docs tool that is not attached |

### Good to know

The loading half had no start in the original, and two retired Gemini models are replaced.

- Two starts: Mindket’s copy adds the trigger \`Load earnings PDFs\` for the loading half. Press it once, not on every report
- Gemini models: Google’s deprecations page, read on 12 November 2026, shows \`text-embedding-004\` as shut down on 14 January 2026 and the 2.0 Flash models on 1 June 2026. The copy calls \`gemini-embedding-2\` and \`gemini-3.6-flash\`, the replacements it names
- Index size: \`gemini-embedding-2\` returns 3072 numbers by default, so make the Pinecone index 3072 wide
- Repeats: each press on \`Load earnings PDFs\` adds every chunk again, so empty the index before you reload
- OpenAI default: \`OpenAI Chat Model\` sets no model, so n8n uses \`gpt-5-mini\`. OpenAI’s page, read on 12 November 2026, gives 11 December 2026 for its shutdown, with \`gpt-5.6-terra\` as the replacement
- Two models: Gemini writes each tool answer and the agent builds the report from those answers, so figures can drift
- Billing: Gemini bills each chunk embedded and each search, OpenAI the agent’s turns, and Pinecone the index
- Your data: the PDFs’ text goes to Google, the chunks sit in Pinecone, and the questions and tool answers go to OpenAI
- Credentials: the JSON holds none

## README

```markdown
# Quarterly earnings PDFs turned into an analyst report

An n8n workflow in two halves. The first loads quarterly earnings PDFs from Google Drive into a Pinecone index, with Gemini
embeddings. The second asks an OpenAI agent for a report on the last three quarters. The agent searches that index, and the
finished report is added to a Google Doc.

## What is inside

- `workflow.json`: the workflow as n8n exports it, nineteen nodes. Sixteen of them run and three are sticky notes. It holds no
  credential.
- `README.md`: these notes.

## What we changed from the original copy

- Nothing started the half that fills the index, so a test run only reached the agent. We added a Manual Trigger,
  `Load earnings PDFs`, in front of `List Of Files To Load (Google Sheets)`.
- Both embedding nodes called `models/text-embedding-004`, which Google shut down on 14 January 2026. They now call
  `models/gemini-embedding-2`, the replacement on Google's deprecations page, read on 12 November 2026.
- The Gemini chat model inside the vector store tool was `models/gemini-2.0-flash-exp`. The same page lists the 2.0 Flash models as
  shut down on 1 June 2026 and names `gemini-3.6-flash` as their replacement, so the node calls `models/gemini-3.6-flash`.
- The sheet, the Google Doc and every credential link belonged to the file's author. The two IDs are placeholders now, and the
  credential links are gone.
- The sticky note of setup steps is replaced by a short pointer to this file.
- Nothing else. The file has no Code node.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- A Google account for three OAuth2 credentials: Google Sheets, Google Drive and Google Docs.
- A Gemini API key from Google AI Studio, for a Google Gemini(PaLM) Api credential.
- A Pinecone account and API key.
- An OpenAI API key.
- The earnings PDFs, saved in Google Drive.
- A Google Sheet with one row for each PDF, and an empty Google Doc for the reports.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. In Pinecone, create an index named `company-earnings` with 3072 dimensions. Google's embeddings page
   gives 3072 as the default size of `gemini-embedding-2`. An index made for the older model's 768 will refuse the vectors.
3. Fill the sheet's first row with two headings, `File URL` and `10Q`. Under them, add one row for each PDF: its Google Drive link,
   and the name to save the file under.
4. Add the credentials and select each one: Google Sheets in `List Of Files To Load (Google Sheets)`, Google Drive in
   `Download File From Google Drive`, Google Docs in `Save Report to Google Docs`, Google Gemini(PaLM) in
   `Embeddings Google Gemini`, `Embeddings Google Gemini (retrieval)` and `Google Gemini Chat Model1`, Pinecone in both Pinecone
   nodes, and OpenAI in `OpenAI Chat Model`.
5. In `List Of Files To Load (Google Sheets)`, replace `YOUR_SHEET_ID` with the ID from the sheet's address, the part between `/d/`
   and `/edit`, and `YOUR_SHEET_TAB` with the tab's name.
6. In `Save Report to Google Docs`, replace `YOUR_GOOGLE_DOC_ID` with the ID of your document, found the same way.
7. Press the play button on `Load earnings PDFs` and wait until the loop ends. Check in Pinecone that the index now holds vectors.
8. Open `AI Agent` and rewrite its prompt and system message for your company. Both are written for Google.
9. Run the other trigger, `When clicking ‘Test workflow’`, and open the Google Doc.

## How a run goes

Filling the index:

1. `Load earnings PDFs` starts `List Of Files To Load (Google Sheets)`, which reads every row of the tab.
2. `Loop Over Items` passes on one row at a time, since its batch size is left at 1.
3. `Download File From Google Drive` opens the file at `File URL` and names it after the `10Q` column.
4. `Default Data Loader` reads the file as a PDF, one document for each page. `Recursive Character Text Splitter` cuts those into
   chunks of 1000 characters with no overlap, and `Embeddings Google Gemini` turns each chunk into a vector.
5. `Pinecone Vector Store`, set to insert, writes the vectors into the `company-earnings` index.
6. The node hands control back to `Loop Over Items` for the next row.

Asking for the report:

1. `When clicking ‘Test workflow’` starts `AI Agent` (version 1.7). Its prompt is typed in the node: a markdown report on Google's
   last three quarters, with the differences, the trends and any outliers.
2. The agent's model is `OpenAI Chat Model`. Its one tool, `Vector Store Tool`, is named `company_financial_earnings_data_tool`.
3. When the agent calls the tool, `Pinecone Vector Store (Retrieval)` finds the four closest chunks, since `Limit` is left at 4.
   `Google Gemini Chat Model1` answers from them and hands that answer back to the agent. The agent may call the tool many times.
4. `Save Report to Google Docs` adds the agent's `output` to the end of your document.

## Change the look

- Company and quarters: the sheet's rows, and the prompt and system message in `AI Agent`.
- The report's sections: the list in the system message.
- Chunk size: `Chunk Size` in `Recursive Character Text Splitter`. Load the PDFs again after a change.
- Passages for each search: `Limit` in `Vector Store Tool`.
- Models: `OpenAI Chat Model` and `Google Gemini Chat Model1`. Keep both embedding nodes on the same model.
- Where the report goes: replace the last node with Gmail, Slack or another node that takes text.

## Good to know

- Each press on `Load earnings PDFs` adds every chunk again, and nothing checks for repeats. Empty the index before you reload.
- The index size must match the embedding model. If you change the model in both embedding nodes, make a new index to suit it.
- The system message says the agent has a Google Docs tool. It has none: `Save Report to Google Docs` writes the text after the agent
  finishes. The sentence does no harm, and you can delete it.
- The report passes through two models. Gemini writes each tool answer from four chunks, and the agent builds the report from those
  answers. Check the figures that matter against the PDFs before anyone relies on them.
- `OpenAI Chat Model` sets no model, so n8n's default for that node version applies, `gpt-5-mini`. OpenAI's list of retiring models, read the
  same day, gives 11 December 2026 as its shutdown and `gpt-5.6-terra` as the replacement. Pick a model in the node.
- Google's page also lists `gemini-2.5-pro` and `gemini-2.5-flash` for 1 December 2026. Neither is used here.
- Billing: Gemini charges for each chunk embedded and again for each search, OpenAI for the agent's turns, and Pinecone for the index.
- Where the data goes: the PDFs' text goes to Google for embedding, the chunks are stored in Pinecone, and the question and the tool's
  answers go to OpenAI. The finished report lands in your Google Doc.
```

## What is in it

3 files, 21 KB, downloaded as a zip.

```text
NOTICE.md  637 B
README.md  7 KB
workflow.json  14 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 8 steps, starting by hand
- AI: 2 steps call an AI model: Pinecone Vector Store and AI Agent
- Sign-ins: Signs in to: Google Sheets, Google Drive, Pinecone, Google Gemini, Google Docs and OpenAI
- API keys: No API key is left in the file
- Step types: Mindket’s checker reads all 7 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/605168e5-a1ab-4160-95e1-916a889473ff)
- [Its page on Mindket](https://mindket.com/p/605168e5-a1ab-4160-95e1-916a889473ff)
