Automate timesheet to invoice conversion with OpenAI, Gmail & Google Workspace
This workflow converts emailed timesheets into structured invoice rows in Google Sheets and stores them in the correct Google Drive folder structure.
It:
- Listens to Gmail for timesheet attachments
- Runs OCR and AI parsing
- Looks up Customer and PO data from a Google Sheet
- Organizes files in Client → Employee → Year folders
- Reuses an existing invoice sheet or creates a new one and writes the invoice row
Quick Implementation Steps
- Import the workflow JSON into your n8n instance.
- Set up credentials for:
- Gmail
- Google Drive
- Google Sheets
- OpenAI
- Check the OCR HTTP node:
- Default URL:
https://universal-file-to-text-extractor.vercel.app/extract
- Default URL:
- Configure "Get Customer Info From PO Sheet" with:
- Spreadsheet ID
- Correct sheet and column names
- Confirm Gmail Trigger filter:
has:attachment (filename:timesheet OR subject:timesheet)and unread only
- Ensure your Client Invoices root folder exists in Google Drive.
- Test once with a sample timesheet email.
- Activate the workflow.
What It Does
- Reads unread Gmail messages with timesheet attachments.
- Splits and processes each attachment separately.
- Sends files to OCR and converts them to text.
- Uses OpenAI to extract:
- Employee Name
- Client Name
- Week Start and End Dates
- Total Billable Hours
- Current Year
- Looks up Customer and PO data from a Google Sheet:
- Account Number
- PO Number
- Item Name
- Folder Name
- Invoice range
- Due Date offset
- Builds or finds:
- Client folder
- Employee folder
- Year folder
- Either:
- Appends to an existing sheet for that employee and period, or
- Creates a new sheet, sets timezone, moves it into the right folder, and adds the invoice row
Who Is It For
- Agencies and consultancies billing from emailed timesheets
- Finance or ops teams managing many clients and employees in Google Workspace
- Service providers that keep one sheet per employee per period
- Anyone who wants to stop manually reading timesheets and filling invoice sheets
Requirements
- n8n instance
- Gmail account with timesheet emails
- Google Drive and Google Sheets
- OpenAI API key
- OCR API endpoint (or the default one)
- Customer POs Google Sheet with:
- Customer Account Number
- PO Number
- Item
- Folder Name
- Invoice range
- Due Date Calculation
How It Works
1. Email Intake and Loop
- Gmail Trigger
- Polls every minute
- Filter: unread + has attachment + timesheet in file name or subject
- Split Binary Attachments
- Creates one item per attachment
- Loop: Process Each Attachment
- Handles each timesheet file in sequence
2. OCR and AI Parsing
- Extract Text from Attachment
- Sends binary file to OCR endpoint
- Returns plain text
- Extract Timesheet Data (OpenAI)
- Reads the text and outputs strict JSON with:
- Employee Name
- Client Name
- Week Starting Date
- Week Ending Date
- Total Working Hours
- Reads the text and outputs strict JSON with:
- Set Timesheet JSON Fields
- Normalizes and stores:
- Employee Name
- Total Billable hours
- Week Start Date and Week End Date
- Client Name
- Current Year
- Normalizes and stores:
3. Customer and PO Lookup
- Get Customer Info From PO Sheet
- Looks up sender email
- Pulls:
- Customer Account Number
- PO Number
- Item
- Folder Name
- Invoice range
- Due Date Calculation
4. Drive Folder Discovery
- Search: Client Invoices Folder
- Finds the main invoices root folder
- Search or create:
- Client folder using Client Name
- Employee folder using Folder Name from PO sheet
- Search: Year Folder
- Looks for folder matching Current Year
- If Year Folder does not exist:
- Create Year Folder or Create Current Year Folder
- Set: Invoice Range
- Stores invoice range and Year Folder id
5. File Naming and Sheet Search
- Set: File Name from Start and End Based Date Range
- Builds:
- File Name (Start Date Based)
- File Name (End Date Based)
- Handles weekly and 15 days invoice logic
- Builds:
- Search: File By Start Date Name
- Search: File By End Date Name
- Merge: Combine Folder Search Results
- Merges both search results
- If: Invoice Range is 15 Days
- Uses custom 2 week window for file naming
- Set Invoice Date and Due Date Days
- Invoice Date from week end
- Due Date from week end plus offset
6. Reuse vs Create Sheet
- If: File Already Exists
- If found
- Go to Append: Final Row to Existing Sheet
- If not found
- Go to Sheets: Create Sheet
- If found
New Sheet Path
- Sheets: Create Sheet
- Creates new spreadsheet with generated name
- HTTP Request (create sheet)
- Sets spreadsheet timezone to America/New_York
- Drive: Move Sheet To Final Folder
- Moves spreadsheet into the Year Folder
- Set: Empty Row Structure
- Prepares JSON structure for invoice row
- Sheets: Append Row1
- Writes the first invoice row
- Set: Spreadsheet (ID and Name)
- Stores id and name
- Append: Final Row to Existing Sheet
- Ensures row is appended with full mapping
Existing Sheet Path
- Set: Spreadsheet (ID and Name)
- Uses found spreadsheet
- Append: Final Row to Existing Sheet
- Appends new row with:
- Customer Account Number
- Invoice Date
- Due Date
- PO Number
- Item and columns
- Total billable hours as Quantity
- Description with week period
- Appends new row with:
How To Set Up
1. Import and Credentials
- Import JSON in n8n
- Set credentials for:
- Gmail Trigger
- Google Drive nodes
- Google Sheets nodes
- OpenAI node
- OCR HTTP node if needed
2. Customer POs Sheet
- In Get Customer Info From PO Sheet:
- Set Spreadsheet ID
- Confirm column names
- Make sure each employee email row has:
- Customer Account Number
- PO Number
- Item
- Folder Name
- Invoice range
- Due Date Calculation
3. Drive and Gmail
- Confirm Client Invoices root folder exists
- Confirm Gmail Trigger:
- Query string
- Poll schedule
4. Test
- Send a sample timesheet email
- Run the workflow once manually
- Check:
- Folder structure
- Created or reused sheet
- Invoice row content
5. Activate
- Turn workflow ON once tests are successful.
How To Customize
- Swap the OpenAI model in Extract Timesheet Data.
- Change prompt to extract extra fields such as project, cost center, or approval status.
- Replace OCR endpoint with another service if needed.
- Change folder naming rules in Set and Create folder nodes.
- Adjust file naming rules for different billing periods.
- Add validation steps to handle:
- Missing name
- Zero hours
- Invalid dates
- Extend the PO sheet and invoice sheet with:
- Hourly rate
- Currency
- Tax codes
Use Case Examples
- Weekly consulting invoices from signed timesheets.
- Contractor billing for staffing agencies.
- Internal cross charging between departments using timesheet reports.
- Creating a clean, auditable history of timesheets and related invoice lines.
Troubleshooting Guide
| Issue | Possible Solution | |-------|-------------------| | No rows are created | Check Gmail Trigger is active and the filter matches the email. Confirm email is unread and has attachments. | | OCR returns empty or error | Check OCR URL, status code, and supported file types. Log the response body. | | Wrong or missing dates or hours | Review OpenAI prompt and a sample output. Ensure JSON keys in Set Timesheet JSON Fields match the AI output. | | Folders not found or created | Confirm the Client Invoices root exists and that Client Name and Folder Name text matches what the workflow expects. | | Files in wrong year folder | Check Current Year extraction and Year Folder search logic. | | Duplicate sheets for same period | Check file naming code and Drive search nodes for exact match on names. | | Due Date incorrect | Confirm Due Date Calculation in PO sheet and date math formats in Set and append nodes. |
Need Help or More Workflows?
Want to customize this workflow for your business or integrate it with your existing tools?
Our team at Digital Biz Tech can tailor it precisely to your use case from automation logic to AI-powered enhancements.
We can help you set it up for free — from connecting credentials to deploying it live.
Contact: shilpa.raju@digitalbiz.tech
Website: https://www.digitalbiz.tech
LinkedIn: https://www.linkedin.com/company/digital-biz-tech/
You can also DM us on LinkedIn for any help.
Automate Timesheet to Invoice Conversion with OpenAI, Gmail & Google Workspace
This n8n workflow automates the process of converting timesheet data into invoices, leveraging AI for data extraction and Google Workspace for data management and communication. It listens for new timesheet entries, processes them using OpenAI, and then updates a Google Sheet and potentially generates an invoice document.
What it does
This workflow performs the following key steps:
- Triggers on new timesheet entries: It continuously monitors a specified Gmail account for new emails containing timesheet data.
- Extracts data with OpenAI: The content of the timesheet email is sent to OpenAI for intelligent extraction of relevant data points (e.g., client name, hours worked, rates).
- Filters for valid data: It checks if the extracted data from OpenAI is valid and complete.
- Updates Google Sheet: If the data is valid, it adds a new row to a designated Google Sheet with the extracted timesheet information.
- Generates Invoice (Conditional): If the data is not valid, it logs the issue (though the specific logging action isn't fully defined in the provided JSON, it's implied by the "If" node's false branch).
- Prepares for Invoice Generation: It prepares the extracted data for potential invoice generation by setting necessary fields.
- Creates Google Drive Document: It creates a new document in Google Drive, likely based on a template, to serve as the invoice.
- Merges Data: It merges the extracted timesheet data with the newly created Google Drive document.
- Sends Invoice (Implied): While not explicitly shown as a "send email" node, the creation of an invoice document often implies a subsequent step to send it to the client.
Prerequisites/Requirements
To use this workflow, you will need:
- n8n Instance: A running n8n instance.
- Gmail Account: A Gmail account configured as a trigger to monitor for timesheet emails.
- OpenAI API Key: An OpenAI API key with access to the models used for data extraction.
- Google Sheets Account: A Google Sheets account with a designated spreadsheet for storing timesheet data.
- Google Drive Account: A Google Drive account for creating and managing invoice documents.
Setup/Usage
- Import the workflow: Download the provided JSON and import it into your n8n instance.
- Configure Credentials:
- Gmail Trigger: Set up your Google OAuth2 credentials for the Gmail Trigger node. Ensure it has permission to read emails.
- OpenAI: Configure your OpenAI API Key credential in the OpenAI node.
- Google Sheets: Set up your Google OAuth2 credentials for the Google Sheets node. Ensure it has permission to write to your designated spreadsheet.
- Google Drive: Set up your Google OAuth2 credentials for the Google Drive node. Ensure it has permission to create and manage documents.
- Customize Nodes:
- Gmail Trigger (824): Specify the mailbox, search query, or label to identify incoming timesheet emails.
- OpenAI (1250): Adjust the prompt to accurately extract client name, hours, rates, and any other relevant invoice details from your timesheet email format.
- Google Sheets (18): Configure the spreadsheet ID and sheet name where timesheet data should be added. Map the extracted data from OpenAI to the correct columns in your sheet.
- Google Drive (58): Specify the folder where invoices should be created and potentially the ID of an invoice template document if you're using one.
- Code (834): Review and adjust the JavaScript code if you need to modify the data structure or perform custom logic before updating Google Sheets or creating the invoice.
- Edit Fields (38): Adjust the fields being set or modified to match your invoice generation requirements.
- Activate the workflow: Once configured, activate the workflow to start monitoring for new timesheet emails and automating the invoice conversion process.
Related Templates
Track competitor SEO keywords with Decodo + GPT-4.1-mini + Google Sheets
This workflow automates competitor keyword research using OpenAI LLM and Decodo for intelligent web scraping. Who this is for SEO specialists, content strategists, and growth marketers who want to automate keyword research and competitive intelligence. Marketing analysts managing multiple clients or websites who need consistent SEO tracking without manual data pulls. Agencies or automation engineers using Google Sheets as an SEO data dashboard for keyword monitoring and reporting. What problem this workflow solves Tracking competitor keywords manually is slow and inconsistent. Most SEO tools provide limited API access or lack contextual keyword analysis. This workflow solves that by: Automatically scraping any competitor’s webpage with Decodo. Using OpenAI GPT-4.1-mini to interpret keyword intent, density, and semantic focus. Storing structured keyword insights directly in Google Sheets for ongoing tracking and trend analysis. What this workflow does Trigger — Manually start the workflow or schedule it to run periodically. Input Setup — Define the website URL and target country (e.g., https://dev.to, france). Data Scraping (Decodo) — Fetch competitor web content and metadata. Keyword Analysis (OpenAI GPT-4.1-mini) Extract primary and secondary keywords. Identify focus topics and semantic entities. Generate a keyword density summary and SEO strength score. Recommend optimization and internal linking opportunities. Data Structuring — Clean and convert GPT output into JSON format. Data Storage (Google Sheets) — Append structured keyword data to a Google Sheet for long-term tracking. Setup Prerequisites If you are new to Decode, please signup on this link visit.decodo.com n8n account with workflow editor access Decodo API credentials OpenAI API key Google Sheets account connected via OAuth2 Make sure to install the Decodo Community node. Create a Google Sheet Add columns for: primarykeywords, seostrengthscore, keyworddensity_summary, etc. Share with your n8n Google account. Connect Credentials Add credentials for: Decodo API credentials - You need to register, login and obtain the Basic Authentication Token via Decodo Dashboard OpenAI API (for GPT-4o-mini) Google Sheets OAuth2 Configure Input Fields Edit the “Set Input Fields” node to set your target site and region. Run the Workflow Click Execute Workflow in n8n. View structured results in your connected Google Sheet. How to customize this workflow Track Multiple Competitors → Use a Google Sheet or CSV list of URLs; loop through them using the Split In Batches node. Add Language Detection → Add a Gemini or GPT node before keyword analysis to detect content language and adjust prompts. Enhance the SEO Report → Expand the GPT prompt to include backlink insights, metadata optimization, or readability checks. Integrate Visualization → Connect your Google Sheet to Looker Studio for SEO performance dashboards. Schedule Auto-Runs → Use the Cron Node to run weekly or monthly for competitor keyword refreshes. Summary This workflow automates competitor keyword research using: Decodo for intelligent web scraping OpenAI GPT-4.1-mini for keyword and SEO analysis Google Sheets for live tracking and reporting It’s a complete AI-powered SEO intelligence pipeline ideal for teams that want actionable insights on keyword gaps, optimization opportunities, and content focus trends, without relying on expensive SEO SaaS tools.
Generate song lyrics and music from text prompts using OpenAI and Fal.ai Minimax
Spark your creativity instantly in any chat—turn a simple prompt like "heartbreak ballad" into original, full-length lyrics and a professional AI-generated music track, all without leaving your conversation. 📋 What This Template Does This chat-triggered workflow harnesses AI to generate detailed, genre-matched song lyrics (at least 600 characters) from user messages, then queues them for music synthesis via Fal.ai's minimax-music model. It polls asynchronously until the track is ready, delivering lyrics and audio URL back in chat. Crafts original, structured lyrics with verses, choruses, and bridges using OpenAI Submits to Fal.ai for melody, instrumentation, and vocals aligned to the style Handles long-running generations with smart looping and status checks Returns complete song package (lyrics + audio link) for seamless sharing 🔧 Prerequisites n8n account (self-hosted or cloud with chat integration enabled) OpenAI account with API access for GPT models Fal.ai account for AI music generation 🔑 Required Credentials OpenAI API Setup Go to platform.openai.com → API keys (sidebar) Click "Create new secret key" → Name it (e.g., "n8n Songwriter") Copy the key and add to n8n as "OpenAI API" credential type Test by sending a simple chat completion request Fal.ai HTTP Header Auth Setup Sign up at fal.ai → Dashboard → API Keys Generate a new API key → Copy it In n8n, create "HTTP Header Auth" credential: Name="Fal.ai", Header Name="Authorization", Header Value="Key [Your API Key]" Test with a simple GET to their queue endpoint (e.g., /status) ⚙️ Configuration Steps Import the workflow JSON into your n8n instance Assign OpenAI API credentials to the "OpenAI Chat Model" node Assign Fal.ai HTTP Header Auth to the "Generate Music Track", "Check Generation Status", and "Fetch Final Result" nodes Activate the workflow—chat trigger will appear in your n8n chat interface Test by messaging: "Create an upbeat pop song about road trips" 🎯 Use Cases Content Creators: YouTubers generating custom jingles for videos on the fly, streamlining production from idea to audio export Educators: Music teachers using chat prompts to create era-specific folk tunes for classroom discussions, fostering interactive learning Gift Personalization: Friends crafting anniversary R&B tracks from shared memories via quick chats, delivering emotional audio surprises Artist Brainstorming: Songwriters prototyping hip-hop beats in real-time during sessions, accelerating collaboration and iteration ⚠️ Troubleshooting Invalid JSON from AI Agent: Ensure the system prompt stresses valid JSON; test the agent standalone with a sample query Music Generation Fails (401/403): Verify Fal.ai API key has minimax-music access; check usage quotas in dashboard Status Polling Loops Indefinitely: Bump wait time to 45-60s for complex tracks; inspect fal.ai queue logs for bottlenecks Lyrics Under 600 Characters: Tweak agent prompt to enforce fuller structures like [V1][C][V2][B][C]; verify output length in executions
Automate Dutch Public Procurement Data Collection with TenderNed
TenderNed Public Procurement What This Workflow Does This workflow automates the collection of public procurement data from TenderNed (the official Dutch tender platform). It: Fetches the latest tender publications from the TenderNed API Retrieves detailed information in both XML and JSON formats for each tender Parses and extracts key information like organization names, titles, descriptions, and reference numbers Filters results based on your custom criteria Stores the data in a database for easy querying and analysis Setup Instructions This template comes with sticky notes providing step-by-step instructions in Dutch and various query options you can customize. Prerequisites TenderNed API Access - Register at TenderNed for API credentials Configuration Steps Set up TenderNed credentials: Add HTTP Basic Auth credentials with your TenderNed API username and password Apply these credentials to the three HTTP Request nodes: "Tenderned Publicaties" "Haal XML Details" "Haal JSON Details" Customize filters: Modify the "Filter op ..." node to match your specific requirements Examples: specific organizations, contract values, regions, etc. How It Works Step 1: Trigger The workflow can be triggered either manually for testing or automatically on a daily schedule. Step 2: Fetch Publications Makes an API call to TenderNed to retrieve a list of recent publications (up to 100 per request). Step 3: Process & Split Extracts the tender array from the response and splits it into individual items for processing. Step 4: Fetch Details For each tender, the workflow makes two parallel API calls: XML endpoint - Retrieves the complete tender documentation in XML format JSON endpoint - Fetches metadata including reference numbers and keywords Step 5: Parse & Merge Parses the XML data and merges it with the JSON metadata and batch information into a single data structure. Step 6: Extract Fields Maps the raw API data to clean, structured fields including: Publication ID and date Organization name Tender title and description Reference numbers (kenmerk, TED number) Step 7: Filter Applies your custom filter criteria to focus on relevant tenders only. Step 8: Store Inserts the processed data into your database for storage and future analysis. Customization Tips Modify API Parameters In the "Tenderned Publicaties" node, you can adjust: offset: Starting position for pagination size: Number of results per request (max 100) Add query parameters for date ranges, status filters, etc. Add More Fields Extend the "Splits Alle Velden" node to extract additional fields from the XML/JSON data, such as: Contract value estimates Deadline dates CPV codes (procurement classification) Contact information Integrate Notifications Add a Slack, Email, or Discord node after the filter to get notified about new matching tenders. Incremental Updates Modify the workflow to only fetch new tenders by: Storing the last execution timestamp Adding date filters to the API query Only processing publications newer than the last run Troubleshooting No data returned? Verify your TenderNed API credentials are correct Check that you have setup youre filter proper Need help setting this up or interested in a complete tender analysis solution? Get in touch 🔗 LinkedIn – Wessel Bulte