https://github.com/nathanpitman/360-feedback
Anonymous 360° feedback tool for iHasco. Responses are written directly to an Excel file in your O365 environment via Power Automate. Colleague names are never stored in this repo — they're passed as a URL parameter at link-share time. The form is deployed to an unguessable hashed URL on GitHub Pages.
https://github.com/nathanpitman/360-feedback
claude-code feedback
Last synced: 2 months ago
JSON representation
Anonymous 360° feedback tool for iHasco. Responses are written directly to an Excel file in your O365 environment via Power Automate. Colleague names are never stored in this repo — they're passed as a URL parameter at link-share time. The form is deployed to an unguessable hashed URL on GitHub Pages.
- Host: GitHub
- URL: https://github.com/nathanpitman/360-feedback
- Owner: nathanpitman
- Created: 2026-03-23T11:08:06.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-03-23T17:54:55.000Z (3 months ago)
- Last Synced: 2026-03-24T13:17:14.154Z (3 months ago)
- Topics: claude-code, feedback
- Language: HTML
- Homepage:
- Size: 119 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 360° Feedback Form
Anonymous 360° feedback tool for iHasco. Responses are written directly to an Excel file in your O365 environment via Power Automate. Colleague names are never stored in this repo — they're encoded into a shareable link generated by the built-in link generator. The form is deployed to an unguessable hashed URL on GitHub Pages.
---
## How it works
```
HR admin visits the Generator:
https://you.github.io/360-feedback/{hash}/generate/
↓ (enters names + link lifetime, clicks Generate)
Gets a shareable link with an encoded ?id= token:
https://you.github.io/360-feedback/{hash}/?id=eyJuIjpb...
↓ (names and expiry window encoded in the token — never in source)
Colleague fills in the form on GitHub Pages
(link shows as expired if opened past its lifetime)
↓ (POST to Power Automate webhook — URL injected at build time, not in repo)
Power Automate writes a row to 360_feedback_dashboard.xlsx in your SharePoint/OneDrive
```
The `{hash}` in the URL is derived from your Power Automate webhook URL at build time — unguessable from the outside, but stable unless you rotate the secret.
---
## Files in this repo
| File | Purpose |
|---|---|
| `src/form-template.html` | The feedback form. Edit this to change questions or styling. Contains no secrets. |
| `src/generate.html` | The link generator form. HR admins use this to create shareable `?id=` links. |
| `src/expired.html` | Error page shown when a feedback link is past its lifetime. |
| `power_automate_payload_reference.json` | Sample JSON payload. Paste into Power Automate's "Generate from sample" when building the flow. |
| `360_feedback_dashboard.xlsx` | Excel template. Upload once to SharePoint or OneDrive. Responses write here. |
| `.github/workflows/deploy.yml` | Build and deploy pipeline. Injects the webhook URL and publishes to GitHub Pages. |
| `skills/360-feedback-deployer/SKILL.md` | Context skill for AI assistants continuing work on this project. |
---
## One-time setup
### Step 1 — Upload the Excel template to SharePoint or OneDrive
1. Upload `360_feedback_dashboard.xlsx` to a SharePoint document library or your OneDrive
2. Note the **site/drive path** — you'll need it in Step 2
3. Make sure the file stays at this location permanently — Power Automate will write to it by path
> The file contains a table named `FeedbackResponses`. Do not rename this table or its columns or the Power Automate flow will break.
---
### Step 2 — Build the Power Automate flow
> **Note:** Power Automate's Import Package requires a proprietary zip format. The flow must be built manually — it only takes about 5 minutes and has 3 steps.
**2a. Create a new flow**
1. Go to [make.powerautomate.com](https://make.powerautomate.com)
2. **My Flows → + New flow → Instant cloud flow**
3. Name it `360 Feedback Receiver`
4. Choose trigger: **When an HTTP request is received** → Create
**2b. Add a Parse JSON step**
1. Click **+ New step** → search for `Parse JSON` → select it
2. Set **Content** to `Body` from the trigger's dynamic content panel
3. Click **Generate from sample** and paste the entire contents of `power_automate_payload_reference.json` from this repo
4. Click Done — Power Automate will generate the schema automatically
**2c. Add an Excel — Add a row into a table step**
1. Click **+ New step** → search `Excel Online (Business)` → select **Add a row into a table**
2. Fill in the fields:
- **Location**: select your SharePoint site or OneDrive
- **Document Library**: the library where you uploaded the Excel file
- **File**: browse to `360_feedback_dashboard.xlsx`
- **Table**: select `FeedbackResponses`
3. Map each column to the matching field from the Parse JSON dynamic content:
| Excel column | Dynamic content value |
|---|---|
| Timestamp | Use expression: `utcNow()` |
| Subject Name | `subject_name` |
| Form ID | `form_id` |
| Authentic and ethical leadership | `authentic_ethical_leadership` |
| Emotional intelligence | `emotional_intelligence` |
| Inspire and influence | `inspire_and_influence` |
| Change management | `change_management` |
| Team building and collaboration | `team_building_collaboration` |
| Future focused, innovative, curious and courageous | `future_focused_innovative` |
| Decision making and problem solving | `decision_making_problem_solving` |
| Growth mindset with high self-awareness | `growth_mindset` |
| Cultural competence | `cultural_competence` |
| Communicates with impact | `communicates_with_impact` |
| Strengths | `strengths` |
| Development Areas | `development` |
> `form_id` is the encoded token from the `?id=` URL parameter. All submissions from the same shared link carry the same `form_id`, making it easy to filter responses by session in Excel.
**2d. Save and get your webhook URL**
1. Click **Save**
2. Go back to the **When an HTTP request is received** trigger step
3. Copy the **HTTP POST URL** — this is your `PA_WEBHOOK_URL`
4. Make sure the flow is **turned on** (flows default to off after creation)
> Keep this URL private. It is the only security layer between the public internet and your Excel file.
---
### Step 3 — Add the webhook URL as a GitHub secret
1. In this repo, go to **Settings → Secrets and variables → Actions**
2. Click **New repository secret**
3. Set:
- **Name**: `PA_WEBHOOK_URL`
- **Value**: the full webhook URL from Step 2
---
### Step 4 — Enable GitHub Pages
1. Go to **Settings → Pages**
2. Set **Source** to: `Deploy from a branch`
3. Set **Branch** to: `gh-pages` / `/ (root)`
4. Save
> The `gh-pages` branch is created automatically on first deploy.
---
### Step 5 — Deploy
Either push any change to `main`, or go to:
**Actions → Deploy 360 Feedback Form → Run workflow → Run workflow**
Once complete, check the Actions log for your live URLs:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Generator URL: https://yourusername.github.io/360-feedback/a3f7c2d1e4b89f01/generate/
Form base URL: https://yourusername.github.io/360-feedback/a3f7c2d1e4b89f01/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
Bookmark the **Generator URL** and share it with HR admins.
---
## Sharing the form
Use the **Generator** (`/{hash}/generate/`) to create feedback links:
1. Enter the names of the people you're collecting feedback for
2. Choose a link lifetime (7, 14, or 30 days)
3. Click **Generate link** — a `?id=` encoded link is produced
4. Copy and share the link with colleagues
The link encodes the colleague names and expiry window into a URL-safe token. Anyone opening the link after the lifetime window will see an expiry message and be asked to request a new link.
---
## Updating the form
Edit `src/form-template.html` and push to `main`. The workflow redeploys automatically within ~1 minute.
---
## Rotating the webhook URL
If you ever need to invalidate the current URL (e.g. suspected abuse):
1. In Power Automate, delete the HTTP trigger and re-add it — this generates a new URL
2. Update the `PA_WEBHOOK_URL` secret in GitHub
3. Push any change to `main` to trigger a redeploy
4. The hashed path in the URL will change — share the new Generator URL from the Actions log
Old links will 404 automatically.
---
## Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Submissions don't appear in Excel | Flow is turned off | Go to Power Automate and turn the flow on |
| Submissions don't appear in Excel | Excel table name changed | Ensure the table is named `FeedbackResponses` |
| Submissions don't appear in Excel | Wrong file path in flow | Re-check the Drive and File fields in the Add Row action |
| GitHub Pages shows 404 | Pages not configured | Check Settings → Pages → gh-pages branch |
| Actions log shows secret not set | Secret missing | Add `PA_WEBHOOK_URL` in Settings → Secrets → Actions |
| Form shows "Invalid link" or "No colleagues in link" | Missing or malformed `?id=` token | Use the Generator to create a new link |
| Form redirects to expired page | Link lifetime has passed | Use the Generator to create a new link |