Telegram + Google Sheets: polished resume images
Your resume “content” might be solid, but the presentation turns into a time sink. You tweak spacing, fight templates, export the wrong file type, then someone asks for “just one more version” with a different look.
This Telegram resume images automation hits career coaches and resume writers hardest because you’re producing under deadline. Recruiting teams feel it too when candidates keep sending messy PDFs that need fixing before sharing.
This workflow takes a Telegram message or file and returns a polished resume image, using Google Sheets as the style memory. You’ll see how it works, what you need, and where the biggest time savings show up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram + Google Sheets: polished resume images
flowchart LR
subgraph sg0["User Sends Message to Bot Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Download Resume"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Notify User"]
n2@{ icon: "mdi:robot", form: "rounded", label: "Structured Output2", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini3", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Resume Writer", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output1", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini2", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Clear sheet", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n9@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini1", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Structured Output", pos: "b", h: 48 }
n11@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Validate user Input", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>User Sends Message to Bot"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check For Input Type", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Run Resume Workflow", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Splitting BrowserAct Items"]
n17@{ icon: "mdi:robot", form: "rounded", label: "Chatting With User", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "SVG To JPG", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Analyze Resume image", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Save Data", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Resume Visualization", pos: "b", h: 48 }
n22@{ icon: "mdi:robot", form: "rounded", label: "Generate Resume", pos: "b", h: 48 }
n23["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send Resume Back"]
n24@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Google Sheet Data", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Get Saved Resume", pos: "b", h: 48 }
n26["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Answer the User"]
n20 --> n8
n18 --> n19
n7 --> n16
n11 -.-> n10
n11 -.-> n12
n4 --> n21
n9 -.-> n17
n6 -.-> n5
n6 -.-> n4
n3 -.-> n2
n3 -.-> n21
n0 --> n18
n22 --> n23
n8 --> n25
n8 --> n0
n25 --> n24
n10 -.-> n12
n17 --> n26
n5 -.-> n4
n2 -.-> n21
n15 --> n7
n12 --> n14
n19 --> n20
n14 --> n15
n14 --> n1
n14 --> n17
n21 --> n22
n13 --> n12
n16 --> n8
n24 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n13 trigger
class n2,n4,n5,n10,n12,n17,n19,n21,n22 ai
class n3,n6,n9,n11 aiModel
class n14 decision
class n7,n20,n25 database
class n0 api
class n16 code
classDef customIcon fill:none,stroke:none
class n0,n1,n13,n16,n23,n26 customIcon
The Problem: Resume formatting and revisions eat your week
Resume work is weirdly repetitive. You collect details from a chat thread, a PDF, a Google Doc, maybe a screenshot. Then you do the “design part” again: align sections, pick a template, adjust spacing, export, send, and wait. The worst part is the back-and-forth because clients don’t ask for “better,” they ask for “more professional,” “more modern,” or “make it look like this example.” Each request forces you to rebuild layout decisions you already made last time.
It adds up fast, especially when you’re juggling multiple people at once.
- You end up recreating the same styles for every new resume because there’s no reusable “design memory.”
- Exporting and sending files becomes its own mini-project, and the wrong format (or a broken PDF) triggers another round of edits.
- Reference designs arrive as images or odd files, which means you either ignore them or spend time reverse-engineering the look.
- Manual workflows invite small mistakes, like outdated phone numbers, missing roles, or duplicated bullet points after a copy/paste pass.
The Solution: Telegram in, polished resume image out
This workflow turns Telegram into the front door for resume intake and delivery. A Telegram bot receives either plain text (someone pastes their resume details) or a file (PDF or an image reference). Google Gemini classifies what came in, then pulls context and structure so the details aren’t stuck as a messy blob. If there’s a reference design, the workflow standardizes it and has Gemini Vision “read” the style, capturing the layout as a reusable template. Google Sheets becomes your simple library for those templates, so the next resume can match a “Corporate” or “Creative” style on purpose.
From there, an AI agent maps the candidate’s content to the selected layout, another AI agent writes the image-generation prompt, and Gemini renders the final resume image. The workflow sends it back in Telegram quickly, so the request-and-deliver loop feels instant instead of days long.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you handle 5 resumes a week. Manually, it’s common to spend about 45 minutes formatting, then another 30 minutes on exports, tweaks, and “make it match this example” edits, so you’re at roughly 6 hours weekly. With this workflow, intake is a Telegram message (a couple minutes), style selection and rendering happen automatically, and you mostly review and request one adjustment if needed. Realistically, you can cut the process down to about 1 hour per week for touch-ups and final checks.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram to receive requests and deliver images
- Google Sheets for template storage and structured data
- Google Gemini API (get it from Google AI Studio / Google Cloud)
Skill level: Intermediate. You’ll connect accounts, map a few fields, and test with real Telegram messages and sample files.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A Telegram message triggers the run. The workflow starts when someone sends your bot resume text, a PDF, or a file link. If it’s not actually a resume request, it can reply normally instead of wasting compute.
The input gets classified and cleaned up. AI validation checks that the message contains enough resume detail to work with. If a file is provided, the workflow fetches it, reads the binary/PDF content, and converts formats when needed so downstream steps don’t choke.
Style is selected (or learned) via Google Sheets. If there’s a reference design image, the workflow converts it (for example SVG to JPG), then Gemini Vision inspects it and saves the layout traits into Google Sheets. If there’s no reference, the “Resume Blueprint Writer” agent picks a stored template based on industry and maps the candidate’s content into that layout.
Gemini renders the resume and Telegram delivers it. A “Visualizer” agent writes a detailed prompt from the blueprint, Gemini generates the final resume image, and the bot sends the result back to the same Telegram chat.
You can easily modify where the finished image goes (Telegram vs. Google Drive) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Telegram Trigger
This workflow starts when a user sends a Telegram message to your bot.
- Add and open Telegram Message Trigger.
- Credential Required: Connect your telegramApi credentials.
- Keep Updates set to
message. - Save the node so n8n registers the webhook.
Step 2: Validate and Route User Input
Classify the incoming text and route to resume processing or chat response.
- Open Validate Incoming Text and set Text to
{{ $json.message.text }}. - Ensure Has Output Parser is enabled in Validate Incoming Text.
- Open Structured Parse Base and keep Auto Fix enabled with the provided JSON schema.
- Confirm Gemini Chat Model is connected as the language model for Validate Incoming Text and that credentials are added to Gemini Chat Model, not the parser node.
- Configure Route Input Type rules to match
Resume,Chat, andNoDatausing{{ $json.output.Type }}.
Credential Required: Connect your googlePalmApi credentials to Gemini Chat Model.
Step 3: Configure Parallel Branching and User Responses
When input is routed, the workflow either runs a resume-generation branch or sends a conversational response.
- Note the parallel execution: Route Input Type outputs to both Execute BrowserAct Flow and Alert Telegram User in parallel.
- Open Alert Telegram User and set Text to
Ok, I will do it please give me a moment.. - Set Chat ID in Alert Telegram User to
{{ $('Telegram Message Trigger').item.json.message.chat.id }}. - Open Compose User Reply and set Text to
Input type : {{ $json.output.Type }} | User Input : {{ $('Telegram Message Trigger').item.json.message.text }}. - Connect Compose User Reply to Send Text Response for both
ChatandNoDataoutputs.
Credential Required: Connect your telegramApi credentials to Alert Telegram User and Send Text Response.
Credential Required: Connect your googlePalmApi credentials to Gemini Chat Model A, which powers Compose User Reply.
Step 4: Run BrowserAct and Prepare Template Data
Generate resume template data, wipe the sheet, and prepare batch processing for design templates.
- Open Execute BrowserAct Flow and set Type to
WORKFLOWand Workflow ID to your BrowserAct workflow ID (replace[YOUR_ID]). - Credential Required: Connect your browserActApi credentials to Execute BrowserAct Flow.
- Open Wipe Sheet Rows and keep Operation set to
clear. - Set Document ID to
=parameter.SpreadSheetID == <SpreadSheetID> Or Select From List. - Set Sheet Name to
parameter.SheetID == <SheetID> Or Select From List. - Open Split BrowserAct Items and keep the provided JS Code for splitting JSON strings.
- Connect Split BrowserAct Items to Batch Iterator to start batch handling.
Credential Required: Connect your googleSheetsOAuth2Api credentials to Wipe Sheet Rows.
$input.first().json.output.string. Ensure your BrowserAct flow outputs that path.Step 5: Analyze Resume Designs and Populate Google Sheets
Fetch and analyze template resumes, then store the visual descriptions in Google Sheets.
- Open Fetch Resume File and set URL to
{{ $json.Resume }}. - Open Convert SVG to JPG and set Output Format to
jpg. - Open Inspect Resume Image and keep Resource as
image, Input Type asbinary, and Operation asanalyze. - Open Append Sheet Data and map Resume Details to
{{ $json.content.parts[0].text }}. - Ensure Append Sheet Data uses Operation
appendwith the same Document ID and Sheet Name values as Wipe Sheet Rows. - Confirm the batch loop: Append Sheet Data → Batch Iterator → Retrieve Sheet Rows → Aggregate Sheet Records.
Credential Required: Connect your cloudConvertOAuth2Api credentials to Convert SVG to JPG.
Credential Required: Connect your googlePalmApi credentials to Inspect Resume Image.
Credential Required: Connect your googleSheetsOAuth2Api credentials to Append Sheet Data and Retrieve Sheet Rows.
Step 6: Generate the Resume Blueprint with AI
Use Gemini to select the best design and generate a structured blueprint based on user data.
- Open Aggregate Sheet Records and keep Aggregate set to
aggregateAllItemData. - Open Resume Blueprint Writer and set Text to
Template Examples : {{ $json.data[0]["Resume Details"] }}, User Resume : {{ $('Validate Incoming Text').first().json.output.Resume }}, Category : {{ $('Validate Incoming Text').first().json.output.Category }} you need to use user resume data for final ouput.. - Ensure Resume Blueprint Writer has Has Output Parser enabled.
- Open Structured Parse A and keep Auto Fix enabled with the blueprint JSON schema.
- Confirm Gemini Chat Model B is connected as the language model for Resume Blueprint Writer, and credentials are added to Gemini Chat Model B, not the parser node.
Credential Required: Connect your googlePalmApi credentials to Gemini Chat Model B.
Step 7: Create and Render the Final Resume Image
Turn the blueprint into an image prompt and render the final resume.
- Open Create Image Prompt and set Text to
{{ $json.output.Resume }}. - Ensure Create Image Prompt has Has Output Parser enabled and uses Structured Parse B with the image prompt schema.
- Confirm Gemini Chat Model C is connected as the language model for Create Image Prompt.
- Open Render Resume Image and set Prompt to
{{ $json.output.Image_Prompt }}. - Ensure Render Resume Image outputs binary data using the default Binary Property Output of
data.
Credential Required: Connect your googlePalmApi credentials to Gemini Chat Model C and Render Resume Image.
Step 8: Configure Output Delivery to Telegram
Send the rendered resume image or a text response back to the user.
- Open Send Resume Result and set Operation to
sendPhoto. - Set Binary Data to true so the image is sent from Render Resume Image.
- Set Chat ID to
{{ $('Telegram Message Trigger').first().json.message.chat.id }}. - Open Send Text Response and set Text to
{{ $json.output }}. - Set Chat ID in Send Text Response to
{{ $('Telegram Message Trigger').item.json.message.chat.id }}.
Credential Required: Connect your telegramApi credentials to Send Resume Result and Send Text Response.
Step 9: Test & Activate
Validate the end-to-end flow, then activate the workflow for production use.
- Click Execute Workflow and send a Telegram message with a resume request.
- Confirm that Alert Telegram User responds immediately while Execute BrowserAct Flow runs in parallel.
- Verify that Send Resume Result delivers an image when input type is
Resumeand Send Text Response delivers a message forChatorNoData. - Check the Google Sheet to ensure Append Sheet Data has added rows and Retrieve Sheet Rows can read them.
- Once the test passes, toggle the workflow Active to enable production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential status and the spreadsheet sharing settings first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Telegram bot delivery can fail if the generated image is too large or the chat ID changes. If messages stop arriving, confirm the bot still has access to the chat and review the Telegram node error output.
Frequently Asked Questions
About an hour if your accounts are already created.
No. You’ll mainly connect credentials and paste in prompts/settings for the AI agents.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Google Gemini API usage costs, which vary by model and image generation volume.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s a common tweak. Replace the “Send Resume Result” Telegram step with a Google Drive upload so the image is stored automatically, then optionally send the Drive link back in Telegram. You can also export to PDF/PNG by adding a conversion step after rendering. If you want the style library shared across teammates, keep Google Sheets as the template store and just change the final destination.
Usually it’s the bot token or chat permissions. Confirm the Telegram Bot Token in n8n is correct, then verify the bot is actually in the chat (or that you’re messaging it directly) and hasn’t been blocked. If you recently recreated the bot, the old token will still “look valid” but won’t work. Also check the Telegram node error output in the execution log because it will often show a clear “chat not found” or “forbidden” message.
If you self-host n8n, there’s no fixed execution limit, so capacity mainly depends on your server and how fast Gemini renders images. On n8n Cloud, the practical limit is your monthly execution allowance on your plan, plus API rate limits from Gemini and any file conversion service. For many small teams, processing a few dozen resumes a day is realistic as long as you queue batches and don’t try to render everything at once.
Often, yes, because this kind of flow needs branching, file handling, and multi-step AI prompting that gets clumsy (and expensive) in simpler automation tools. n8n is also easier to self-host, which matters if you’re running lots of resume requests. Zapier or Make can still work if you only want a basic “Telegram in, image out” pipeline with minimal logic. If you’re unsure, Talk to an automation expert and we’ll map the cheapest setup that still feels reliable.
Once this is running, the workflow handles the repetitive formatting loop and your “resume delivery” becomes a simple Telegram conversation. Set it up, save your styles in Sheets, and stop rebuilding the same layouts from scratch.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.