Back to Templates
Try on any outfit virtually - right inside Telegram. A user sends a person photo, then a garment photo (captioned garment), and the bot replies with an AI-generated try-on result image using a dedicated Virtual Try-On API. No app. No frontend. Just a Telegram chat.
chat_id + file_id to Google Sheets as session stategarment) → looks up the saved person photo, resolves both Telegram file URLs, downloads both images, and submits a try-on job to the APIcompleted or failed| Service | Purpose | Where to Get It |
|---|---|---|
| Telegram Bot Token | Receive messages & send results | Create a bot via @BotFather on Telegram → /newbot |
| Virtual Try-On API Key | Submit and poll try-on jobs | Sign up at your Try-On API provider (e.g. try-on api or your own deployment) |
| Google Sheets OAuth2 | Store per-user session state between messages | Connect via n8n's built-in Google Sheets OAuth2 credential |
💡 Why Google Sheets for state? Each Telegram message triggers a separate workflow execution - there's no shared memory between runs. Google Sheets acts as a lightweight session store using
chat_idas the unique key.
/newbot, follow the prompts, copy your Bot TokenbotTokentryon-statechat_id and person_file_iddocs.google.com/spreadsheets/d/**{THIS_PART}**/edit)sheetIdtryonApiKey in the ⚙️ Config nodetryonApiBasePOST /api/v1/tryon with multipart/form-data fields person_images and garment_images, and returns { jobId, statusUrl } - adjust the Submit Try-On Job and Check Job Status nodes if your provider's schema differsThe Try-On API is asynchronous - submitting a job returns a jobId, not the result immediately. The workflow:
jobIdGET /api/v1/tryon/status/{jobId}status === "completed" → downloads and sends the result imagestatus === "failed" → sends an error message to the userTypical total wait: 15–60 seconds depending on the API and queue load.
garment to anything you like (e.g. outfit, try, wear)top, dress, jacket and pass them as an extra field to your Try-On API if supportedchat_id has remaining credits| Node | Role |
|---|---|
| Telegram Trigger | Listens for incoming messages |
| Extract Message Info | Pulls out chat_id, caption, hasPhoto, fileId |
| ⚙️ Config | Single place for all configurable values — edit this first |
| Has Photo? | Routes messages that contain a photo |
| Is Garment Photo? | Checks if caption equals garment |
| Save Person to Sheet | Stores person file_id keyed by chat_id |
| Lookup Person from Sheet | Retrieves saved person photo when garment arrives |
| Has Person Saved? | Guards against out-of-order photos |
| Collect IDs | Bundles all required IDs for downstream nodes |
| Get Person/Garment File Path | Resolves Telegram file_id → file_path via getFile API |
| Download Person/Garment Image | Downloads actual image binary from Telegram CDN |
| Submit Try-On Job | POSTs both images to the Try-On API |
| Wait 15 Seconds | Gives the API time before first status check |
| Check Job Status | Polls job status endpoint |
| Is Job Complete? / Is Job Failed? | Routes to success or error path |
| HTTP Request (result download) | Downloads the result image as binary |
| Send Result Photo | Sends the AI try-on image back to the user |
| Delete Row from Sheet | Cleans up session state after successful result |
chat_id as the matching key, so a user can retake their person photo any time and it will overwrite the old entrySubmit Try-On Job and Merge State nodes for local testing — remove or disable these pins before going live