Skip to content

nathanpitman/360-Feedback

Repository files navigation

iHasco 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
  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

About

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.

Topics

Resources

Stars

Watchers

Forks

Releases

Contributors

Languages