This workflow corresponds to n8n.io template #17288 — we link there as the canonical source.
This workflow follows the Error 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 →
{
"id": "mjJEFjM9kKmynezP",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AI Rental Application & Tenant Screening Assistant",
"tags": [],
"nodes": [
{
"id": "ce02cbf2-064d-48c6-8455-976c0c18929b",
"name": "Slack \u2013 Post Workflow Error Alert",
"type": "n8n-nodes-base.slack",
"position": [
-1456,
6128
],
"parameters": {
"text": "=\ud83d\udea8 *RentalOS Workflow Error*\n\n*Workflow:* {{ $workflow.name }}\n*Failed Node:* {{ $execution.lastNodeExecuted }}\n*Time:* {{ $now.format('MMM D, YYYY \u2013 HH:mm') }}\n*Execution ID:* {{ $execution.id }}\n\nPlease check the n8n execution log and follow up with the applicant manually if needed.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_SLACK_CHANNEL_ID",
"cachedResultName": "your-alerts-channel"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"typeVersion": 2.3
},
{
"id": "20f3c352-d12e-4078-90ec-5750fd3a6fde",
"name": "On Workflow Error",
"type": "n8n-nodes-base.errorTrigger",
"position": [
-1712,
6128
],
"parameters": {},
"typeVersion": 1
},
{
"id": "98723854-3bb7-4a13-8472-51a5ea45fdf9",
"name": "Notify Landlord - New Ranked Applicant (Active)",
"type": "n8n-nodes-base.telegram",
"position": [
320,
4896
],
"parameters": {
"text": "=New screened applicant: {{ $('Parse Scoring Output (Active)').item.json.applicantName }}\nScore: {{ $('Parse Scoring Output (Active)').item.json.score }}/100\nRecommendation: {{ $('Parse Scoring Output (Active)').item.json.recommendation }}\nRed flags: {{ $json.red_flags || 'None' }}\nSummary: {{ $('Parse Scoring Output (Active)').item.json.summary }}",
"chatId": "YOUR_LANDLORD_CHAT_ID",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2999c0fd-ee1d-497e-83e7-f78966e84c8e",
"name": "Confirm Receipt to Applicant (Active)",
"type": "n8n-nodes-base.telegram",
"position": [
512,
5584
],
"parameters": {
"text": "Thanks! Your rental application has been received and is now being reviewed. We'll be in touch shortly.",
"chatId": "={{ $('Extract Message Data (Active)').first().json.chatId }}",
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "50b49a88-0634-4ba4-b3ef-dfd02f09045f",
"name": "Update Reference Response in Sheet (Active)",
"type": "n8n-nodes-base.googleSheets",
"position": [
1440,
6192
],
"parameters": {
"columns": {
"value": {
"Status": "Reference Received",
"row_number": 0,
"ReferenceResponse": "={{ JSON.stringify($json) }}",
"PreviousLandlordEmail": "={{ $json.fromEmail }}"
},
"schema": [
{
"id": "PreviousLandlordEmail",
"type": "string",
"display": true,
"required": false,
"displayName": "PreviousLandlordEmail",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ReferenceResponse",
"type": "string",
"display": true,
"required": false,
"displayName": "ReferenceResponse",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"PreviousLandlordEmail"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "applications-sheet-template"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "4298cbdc-cf41-49e1-b379-66ae14ae55b3",
"name": "Parse Reference Output (Active)",
"type": "n8n-nodes-base.code",
"position": [
1232,
6192
],
"parameters": {
"jsCode": "let parsed = {};\ntry {\n const raw = $input.first().json.message?.content || $input.first().json.text || '';\n const cleaned = raw.replace(/```json|```/g, '').trim();\n parsed = JSON.parse(cleaned);\n} catch (e) {\n parsed = { parse_error: true };\n}\nreturn [{ json: { ...parsed, fromEmail: $('Parse Scoring Output (Active)').item.json.previous_landlord_email } }];"
},
"typeVersion": 2
},
{
"id": "0a95792a-5ddf-4422-af2c-8a51279aa39f",
"name": "Extract Reference Answers (Active AI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
896,
6192
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {
"maxTokens": 300,
"temperature": 0.2
},
"messages": {
"values": [
{
"role": "system",
"content": "Extract reference-check answers from this text. Return ONLY valid JSON, no markdown, with: tenancy_dates, rent_paid_on_time (true/false/unclear), damages_or_disputes, would_rent_again (true/false/unclear), notes."
},
{
"content": "={{ $json.data.text || 'No response received' }}"
}
]
}
},
"typeVersion": 1.4
},
{
"id": "df75007e-b08a-4756-af3b-f5e96d148506",
"name": "Send Reference Check Email (Active)",
"type": "n8n-nodes-base.gmail",
"position": [
672,
6192
],
"parameters": {
"sendTo": "={{ $('Parse Scoring Output (Active)').item.json.previous_landlord_email }}",
"message": "=Hello {{ $('Parse Scoring Output (Active)').item.json.previous_landlord_name }},\n\n{{ $('Parse Scoring Output (Active)').item.json.full_name }} has listed you as a previous landlord on a rental application and given us permission to contact you. Please click the link below and reply in your own words to:\n\n1. What were the tenancy dates?\n2. Was rent paid on time consistently?\n3. Were there any damages or disputes?\n4. Would you rent to this tenant again?\n\nThank you for your time.",
"options": {},
"subject": "=Reference request for {{ $('Parse Scoring Output (Active)').item.json.applicantName }}",
"operation": "sendAndWait",
"responseType": "freeText"
},
"typeVersion": 2.1
},
{
"id": "db1892b5-fbde-4e50-a46d-97a2f6210ac4",
"name": "Has Previous Landlord Email? (Active)",
"type": "n8n-nodes-base.if",
"position": [
400,
6208
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c1",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $('Parse Scoring Output (Active)').item.json.previous_landlord_email }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c9d0cc47-e42d-4f80-a222-18b37dd35c6a",
"name": "Update Application Score (Active)",
"type": "n8n-nodes-base.googleSheets",
"position": [
80,
5584
],
"parameters": {
"columns": {
"value": {
"Score": "={{ $json.score }}",
"Status": "Screened",
"Summary": "={{ $json.summary }}",
"RedFlags": "={{ $json.red_flags }}",
"row_number": 0,
"Recommendation": "={{ $json.recommendation }}",
"ApplicantChatId": "={{ $json.chatId }}",
"CreditCheckStatus": "Checked"
},
"mappingMode": "defineBelow",
"matchingColumns": [
"ApplicantChatId"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "applications-sheet-template"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "a1e1f1f9-6cf6-4fea-be48-2a5696623418",
"name": "Parse Scoring Output (Active)",
"type": "n8n-nodes-base.code",
"position": [
-144,
5584
],
"parameters": {
"jsCode": "const applicant = $('Parse AI Output (Active)').first().json;\nlet parsed = {};\ntry {\n const raw = $input.first().json.message?.content || $input.first().json.text || '';\n const cleaned = raw.replace(/```json|```/g, '').trim();\n parsed = JSON.parse(cleaned);\n} catch (e) {\n parsed = { score: null, red_flags: ['scoring_parse_error'], summary: '', recommendation: 'Needs manual review' };\n}\nreturn [{\n json: {\n ...applicant,\n score: parsed.score,\n red_flags: (parsed.red_flags || []).join('; '),\n summary: parsed.summary,\n recommendation: parsed.recommendation\n }\n}];"
},
"typeVersion": 2
},
{
"id": "35b1ba36-302f-48e8-a25c-9916c24f673c",
"name": "Score & Flag Red Flags (Active AI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-432,
5584
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {
"maxTokens": 500,
"temperature": 0.3
},
"messages": {
"values": [
{
"role": "system",
"content": "You are a tenant screening assistant. Given the applicant's data and a credit/background check result, return ONLY valid JSON, no markdown, with: score (0-100, based mainly on income-to-rent ratio of at least 2.5x, clean rental history, and a clean credit/background result), red_flags (array of short strings, e.g. 'income below 2.5x rent', 'gap in rental history', 'credit check flagged'), summary (2-3 sentence plain-English summary for the landlord), recommendation (one of 'Strong fit', 'Proceed with caution', 'Not recommended')."
},
{
"content": "={{ JSON.stringify({ applicant: $('Parse AI Output (Active)').first().json, credit_check: $json }) }}"
}
]
}
},
"typeVersion": 1.4
},
{
"id": "377deaca-c56a-4b23-8705-e83534265f13",
"name": "Credit & Background Check (Active)",
"type": "n8n-nodes-base.httpRequest",
"notes": "PLACEHOLDER - not a real API. Sign up with an actual provider (Experian, Equifax, TransUnion, Certn, Checkr, illion, etc.) and replace the URL + auth with your own credentials.",
"position": [
-624,
5584
],
"parameters": {
"url": "https://api.your-credit-bureau.com/v1/check",
"method": "POST",
"options": {},
"jsonBody": "={{ { \"full_name\": $json.full_name, \"email\": $json.email, \"phone\": $json.phone } }}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "251a82c3-7877-419a-8c54-2876b2e8d5ae",
"name": "Save Application to Sheet (Active)",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1072,
5584
],
"parameters": {
"columns": {
"value": {
"Status": "New",
"Employer": "={{ $json.employer }}",
"Timestamp": "={{ $now }}",
"IDUploaded": "={{ $json.id_document_mentioned }}",
"RentAmount": "={{ $json.rent_amount }}",
"ApplicantName": "={{ $json.full_name || $json.applicantName }}",
"EmployerPhone": "={{ $json.employer_phone }}",
"MonthlyIncome": "={{ $json.monthly_income }}",
"ApplicantEmail": "={{ $json.email }}",
"ApplicantPhone": "={{ $json.phone }}",
"ApplicantChatId": "={{ $json.chatId }}",
"RentalHistoryNotes": "={{ $json.rental_history_notes }}",
"PreviousLandlordName": "={{ $json.previous_landlord_name }}",
"PreviousLandlordEmail": "={{ $json.previous_landlord_email }}",
"PreviousLandlordPhone": "={{ $json.previous_landlord_phone }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ApplicantChatId",
"type": "string",
"display": true,
"required": false,
"displayName": "ApplicantChatId",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ApplicantName",
"type": "string",
"display": true,
"required": false,
"displayName": "ApplicantName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ApplicantPhone",
"type": "string",
"display": true,
"required": false,
"displayName": "ApplicantPhone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ApplicantEmail",
"type": "string",
"display": true,
"required": false,
"displayName": "ApplicantEmail",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Employer",
"type": "string",
"display": true,
"required": false,
"displayName": "Employer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "EmployerPhone",
"type": "string",
"display": true,
"required": false,
"displayName": "EmployerPhone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "MonthlyIncome",
"type": "string",
"display": true,
"required": false,
"displayName": "MonthlyIncome",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "RentAmount",
"type": "string",
"display": true,
"required": false,
"displayName": "RentAmount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PreviousLandlordName",
"type": "string",
"display": true,
"required": false,
"displayName": "PreviousLandlordName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PreviousLandlordEmail",
"type": "string",
"display": true,
"required": false,
"displayName": "PreviousLandlordEmail",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PreviousLandlordPhone",
"type": "string",
"display": true,
"required": false,
"displayName": "PreviousLandlordPhone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "RentalHistoryNotes",
"type": "string",
"display": true,
"required": false,
"displayName": "RentalHistoryNotes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IDUploaded",
"type": "string",
"display": true,
"required": false,
"displayName": "IDUploaded",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "applications-sheet-template"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "63dcb296-2e5e-4350-8a55-f8e2ad518695",
"name": "Parse AI Output (Active)",
"type": "n8n-nodes-base.code",
"position": [
-1296,
5584
],
"parameters": {
"jsCode": "const prev = $('Extract Message Data (Active)').first().json;\nlet parsed = {};\ntry {\n const raw = $input.first().json.message?.content || $input.first().json.text || '';\n const cleaned = raw.replace(/```json|```/g, '').trim();\n parsed = JSON.parse(cleaned);\n} catch (e) {\n parsed = { parse_error: true, raw: JSON.stringify($input.first().json) };\n}\nreturn [{\n json: {\n ...prev,\n ...parsed\n }\n}];"
},
"typeVersion": 2
},
{
"id": "3e6474ca-9e8d-478d-aea6-09f29304fc68",
"name": "Parse Application Data (Active AI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-1632,
5584
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {
"maxTokens": 500,
"temperature": 0.2
},
"messages": {
"values": [
{
"role": "system",
"content": "You are an intake assistant for a rental application. Extract structured data from the applicant's message. Return ONLY valid JSON, no markdown, no extra text, with these fields: full_name, phone, email, employer, employer_phone, monthly_income (number only, no symbols), rent_amount (number or null), previous_landlord_name, previous_landlord_email, previous_landlord_phone, rental_history_notes, id_document_mentioned (true/false), missing_fields (array of field names not provided in the message)."
},
{
"content": "={{ $json.applicantMessage }}"
}
]
}
},
"typeVersion": 1.4
},
{
"id": "1295104c-76a0-45ed-a0f2-28ec12da74a8",
"name": "Extract Message Data (Active)",
"type": "n8n-nodes-base.set",
"position": [
-1808,
5584
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a1",
"name": "chatId",
"type": "string",
"value": "={{ $json.message.chat.id }}"
},
{
"id": "a2",
"name": "applicantMessage",
"type": "string",
"value": "={{ $json.message.text }}"
},
{
"id": "a3",
"name": "applicantName",
"type": "string",
"value": "={{ $json.message.from.first_name + ' ' + ($json.message.from.last_name || '') }}"
},
{
"id": "a4",
"name": "telegramUsername",
"type": "string",
"value": "={{ $json.message.from.username || '' }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "c9a452b6-f8ed-4a38-ad71-b7e2a7ed15c3",
"name": "New Applicant Message (Active)",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-2032,
5584
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"typeVersion": 1.1
},
{
"id": "573abf8f-540e-4f46-a009-d335f4aac63d",
"name": "\ud83d\udd11 Credentials & Sheet Setup",
"type": "n8n-nodes-base.stickyNote",
"position": [
896,
5104
],
"parameters": {
"color": 3,
"width": 460,
"height": 444,
"content": "## \ud83d\udd11 Credentials & Sheet Columns\n- **Telegram Bot API** \u2014 applicant trigger + landlord alerts\n- **OpenAI API** \u2014 4 AI nodes (parse, score, reference extract \u00d7 2)\n- **Google Sheets OAuth2** \u2014 applications sheet\n- **Gmail OAuth2** \u2014 reference check email\n- **Slack OAuth2** \u2014 error alerts\n- **Credit bureau HTTP** \u2014 replace placeholder URL + add auth\n\nSheet columns: `Timestamp, ApplicantChatId, ApplicantName, ApplicantPhone, ApplicantEmail, Employer, EmployerPhone, MonthlyIncome, RentAmount, PreviousLandlordName, PreviousLandlordEmail, PreviousLandlordPhone, RentalHistoryNotes, IDUploaded, CreditCheckStatus, Score, RedFlags, Recommendation, Summary, ReferenceResponse, Status`"
},
"typeVersion": 1
},
{
"id": "d6ef23d4-a853-43d2-bd69-f364fbad520d",
"name": "Section \u2013 Error Handling",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1792,
5904
],
"parameters": {
"color": 7,
"width": 604,
"height": 480,
"content": "## \u26a0\ufe0f Error Handling\nA workflow-level error trigger posts an alert to Slack whenever any node fails. Update the channel ID to your ops or alerts channel before activating."
},
"typeVersion": 1
},
{
"id": "87cb51ba-4779-4f9a-8e55-2c56489d7cb3",
"name": "Section \u2013 Automated Reference Check",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
5952
],
"parameters": {
"color": 7,
"width": 1576,
"height": 496,
"content": "## \ud83d\udce7 Automated Reference Check\nIf a previous landlord email exists, sends a `sendAndWait` Gmail message with four standard questions and waits for the free-text reply. When the response arrives, GPT extracts the tenancy dates, payment history, disputes, and whether they'd rent again \u2014 then saves it to the sheet."
},
"typeVersion": 1
},
{
"id": "8fba07ff-f70e-4306-b594-8d84ddca6dbc",
"name": "Section \u2013 Sheet Update & Landlord Notification",
"type": "n8n-nodes-base.stickyNote",
"position": [
-32,
4656
],
"parameters": {
"color": 7,
"width": 720,
"height": 432,
"content": "## \ud83d\udcca Sheet Update & Landlord Notification\nWrites the score, recommendation, and red flags back to Google Sheets and notifies the landlord on Telegram. The applicant also gets a confirmation that their application was received."
},
"typeVersion": 1
},
{
"id": "207b3a6f-2344-4b88-b4af-bf99f4613d1b",
"name": "Section \u2013 Credit Check & AI Scoring",
"type": "n8n-nodes-base.stickyNote",
"position": [
-720,
5376
],
"parameters": {
"color": 7,
"width": 1520,
"height": 480,
"content": "## \ud83d\udd0d Credit Check & AI Scoring\nSends name, email, and phone to your credit bureau API (placeholder URL \u2014 replace with your provider). GPT then scores the applicant 0\u2013100 and identifies red flags based on income ratio, rental history, and the credit result."
},
"typeVersion": 1
},
{
"id": "701602e6-69d7-44b8-93e9-a73b950e1609",
"name": "Section \u2013 Intake & AI Parsing",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2256,
5392
],
"parameters": {
"color": 7,
"width": 1440,
"height": 464,
"content": "## \ud83d\udce9 Intake & AI Parsing\nReceives the applicant's Telegram message, extracts the chat ID and message text, then uses GPT-4o-mini to parse out all structured fields: name, income, employer, rent amount, previous landlord contact details, and any missing fields."
},
"typeVersion": 1
},
{
"id": "1cb1f54e-1456-4cc4-90e9-96cb3ccab274",
"name": "\ud83d\udccc Overview \u2013 How This Workflow Works",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3456,
4544
],
"parameters": {
"color": 2,
"width": 1028,
"height": 664,
"content": "## \ud83c\udfe1 RentalOS AI \u2013 Tenant Screening & Reference Automation\n\n### How it works\nA prospective tenant sends a single Telegram message with their details. GPT-4o-mini extracts their name, income, employer, rent amount, and previous landlord contact in one pass. The application is logged to Google Sheets, then a credit and background check API is called and GPT scores the applicant 0\u2013100 based on income-to-rent ratio (2.5x minimum), rental history, and the credit result. The landlord receives a Telegram notification with the score and recommendation. If the applicant provided a previous landlord email, the workflow sends an automated reference check email and waits for the reply \u2014 when it arrives, AI extracts the key answers and updates the sheet.\n\n### Setup steps\n1. Connect **Telegram Bot API** to all Telegram nodes.\n2. Connect **OpenAI API** to all four AI nodes.\n3. Connect **Google Sheets OAuth2** and create a sheet with the columns listed in the Credentials sticky.\n4. Replace `YOUR_GOOGLE_SHEET_ID` in every Google Sheets node.\n5. Connect **Gmail OAuth2** for the reference check email.\n6. Replace the credit bureau URL in the HTTP node with your actual provider (Experian, Certn, Checkr, etc.) and add your auth.\n7. Replace `YOUR_LANDLORD_CHAT_ID` in the Notify Landlord nodes.\n8. Connect **Slack OAuth2** and replace `YOUR_SLACK_CHANNEL_ID` in the error alert.\n9. Activate the Telegram trigger."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "7e1988b4-0017-4fec-a527-436eace7840d",
"nodeGroups": [],
"connections": {
"On Workflow Error": {
"main": [
[
{
"node": "Slack \u2013 Post Workflow Error Alert",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Output (Active)": {
"main": [
[
{
"node": "Save Application to Sheet (Active)",
"type": "main",
"index": 0
}
]
]
},
"Extract Message Data (Active)": {
"main": [
[
{
"node": "Parse Application Data (Active AI)",
"type": "main",
"index": 0
}
]
]
},
"Parse Scoring Output (Active)": {
"main": [
[
{
"node": "Update Application Score (Active)",
"type": "main",
"index": 0
}
]
]
},
"New Applicant Message (Active)": {
"main": [
[
{
"node": "Extract Message Data (Active)",
"type": "main",
"index": 0
}
]
]
},
"Parse Reference Output (Active)": {
"main": [
[
{
"node": "Update Reference Response in Sheet (Active)",
"type": "main",
"index": 0
}
]
]
},
"Update Application Score (Active)": {
"main": [
[
{
"node": "Confirm Receipt to Applicant (Active)",
"type": "main",
"index": 0
},
{
"node": "Notify Landlord - New Ranked Applicant (Active)",
"type": "main",
"index": 0
},
{
"node": "Has Previous Landlord Email? (Active)",
"type": "main",
"index": 0
}
]
]
},
"Credit & Background Check (Active)": {
"main": [
[
{
"node": "Score & Flag Red Flags (Active AI)",
"type": "main",
"index": 0
}
]
]
},
"Parse Application Data (Active AI)": {
"main": [
[
{
"node": "Parse AI Output (Active)",
"type": "main",
"index": 0
}
]
]
},
"Save Application to Sheet (Active)": {
"main": [
[
{
"node": "Credit & Background Check (Active)",
"type": "main",
"index": 0
}
]
]
},
"Score & Flag Red Flags (Active AI)": {
"main": [
[
{
"node": "Parse Scoring Output (Active)",
"type": "main",
"index": 0
}
]
]
},
"Send Reference Check Email (Active)": {
"main": [
[
{
"node": "Extract Reference Answers (Active AI)",
"type": "main",
"index": 0
}
]
]
},
"Extract Reference Answers (Active AI)": {
"main": [
[
{
"node": "Parse Reference Output (Active)",
"type": "main",
"index": 0
}
]
]
},
"Has Previous Landlord Email? (Active)": {
"main": [
[
{
"node": "Send Reference Check Email (Active)",
"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.
telegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow captures rental applications from Telegram, uses OpenAI to extract applicant details and score risk after a credit/background API check, logs everything in Google Sheets, notifies the landlord via Telegram, and optionally emails a reference check via Gmail while…
Source: https://n8n.io/workflows/17288/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This comprehensive N8N automation template revolutionizes content creation by delivering a complete end-to-end solution for AI-powered blog generation. Transform simple ideas into fully SEO-optimized,
This workflow combines a Telegram doctor bot, OpenAI, Google Sheets, Gmail, Slack, and a webhook to summarize PDF reports, generate and email discharge summaries, analyze lab values, report bed availa
This workflow is designed for n8n users who manage multiple production workflows and want to: Receive intelligent, actionable error alerts instead of raw stack traces Understand root causes without ma
Bot Gambar. Uses telegramTrigger, lmChatOpenRouter, googleSheets, telegram. Event-driven trigger; 74 nodes.
This advanced n8n workflow is designed for SEO specialists, digital agency owners, webmasters, and marketing managers who need a comprehensive, automated solution to track and improve their website's