/ Tech Request - 1 Open Modal.md
Tech Request - 1 Open Modal.md
1 --- 2 type: make-scenario-migration 3 status: pending 4 make-id: 4227711 5 active: true 6 invalid: false 7 trigger: webhook 8 apps: [gateway, http] 9 executions: ~low 10 last-edit: 2026-04-05 11 --- 12 13 # Tech Request - 1. Open Modal 14 15 **Status:** Active 16 **Make ID:** 4227711 17 **Trigger:** Custom Webhook (Slack slash command or button action) 18 19 --- 20 21 ## Module Sequence 22 23 1. **Custom Webhook** → receives POST from Slack (slash command or button click) 24 2. **Webhook Respond** → immediately returns HTTP 200 with empty body (required for Slack 3s timeout) 25 3. **HTTP Request — POST `slack.com/api/views.open`** → opens a Slack modal with fields: 26 - Task Name (text input) 27 - Description (text area) 28 - Loom Link (URL input) 29 - Due Date (date picker) 30 - Department (select menu) 31 - Type (select menu) 32 33 --- 34 35 ## n8n Node Mapping 36 37 | Make Module | n8n Node | Notes | 38 |---|---|---| 39 | Custom Webhook | Webhook node | Receives Slack payload (includes `trigger_id`) | 40 | Webhook Respond (200 empty) | Respond to Webhook node | Must fire within 3s | 41 | HTTP Request (views.open) | HTTP Request node | POST to `https://slack.com/api/views.open` with `trigger_id` and modal JSON | 42 43 --- 44 45 ## Key Details 46 47 - This is Part 1 of a 2-part Tech Request flow (Part 2: scenario 4227715 creates the Notion item) 48 - The Slack `trigger_id` from the webhook payload is required by `views.open` — expires in 3 seconds, hence the immediate Webhook Respond first 49 - Modal JSON defines the modal fields — retrieve from blueprint or reconstruct based on field list above 50 - Slack Bot token required with `views:write` scope 51 52 --- 53 54 ## Modal Structure (Slack Block Kit) 55 ```json 56 { 57 "type": "modal", 58 "callback_id": "tech_request_modal", 59 "title": { "type": "plain_text", "text": "Tech Request" }, 60 "submit": { "type": "plain_text", "text": "Submit" }, 61 "blocks": [ 62 { "type": "input", "block_id": "task_name", "element": { "type": "plain_text_input" }, "label": { "type": "plain_text", "text": "Task Name" } }, 63 { "type": "input", "block_id": "description", "element": { "type": "plain_text_input", "multiline": true }, "label": { "type": "plain_text", "text": "Description" } }, 64 { "type": "input", "block_id": "loom_link", "element": { "type": "plain_text_input" }, "label": { "type": "plain_text", "text": "Loom Link" } }, 65 { "type": "input", "block_id": "due_date", "element": { "type": "datepicker" }, "label": { "type": "plain_text", "text": "Due Date" } }, 66 { "type": "input", "block_id": "department", "element": { "type": "static_select", "options": [] }, "label": { "type": "plain_text", "text": "Department" } }, 67 { "type": "input", "block_id": "type", "element": { "type": "static_select", "options": [] }, "label": { "type": "plain_text", "text": "Type" } } 68 ] 69 } 70 ``` 71 > Retrieve exact Department and Type options from the Make blueprint. 72 73 --- 74 75 ## Migration Checklist 76 77 - [ ] Export blueprint to retrieve exact modal JSON (Department/Type options) 78 - [ ] Recreate Slack Bot credential in n8n (needs `views:write` scope) 79 - [ ] Build 3-node workflow: Webhook → Respond to Webhook → HTTP Request (views.open) 80 - [ ] Set up Slack slash command or button to point to n8n webhook URL 81 - [ ] Test: slash command → modal appears in Slack 82 - [ ] Confirm modal fields match expected structure 83 - [ ] Ensure Part 2 (scenario 4227715) receives the modal submission 84 - [ ] Mark active in n8n, deactivate Make scenario