---
title: "PDF report questions answered from Qdrant through a webhook"
kind: "Kit"
category: "Finance & accounting"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/18c45896-67f7-4ae8-9342-3b9df3ece4f2"
updated: "2026-11-12"
---

# PDF report questions answered from Qdrant through a webhook

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

An n8n workflow in two parts. One stores a PDF from Google Drive in a Qdrant collection, and a webhook then answers questions about it with an OpenAI model, using the five closest chunks.

PDF report questions answered from Qdrant through a webhook 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 lets you ask questions about a PDF report and get the answers back from a web address. The first part downloads the PDF from Google Drive, cuts it into chunks, turns each one into a vector with OpenAI and stores them in a Qdrant collection. The second part is a webhook. You post a question, the workflow finds the five closest chunks, and an OpenAI chat model writes the answer from them. Thirteen nodes do the work, beside two sticky notes.

### Who it suits

Analysts, small finance teams and builders who want a question box over a long report without reading it end to end. It also suits anyone learning how a vector store and a retrieval chain fit together. Skip it if you need answers across many reports at once, since each question searches one collection.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Finance | Analysts | Ask a long report what it says about risks, costs or outlook | An analyst asks which risks an annual report names. |
| Investing | Individual investors | Check a claim in a filing before acting on it | An investor asks how much cash a company reports. |
| Operations | Small business teams | Put a long policy or contract behind a question box | A manager asks how long a supplier contract runs. |
| Software | Developers | Use it as a small model of a retrieval flow they will build for their own files | A developer swaps the PDF and keeps the rest. |

You need a little n8n: import a file, add three credentials and call a webhook with a JSON body. Nothing in the file states a setup time.

### Where to use it

Any n8n that can reach OpenAI, Google Drive and a Qdrant instance will run it.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file and steps, with a webhook address your tools can reach
- Another front end: a form, a bot or a script that posts \`input\` and \`company\` can ask the questions
- Another file source: swap the Google Drive node for any node that outputs the PDF as binary data in \`data\`

### How to set it up

Download saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Three accounts cover every step.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| OpenAI | An API key, used by the two embedding nodes and the chat model |
| Google | An account for a Google Drive OAuth2 credential, and a PDF in your Drive |
| Qdrant | An instance n8n can reach, with its address and an API key if it needs one |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add an OpenAI credential and select it in `Embeddings OpenAI`, `Embeddings OpenAI1` and `OpenAI Chat Model`.
3. Add a Google Drive credential and select it in `Google Drive`. Replace `YOUR_FILE_ID` with the id of your PDF, the long part of its address in Drive.
4. Add a Qdrant API credential with your address and key, and select it in `Qdrant Vector Store` and `Qdrant Vector Store1`.
5. Open `OpenAI Chat Model` and pick a current model. The file names none, so n8n fills in `gpt-5-mini`, which OpenAI’s deprecations page, read on 12 November 2026, shuts down on 11 December 2026, with `gpt-5.6-terra` as the replacement.
6. Press Execute Workflow once to store the PDF in a collection called `crowd`.
7. Listen for a test event on `Webhook1` and post a question to `/webhook-test/pdf-question`, or publish the workflow and use `/webhook/pdf-question`.

### How to use it

Post a JSON body with two fields to the webhook. `input` holds your question, and `company` names the collection to search. The reply is the answer as plain text. Store a second PDF in a collection of its own, and a different `company` value searches that one instead.

What to change for a different result

| To change | Where |
| --- | --- |
| The file | The id in \`Google Drive\` |
| The collection | The name in \`Qdrant Vector Store\` and the \`company\` field you post |
| Chunk size | \`Recursive Character Text Splitter\`, 3000 characters with an overlap of 200 |
| How many chunks the model sees | \`topK\` in \`Vector Store Retriever\`, 5 |
| The model | \`OpenAI Chat Model\` |

### Example

You store an annual report and ask which risks it names.

You post `{"input": "Which risks does the report name?", "company": "crowd"}`. The question becomes a vector, and Qdrant returns the five closest chunks. The model writes an answer from them, and the webhook replies with that text. Check any figure against the PDF, since the model saw only five chunks.

### 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. A vector store keeps each chunk of text as a list of numbers, so a question can find the passages closest to it in meaning. The top group stores the PDF. The bottom group answers. Run the top once, then keep the bottom listening.

**For experts.** Two Qdrant nodes share a collection by name, and the webhook picks the collection for each request.

Where to look closer

| Node | What it does | What to know |
| --- | --- | --- |
| \`Qdrant Vector Store\` | Version 1, insert mode, collection \`crowd\` | It creates the collection if it is missing. Run it again and the chunks go in a second time |
| \`Qdrant Vector Store1\` | Version 1, collection \`{{ $json.body.company }}\`, feeding \`Vector Store Retriever\` | The caller picks the collection, so anyone who can call the webhook can search any collection on that Qdrant instance |
| \`Retrieval QA Chain\` | Version 1, query \`{{ $json.body.input }}\` | Its output is \`response.text\`, which \`Respond to Webhook\` returns as text |
| \`Webhook1\` | Version 1.1, a POST on \`pdf-question\`, answered by a node | It has no sign-in |

### Good to know

The webhook is open, and the caller names the collection.

- Open webhook: \`Webhook1\` has no sign-in, so once the workflow is published, anyone with its address can ask questions and spend your OpenAI key
- Collection: the caller’s \`company\` value picks the collection, so use a Qdrant instance that holds only what you are happy to expose, or add a check
- Reruns: the first part adds the chunks again each time, so run it once per file
- Embeddings: both embedding nodes must use the same model, because the collection’s vectors have one fixed size. They arrive on the node’s default
- Models: the file names no chat model, and n8n fills in \`gpt-5-mini\`, which OpenAI shuts down on 11 December 2026. Step 5 names the replacement
- Billing: each question costs at least one embedding call and one model call
- Your data: the report’s text and every question go to OpenAI. Qdrant holds the chunks
- Accuracy: the answer rests on five chunks, so check what matters against the PDF
- A repair: the original copy wired in a chat trigger that sent the question in a field the chain does not read. Mindket’s copy drops it
- Credentials: the JSON holds none

## README

````markdown
# PDF report questions answered from Qdrant through a webhook

An n8n workflow in two parts. The first reads a PDF from Google Drive, cuts it into chunks and stores them in a Qdrant
collection. The second waits at a webhook: you post a question, it finds the five closest chunks, hands them to an
OpenAI chat model and sends the answer back in the reply.

## What is inside

- `workflow.json`: the workflow as n8n exports it, 13 nodes beside 2 sticky notes. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

Mindket fixed a few things the copy would have tripped over:

- The Google Drive node held its author's own file id. It now reads `YOUR_FILE_ID`, and you put in your own.
- The webhook's path was a long random string. It now reads `pdf-question`.
- The copy had a chat trigger wired into the answering chain. The trigger sends the message in a field called `input`,
  and the chain reads `body.input`, so a question from the Chat window would have failed. Mindket removed that trigger.
- Two sticky notes spoke of Supabase while the nodes use Qdrant. Mindket reworded them, and removed a third note that
  only pointed to a video.
- The workflow arrives switched off, and no credential is inside.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- An OpenAI API key.
- A Google account, for a Google Drive OAuth2 credential, and a PDF in your Drive.
- A Qdrant instance that n8n can reach, with its address and, if it needs one, an API key.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add an OpenAI credential and select it in `Embeddings OpenAI`, `Embeddings OpenAI1` and `OpenAI Chat Model`.
3. Add a Google Drive credential and select it in `Google Drive`. Replace `YOUR_FILE_ID` with the id of your PDF, the
   long part of its address in Drive.
4. Add a Qdrant API credential with your Qdrant address and key, and select it in `Qdrant Vector Store` and
   `Qdrant Vector Store1`.
5. Open `OpenAI Chat Model` and pick a current model. The file names none, so n8n fills in `gpt-5-mini`. OpenAI's
   deprecations page, read on 12 November 2026, gives 11 December 2026 as its shutdown date and names `gpt-5.6-terra`
   as its replacement.
6. Press Execute Workflow once. The PDF is stored in a collection called `crowd`, which is created if it is missing.
7. Listen for a test event on `Webhook1`, then post a question:

```
curl -X POST https://YOUR-N8N-ADDRESS/webhook-test/pdf-question \
  -H "Content-Type: application/json" \
  -d '{"input": "What are the main risks this report names?", "company": "crowd"}'
