An open API service indexing awesome lists of open source software.

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.

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 |