/ 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