AutomationFlowsSocial Media › Transform Selfies Into Professional Linkedin Headshots with Nano Banana Pro…

Transform Selfies Into Professional Linkedin Headshots with Nano Banana Pro…

Original n8n title: Transform Selfies Into Professional Linkedin Headshots with Nano Banana Pro & Telegram

ByDavide Boizza @n3witalia on n8n.io

This workflow automates the process of transforming user-submitted photos (also bad selfie) into professional CV and LinkedIn headshots using the Nano Banana Pro AI model.

Event trigger★★★★☆ complexity25 nodesHTTP RequestGoogle DriveTelegram TriggerFtpTelegram
Social Media Trigger: Event Nodes: 25 Complexity: ★★★★☆ Added:

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

This workflow follows the Google Drive → HTTP Request 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": "5hfFl5hd5PWmOln1",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "LinkedIn Profile Photo Maker from Selfie",
  "tags": [],
  "nodes": [
    {
      "id": "ba7a3cf4-0ec8-4758-8609-1cc3acf83887",
      "name": "Get File image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1104,
        2080
      ],
      "parameters": {
        "url": "={{ $json.images[0].url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "e18fac8c-37eb-4439-b5a9-7899bf82376d",
      "name": "Get Url image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        784,
        2080
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/nano-banana-pro/requests/{{ $json.request_id }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "75c8a50d-4cc2-486d-9101-36597a2f1fb4",
      "name": "Get status",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1264,
        1648
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/nano-banana-pro/requests/{{ $('Create Image').item.json.request_id }}/status ",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "91f0d99d-9c7d-4118-b992-3f1e27edcd4d",
      "name": "Wait 60 sec.",
      "type": "n8n-nodes-base.wait",
      "position": [
        1040,
        1648
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "dc1729f6-1e25-496c-a7fd-bb3c381c9028",
      "name": "Completed?",
      "type": "n8n-nodes-base.if",
      "position": [
        1472,
        1648
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "383d112e-2cc6-4dd4-8985-f09ce0bd1781",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "COMPLETED"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a41efc49-91f0-45fd-b6d3-d0a788276c9e",
      "name": "Upload Image",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1472,
        1968
      ],
      "parameters": {
        "name": "={{ $now.format('yyyyLLddHHmmss') }}-{{ $json.images[0].file_name }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1aHRwLWyrqfzoVC8HoB-YMrBvQ4tLC-NZ",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1aHRwLWyrqfzoVC8HoB-YMrBvQ4tLC-NZ",
          "cachedResultName": "Fal.run"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "3ca81db6-9657-4b34-8333-7919f4a9c905",
      "name": "Create Image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        752,
        1648
      ],
      "parameters": {
        "url": "https://queue.fal.run/fal-ai/nano-banana-pro/edit",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n     \"prompt\": \"Transform this photo into a professional LinkedIn headshot. Keep my face realistic and recognizable. Frame me in a 3/4 angle from the shoulders up, with an open, confident posture and a friendly, professional expression (slight smile).Enhance the lighting to soft, even studio-style illumination. Use a clean, neutral, blurred background in professional tones such as light gray, blue, or beige, with no distractions. Improve sharpness, skin tone, and contrast in a natural way. Maintain clean, professional clothing: blazer or shirt, solid colors, no logos.Overall style: modern, credible, suitable for a LinkedIn profile photo.\",\n     \"image_urls\": [\n       \"{{ $json.image }}\"\n     ],\n  \"resolution\": \"1K\",\n  \"num_images\": 1,\n  \"aspect_ratio\": \"auto\",\n  \"output_format\": \"png\"\n   }",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "6d84d1b0-fe98-4eb9-ad70-d618a4b44f3e",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        736,
        1376
      ],
      "parameters": {
        "color": 7,
        "width": 932,
        "height": 492,
        "content": "## STEP 3 - GET NANO BANANO PRO API KEY (YOURAPIKEY)\nCreate an account [here](https://fal.ai/) and obtain API KEY.\nIn the node \"Create Image\" set \"Header Auth\" and set:\n- Name: \"Authorization\"\n- Value: \"Key YOURAPIKEY\""
      },
      "typeVersion": 1
    },
    {
      "id": "2832cb68-9243-4780-ae93-f4d3dbc5c2f9",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        1376
      ],
      "parameters": {
        "color": 7,
        "width": 1012,
        "height": 540,
        "content": "## STEP 2 - Ftp Params for upload image\n- Set Server Path (eg. /public_html/images/ )\n- Set Base url (eg. https://website.com/images/ )\n\n#### Alternatively, if you don't want to use Telegram or don't have FTP space available, you can use the manual trigger and directly insert the image URL into the \"Fix Image Url\" node."
      },
      "typeVersion": 1
    },
    {
      "id": "4abfc458-b8e6-4497-b152-0a3ec464b670",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -1344,
        1600
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "368a6135-75fe-4e80-866f-f807858019d7",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        -704,
        1584
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Text",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.text}}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Audio",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "7b2cb4dc-dd9d-43b2-b4db-f0de858f46cc",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.voice.file_id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Immagine",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "98d80a35-3004-4bad-95b8-e87fc9270083",
                    "operator": {
                      "type": "object",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.photo[0] }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "executeOnce": false,
      "typeVersion": 3.2,
      "alwaysOutputData": false
    },
    {
      "id": "fbcca9c1-e735-4203-8d98-ae51571c2b23",
      "name": "Upload to FTP",
      "type": "n8n-nodes-base.ftp",
      "position": [
        304,
        1728
      ],
      "parameters": {
        "path": "={{ $json.ftp_path }}{{ $json.result.file_path.split('/').last() }}",
        "operation": "upload"
      },
      "credentials": {
        "ftp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "346a9da5-7ff5-40b2-a4f9-9ccde84773ce",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        96,
        1728
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "cd1fbd89-5aa1-4b34-8f95-0a564c096491",
      "name": "Upload to FTP1",
      "type": "n8n-nodes-base.ftp",
      "position": [
        1472,
        2192
      ],
      "parameters": {
        "path": "={{ $('Set FTP params').item.json.ftp_path}}{{ $now.format('yyyyLLddHHmmss') }}-{{ $json.images[0].file_name }}",
        "operation": "upload"
      },
      "credentials": {
        "ftp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0b5802e5-1add-49c5-953f-9bf51231c127",
      "name": "Sanitaze",
      "type": "n8n-nodes-base.code",
      "position": [
        -1024,
        1600
      ],
      "parameters": {
        "jsCode": "if ($input.first().json.message.from.id !== 11111) { // Replace with your Telegram user ID\n    return { unauthorized: true };\n} else {\n    // Return the original data when authorized\n    return $input.all();\n}\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c3ff62aa-9129-4b2b-a93e-931209f40a1e",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        1488
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 256,
        "content": "## STEP 1 - Sanitaze\nReplace XXXX with your Telegram user ID"
      },
      "typeVersion": 1
    },
    {
      "id": "b6d6b43d-5d6c-4e2d-8ae9-2de23fb70c47",
      "name": "Get Image",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -448,
        1744
      ],
      "parameters": {
        "fileId": "={{ $json.message.photo[2].file_id }}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f69aa589-50ae-425f-bebc-8fca7fe9fc93",
      "name": "Set FTP params",
      "type": "n8n-nodes-base.set",
      "position": [
        -208,
        1584
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "99ece922-60f4-45fd-939d-41e1ccb7ba7a",
              "name": "ftp_path",
              "type": "string",
              "value": "XXX"
            },
            {
              "id": "72b43d6c-3146-4dee-b89b-252589cd1ca3",
              "name": "base_url",
              "type": "string",
              "value": "XXX"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fdec147b-5a07-48d2-9f5a-893cccae42ec",
      "name": "FTP Image URL",
      "type": "n8n-nodes-base.set",
      "position": [
        496,
        1728
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c713d31f-9abd-496a-ac79-e8e2efe60aa0",
              "name": "image",
              "type": "string",
              "value": "={{ $json.base_url }}{{ $json.result.file_path.split('/').last() }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8af63b2f-9cc6-41fd-ac9b-1fbfccbdd212",
      "name": "Fix Image Url",
      "type": "n8n-nodes-base.set",
      "position": [
        496,
        1552
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c713d31f-9abd-496a-ac79-e8e2efe60aa0",
              "name": "image",
              "type": "string",
              "value": "=https://YOUR_IMAGE_URL"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ae86ac7e-6945-4c48-8f91-cb3fad77f9be",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        288,
        1552
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "d63d34eb-4614-4acd-91bd-f45e335cb1b6",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        736,
        1904
      ],
      "parameters": {
        "color": 7,
        "width": 932,
        "height": 476,
        "content": "## STEP 4 - GET NEW IMAGE\nGet your CV / Linkedin image and upload it on Google Drive or your FTP Space"
      },
      "typeVersion": 1
    },
    {
      "id": "33fc7922-bbab-465f-ac93-15ed56eb92fc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        592
      ],
      "parameters": {
        "width": 944,
        "height": 736,
        "content": "## LinkedIn Profile Photo Maker from Selfie with AI Nano Banana Pro and Telegram\n\nThis workflow automates the process of transforming user-submitted photos (also bad **selfie**) into professional **CV and LinkedIn headshots** using the **Nano Banana Pro** AI model. \n\nThe workflow supports two input methods:\n1. **Telegram Trigger Path**: Users can send photos via Telegram, which are then processed through FTP upload and transformed into professional headshots.\n2. **Manual Trigger Path**: Users can manually trigger the workflow with an image URL, bypassing the Telegram/FTP steps for direct processing.\n\n### **How it works:**\n\nThis workflow automates the transformation of user-submitted photos into professional CV and LinkedIn headshots using the **Nano Banana Pro** AI model from Fal.ai. It supports two input modes\u2014 **Telegram** (photo sent directly by user) and **manual trigger** (with image URL). The system sends the image to Fal.ai\u2019s API with predefined prompts for professional enhancement, then continuously polls the API until the result is ready. Once the AI finishes processing, the generated headshot is automatically downloaded, uploaded to both **Google Drive** and **FTP**, and validated for successful completion before the workflow ends.\n\n\n### **Setup steps:**\n\n1. **Authorization:** Insert your Telegram user ID in the \"Sanitaze\" node and configure API credentials - Fal.ai API key, Google Drive, and FTP access.\n2. **Storage:** Set FTP parameters (`ftp_path` and `base_url`) and Google Drive folder ID for output destinations.\n3. **Input options:** Enable Telegram bot integration or configure the manual trigger via image URL.\n4. **API configuration:** Verify Fal.ai API endpoints in HTTP nodes for image creation, status checks, and result retrieval.\n5. **File naming:** The workflow auto-generates timestamped filenames in PNG (1K resolution) for consistent, organized storage.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "523c4091-d33c-4fd4-b486-b9e893d97b97",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        592
      ],
      "parameters": {
        "color": 3,
        "width": 464,
        "height": 736,
        "content": "## From selfie\n![image](https://n3wstorage.b-cdn.net/n3witalia/selfie.jpg)"
      },
      "typeVersion": 1
    },
    {
      "id": "3369c0ff-02a9-4a37-8466-cfc7f71736f9",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1184,
        592
      ],
      "parameters": {
        "color": 6,
        "width": 464,
        "height": 736,
        "content": "## To Linkedin Headshot\n![image](https://n3wstorage.b-cdn.net/n3witalia/cv_top.jpg)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "0736dd9d-88fa-4002-80ed-1573c000b57f",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Upload to FTP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [],
        [],
        [
          {
            "node": "Get Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sanitaze": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Image": {
      "main": [
        [
          {
            "node": "Set FTP params",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Completed?": {
      "main": [
        [
          {
            "node": "Get Url image",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 60 sec.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get status": {
      "main": [
        [
          {
            "node": "Completed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Image": {
      "main": [
        [
          {
            "node": "Wait 60 sec.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Image": {
      "main": [
        []
      ]
    },
    "Wait 60 sec.": {
      "main": [
        [
          {
            "node": "Get status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FTP Image URL": {
      "main": [
        [
          {
            "node": "Create Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Url image": {
      "main": [
        [
          {
            "node": "Get File image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload to FTP": {
      "main": [
        [
          {
            "node": "FTP Image URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get File image": {
      "main": [
        [
          {
            "node": "Upload Image",
            "type": "main",
            "index": 0
          },
          {
            "node": "Upload to FTP1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set FTP params": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Sanitaze",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Fix Image Url",
            "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

This workflow automates the process of transforming user-submitted photos (also bad selfie) into professional CV and LinkedIn headshots using the Nano Banana Pro AI model.

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

More Social Media workflows → · Browse all categories →

Related workflows

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

Social Media

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI +8
Social Media

This n8n workflow automatically shares content from a Telegram Channel to multiple platforms like WordPress, Facebook, X/Twitter, and LinkedIn. It uses a Switch node to detect the type of content—text

Telegram Trigger, Telegram, WordPress +5
Social Media

More workflow: https://aitool.wiki/

Google Sheets, Google Drive, Read Write File +3
Social Media

&gt; ⚠️ Disclaimer: This workflow uses Community Nodes and requires a self-hosted n8n instance.

HTTP Request, Telegram Trigger, Google Sheets +1
Social Media

Generate traffic and grow your audience effortlessly with this plug-and-play n8n automation template. Automatically fetch TikTok videos, upload them to YouTube Shorts, save logs to Google Sheets, and

HTTP Request, Google Sheets, Telegram +1