```

Once the workflow is published, the same call goes to `/webhook/pdf-question`.

## How a run goes

The first part runs when you press Execute Workflow:

1. `When clicking "Execute Workflow"` starts it.
2. `Google Drive` downloads the file whose id you set.
3. `Binary to Document` reads the PDF's binary field `data` and turns its pages into documents.
4. `Recursive Character Text Splitter` cuts them into chunks of 3000 characters that overlap by 200.
5. `Embeddings OpenAI` turns each chunk into a vector, and `Qdrant Vector Store` inserts the vectors in the collection
   `crowd`.

The second part runs when a question arrives:

1. `Webhook1` takes a POST on `pdf-question` and holds the reply until a node answers.
2. `Retrieval QA Chain` reads the question from `body.input`.
3. `Qdrant Vector Store1` searches the collection named in `body.company`, with `Embeddings OpenAI1` turning the
   question into a vector. `Vector Store Retriever` keeps the five closest chunks.
4. `OpenAI Chat Model` writes the answer from those chunks.
5. `Respond to Webhook` sends the answer back as plain text.

## Change the look

- The collection: the name in `Qdrant Vector Store` for storing, and the `company` field you post for asking. Keep them
  the same.
- Chunk size and overlap: `Recursive Character Text Splitter`.
- How many chunks the chain sees: `topK` in `Vector Store Retriever`, 5 in the file.
- The model: `OpenAI Chat Model`.
- A different file: the id in `Google Drive`. Use a new collection name for each report you want to keep apart.

## Good to know

- The `company` field decides which collection is searched, so a name that matches no collection cannot return an answer.
- Each run of the first part adds the file's chunks again and does not clear the collection, so run it once per file.
- Both embedding nodes must use the same model, because the collection's vectors have one fixed size. They arrive on the
  node's default.
- Each question costs at least one embedding call and one model call.
- The report's text and each question go to OpenAI. Qdrant holds the chunks.
- The webhook has no sign-in. Once the workflow is published, anyone with its address can ask questions and spend your
  OpenAI key.
- The answer rests on the five chunks it was given, so check anything that matters against the PDF.
- The JSON holds no credential.
````

## What is in it

3 files, 13 KB, downloaded as a zip.

```text
NOTICE.md  617 B
README.md  5 KB
workflow.json  8 KB
```

## Workflow check

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

- Steps: 6 steps, starting when its webhook is called or by hand
- AI: 2 steps call an AI model: Retrieval QA Chain and Qdrant Vector Store
- Sign-ins: Signs in to: Qdrant, OpenAI and Google Drive
- API keys: No API key is left in the file
- Step types: Mindket’s checker reads 5 of its 6 step types. It does not read: Vector Store Qdrant

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/18c45896-67f7-4ae8-9342-3b9df3ece4f2)
- [Its page on Mindket](https://mindket.com/p/18c45896-67f7-4ae8-9342-3b9df3ece4f2)
