AutomationFlowsAI & RAG › Extract PDF Itineraries to Google Sheets with Gpt-4.1-mini & Gmail Notifications

Extract PDF Itineraries to Google Sheets with Gpt-4.1-mini & Gmail Notifications

ByCheng Siong Chin @cschin on n8n.io

Automates PDF data extraction using OpenAI GPT, saves to Google Sheets, sends email confirmations. Reduces manual entry by 90%. Receives PDF uploads via form Splits & loops through files AI extracts structured data Appends to Sheets with timestamps Sends confirmation email…

Event trigger★★★★☆ complexityAI-powered9 nodesOpenAIOpenAI ChatGoogle SheetsForm TriggerGmailInformation Extractor
AI & RAG Trigger: Event Nodes: 9 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #9281 — we link there as the canonical source.

This workflow follows the Form Trigger → Gmail recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "FaoXqBQDK5JryXkW",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Extract PDF Itineraries to Google Sheets with GPT-4.1-Mini & Gmail Notifications",
  "tags": [],
  "nodes": [
    {
      "id": "51147ae9-3e42-474b-aecf-321b364b8b11",
      "name": "Create Email",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1072,
        960
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Agency Name: {{ $json['Agency Name'] }} \nEmail:{{ $json.Email }}\nAddress: {{ $json.Address }}\nPhone:{{ $json.Phone }}\nDate:{{ $json.Date }}\nTour:{{ $json.tour }}\nDeparture Date: {{ $json['departure date'] }}"
            },
            {
              "role": "system",
              "content": "=# Overview\nYou are an email specialist for a Tour Agency. You will receive tour itinerary information. Your task is to confirm receipt of the itinerary and notify the relevant parties.\n\n## Email\nInform the team that the itinerary has been received and processed. Notify them that it has been updated in the Tour Database and provide them with the access link to view it.\n https://docs.google.com/spreadsheets/d/1lg-GRBTQCvM9WC_Mbhe4YXwgyrRcHm8K2JYDHg4XOww/edit?gid=0#gid=0\n\n## Output\nOutput the following parameters separately:\nSubject\nEmail"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "ab57e57e-c161-48b3-ab73-caea2ef9c12c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        544,
        1136
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6dd88c5f-6724-4872-97fc-0cc152d7446d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        768
      ],
      "parameters": {
        "width": 784,
        "height": 992,
        "content": "# Extract PDF Itineraries to Google Sheets with GPT-4.1-Mini & Gmail Notifications\n\n## Overview\nAutomates PDF data extraction using OpenAI GPT, saves to Google Sheets, sends email confirmations. Reduces manual entry by 90%.\n\n## How It Works\n1. Receives PDF uploads via form\n2. Splits & loops through files\n3. AI extracts structured data\n4. Appends to Sheets with timestamps\n5. Sends confirmation email\n\n## Prerequisites\n- OpenAI API key ([platform.openai.com](https://platform.openai.com))\n- Google Workspace (Sheets & Gmail)\n- n8n v1.0.0+\n\n## Setup\n1. Add OpenAI API key to n8n credentials\n2. Create Google Sheet with extraction columns, authorize OAuth2\n3. Configure Gmail OAuth2\n4. Import workflow JSON\n5. Edit AI prompt for your fields\n6. Activate & share form URL\n\n## Customization\n- Modify extraction prompts\n- Adjust Sheets mapping\n- Customize email templates\n- Add error handling/validation\n- Extend to Word/Excel files\n\n## Use Cases\nInvoices, expense reports, resumes, contracts, forms, legal docs\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e58f6aab-f60d-4eba-9d3c-4aba55d299e4",
      "name": "Extracted information to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        848,
        960
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $json.output[' Date'] }}",
            "tour": "={{ $json.output.tour }}",
            "Email": "={{ $json.output.Email }}",
            "Phone": "={{ $json.output.Phone }}",
            "Address": "={{ $json.output.Address }}",
            "Agency Name": "={{ $json.output['Agency Name'] }}",
            "departure date": "={{ $json.output['departure date'] }}"
          },
          "schema": [
            {
              "id": "Agency Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Agency Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Address",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tour",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tour",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "departure date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "departure date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Agency Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1lg-GRBTQCvM9WC_Mbhe4YXwgyrRcHm8K2JYDHg4XOww/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1lg-GRBTQCvM9WC_Mbhe4YXwgyrRcHm8K2JYDHg4XOww",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1lg-GRBTQCvM9WC_Mbhe4YXwgyrRcHm8K2JYDHg4XOww/edit?usp=drivesdk",
          "cachedResultName": "tour"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "8f5ff28e-0301-4cd9-bdd2-2d9278c2d0ec",
      "name": "Loop Over Items ensures each document",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        288,
        960
      ],
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "e5a12fea-0bde-49db-8b48-b58aa31bbfb2",
      "name": "Form receives multiple PDF files",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -176,
        960
      ],
      "parameters": {
        "options": {},
        "formTitle": "LOAD MULTIPLE FILES",
        "formFields": {
          "values": [
            {
              "fieldType": "file",
              "fieldLabel": "files",
              "requiredField": true,
              "acceptFileTypes": "*.pdf"
            }
          ]
        },
        "formDescription": "Select multiple pdf files to run this example."
      },
      "typeVersion": 2.2
    },
    {
      "id": "453337ca-283e-4e6d-be87-87a435537032",
      "name": "Split Files processes each PDF individually",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        48,
        960
      ],
      "parameters": {
        "options": {
          "includeBinary": true,
          "destinationFieldName": "=files"
        },
        "fieldToSplitOut": "=files"
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "940b3087-4fc8-439d-98e3-7e14f034becc",
      "name": "email confirmation sent with results",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1424,
        1088
      ],
      "parameters": {
        "sendTo": " user@example.com",
        "message": "= {{ $('Create Email').item.json.message.content.Email }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ $json.message.content.Subject }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "5f12a35a-6019-4b89-83c1-9ceadaa60cad",
      "name": "Analyzes & extract PDF",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        544,
        960
      ],
      "parameters": {
        "text": "={{ $json.files.filename }}",
        "options": {
          "systemPromptTemplate": "You are an expert extraction algorithm.\nOnly extract relevant information from the text.\nIf you do not know the value of an attribute asked to extract, you may omit the attribute's value."
        },
        "attributes": {
          "attributes": [
            {
              "name": "Agency Name",
              "required": true,
              "description": "the name of the client"
            },
            {
              "name": "Email",
              "required": true,
              "description": "the email of the client"
            },
            {
              "name": "Address",
              "required": true,
              "description": "the address of the client"
            },
            {
              "name": "Phone",
              "required": true,
              "description": "the phone number of the client"
            },
            {
              "name": " Date",
              "type": "date",
              "required": true,
              "description": "the date "
            },
            {
              "name": "tour",
              "required": true,
              "description": "holiday package tour"
            },
            {
              "name": "departure date",
              "required": true,
              "description": "departure date"
            }
          ]
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "17da634d-89f9-4c60-8c9b-f8b018c99481",
  "connections": {
    "Create Email": {
      "main": [
        [
          {
            "node": "email confirmation sent with results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Analyzes & extract PDF",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Analyzes & extract PDF": {
      "main": [
        [
          {
            "node": "Extracted information to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Form receives multiple PDF files": {
      "main": [
        [
          {
            "node": "Split Files processes each PDF individually",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "email confirmation sent with results": {
      "main": [
        [
          {
            "node": "Loop Over Items ensures each document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items ensures each document": {
      "main": [
        [],
        [
          {
            "node": "Analyzes & extract PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extracted information to Google Sheets": {
      "main": [
        [
          {
            "node": "Create Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Files processes each PDF individually": {
      "main": [
        [
          {
            "node": "Loop Over Items ensures each document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Automates PDF data extraction using OpenAI GPT, saves to Google Sheets, sends email confirmations. Reduces manual entry by 90%. Receives PDF uploads via form Splits & loops through files AI extracts structured data Appends to Sheets with timestamps Sends confirmation email…

Source: https://n8n.io/workflows/9281/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Author: CSChin Example Source: https://www.ncl.ac.uk/singapore/staff/profile/chengchin.html#publications

HTTP Request, OpenAI Chat, Form Trigger +3
AI & RAG

Detects new unread Gmail messages Extracts sender name for personalized replies Classifies the email into one of four categories Applies the correct Gmail label and either sends an auto-reply, creates

Gmail Trigger, OpenAI Chat, Gmail +4
AI & RAG

Sending a plain PDF resume doesn’t stand out anymore. This workflow allows candidates to convert their resume and photo into a personalized video resume. Recruiters get a more engaging first impressio

OpenAI Chat, HTTP Request, Information Extractor +3
AI & RAG

Eliminate 90% of manual work in procurement by automating quote requests, response tracking, price extraction, and supplier follow-ups. This complete automation handles everything from sending persona

Gmail, Google Sheets, Information Extractor +2
AI & RAG

This n8n template demonstrates how to automate email classification, labeling, draft generation, and logging using Gmail, OpenAI, and Google Sheets. Use cases include customer support management, sale

Gmail Trigger, Gmail, Text Classifier +4