teamretro

n8n community node for the TeamRetro public API

Package Information

Released: this month
Downloads: 0 weekly / 0 monthly
Latest Version: 0.3.0
Author: GroupMap Pty Ltd

Documentation

n8n-nodes-teamretro

n8n community node for the TeamRetro public API. Automate retrospectives, actions, health checks, estimations, and more from your n8n workflows.

Links

Installation

This package is an n8n-verified community node, so it installs straight from the nodes panel on both n8n Cloud and self-hosted n8n. Only an instance owner or admin can install it, and they only need to do it once — after that everyone on the instance can use it.

  1. On the canvas, open the nodes panel (+, or press n).
  2. Search for TeamRetro. It appears under More from the community.
  3. Select it, then click Install.

See Install verified community nodes for full instructions.

On self-hosted n8n you can also install it by package name from Settings → Community nodes → Install:

n8n-nodes-teamretro

Credentials / Authentication

Getting an API key

TeamRetro issues two kinds of API keys:

Key prefix Scope Where to create
tra_ Account-scoped — full account access. Required for User management, creating/deleting Teams, account Insights, and Reports. Account → Settings → API & SCIM
trt_ Team-scoped — single team only. Sufficient for most per-team operations (Actions, Agreements, Retrospectives, Health Checks, etc.), but some operations are unavailable or return only that team's data. Team → Settings → Permissions

Copy the key immediately after creation — it is not shown again.

Setting up the credential in n8n

  1. In n8n, open Credentials → New → TeamRetro API.
  2. Paste your API key into the API Key field.
  3. Select the correct Region (see below).
  4. Click Test to verify the connection.

Region

The Region selector sets the API host. The node appends /v1 to the host automatically — paste the host only.

Region Host
US (default) https://api.teamretro.com
EU https://api.eu.teamretro.com

Operation Reference

All 81 operations across 17 resources. Select Resource then Operation in the node UI.

Upgrading from 0.2.x? Nine operations that always returned 404 (their TeamRetro
endpoints are disabled server-side) were removed. A saved workflow still holding one
shows a blank Operation dropdown and needs the replacement picked by hand — see the
Action, Insight and Retrospective tables below and docs/known-limitations.md.

Action

Operation Description
Get Many List actions with optional filters (team, status, assignee, due date) — set the Assigned To filter for your own actions
Create Create a new action
Get Get a single action by ID
Update Update an action (title, status, due date, assignee, …)
Delete Delete an action

Agreement

Operation Description
Get Many List agreements
Create Create a new agreement
Get Get a single agreement by ID
Update Update an agreement
Delete Delete an agreement

Comment

Operation Description
Create Add a comment on an idea, action, agreement, group, or estimation item
Update Update a comment
Delete Delete a comment

Estimation

Operation Description
Get Many List estimation sessions
Create Create a new estimation session
Get Get a single estimation session by ID
Update Update an estimation session
Delete Delete an estimation session
Add Items Add items to an estimation session
Submit Estimate Cast a vote on an estimation item (see Notes — requires OAuth token)
Get Report (Markdown) Fetch the session report as Markdown text

Health Check

Operation Description
Get Many List health check sessions
Create Create a new health check session
Get Get a single health check session by ID
Update Update a health check session
Delete Delete a health check session
Add Dimension Feedback Submit feedback for a health check dimension
Get Many Dimensions List dimensions for a health check session
Get Report (Markdown) Fetch the session report as Markdown text
Get Summary (Markdown) Fetch the session summary as Markdown text

Health Model

Operation Description
Get Many List available health models
Get Get a single health model by slug

Insight

Operation Description
Get Account Insights Account-level insight snapshot — choose the Metric (activity, actions, action trends, cadence, health latest/trend)

Parked Item

Operation Description
Get Many List parked items for a team
Create Create a parked item
Get Get a single parked item by slug
Update Update a parked item
Delete Delete a parked item

Public Template

Operation Description
Get Many List public (library) templates
Get Get a single public template by ID

Report

Operation Description
Get Team Overview Report Team overview report
Get Team Activity Report Team activity report
Get Team Action Activity Report Team action activity report
Get Retrospective Activity Report Retrospective activity report
Get Health Check Activity Report Health check activity report
Get Team Health (Latest) Report Latest team health report for a health model
Get Team Health (Historical) Report Historical team health report for a health model
Get Users Report Users report
Get Team Reports (Batch) All available reports for a team, in one batch

Retrospective

Operation Description
Get Many List retrospectives
Create Create a new retrospective
Get Get a single retrospective by slug
Update Update a retrospective
Delete Delete a retrospective
Capture Idea Submit a captured idea to a team
Update Idea Update an idea in a retrospective
Delete Idea Delete an idea from a retrospective
Vote Vote on an idea or group
Remove Vote Remove a vote from an idea or group
Get Report (Markdown) Fetch the retrospective report as Markdown text — includes the ideas and groups
Get Summary (Markdown) Fetch the retrospective summary as Markdown text

Search

Operation Description
Search Full-text search across TeamRetro content

Standup

Operation Description
Get Many List a team's standups, paused ones included
Create Create a standup for a team — its topics, plus optional title, timezone and meeting days

Team

Operation Description
Get Many List teams accessible with the current key
Create Create a new team (account-scoped key required)
Get Get a single team by ID
Update Update a team
Delete Delete a team (account-scoped key required)

Team Member

Operation Description
Get Many List members of a team
Get Get a single team member by email
Add Add a member to a team
Update Update a team member's role
Remove Remove a member from a team

Template

Operation Description
Get Many List your account's retrospective templates
Get Get a single template by ID

User

Operation Description
Get Many List users in the account (account-scoped key required)
Get Get a user by email
Add Provision a user
Update Update a user
Delete Delete a user

Rate Limit

The TeamRetro API enforces 60 requests per minute. Account-scoped keys each get their own bucket; all team-scoped keys for the same team share a single per-team bucket. The node paginates list operations sequentially (no parallel fan-out), so large result sets count against this limit.

Notes & Limitations

Account-scoped vs team-scoped keys

  • User management, account Insights, account-wide Reports, and creating/deleting Teams require an account-scoped key (tra_).
  • Team-scoped keys (trt_) are clamped to the single team they belong to; operations on other teams return an error.

Submit Estimate limitation

The Estimation → Submit Estimate operation (POST /v1/estimations/{meetingSlug}/votes/{estimationItemSlug}) requires a user OAuth token — the TeamRetro API rejects API keys for this endpoint with 403. This operation cannot be used with the API-key credential this node provides. It is included in the node for completeness, but will not succeed without an OAuth token (which is not supported by this credential type).

Standup updates need a user token

Reading what people posted in a standup, and adding or deleting updates (/v1/standups/{standupSeriesId}/updates), requires a user OAuth token, so this node does not offer them. To work with a standup's updates, use the TeamRetro Trigger's standup.completed event — its payload carries every update, grouped by participant and topic.

Report CSV endpoints

Some report endpoints return raw CSV text rather than JSON. Use a Spreadsheet File node downstream to parse the CSV into structured data.

Date fields

Some date parameters use n8n's dateTime picker, which includes a time component, but the underlying TeamRetro API field expects a date-only value (YYYY-MM-DD). The node passes the value through; if you see unexpected results, supply a date-only string directly using an expression.

TeamRetro Trigger

The package ships a TeamRetro Trigger node that starts a workflow when a TeamRetro event arrives. Add it, tick the events you want, register its Production URL once in TeamRetro, and paste the signing secret back — the node HMAC-verifies every delivery and filters to your selected events.

Setup steps, the payload shape per event, and importable workflows are in examples/.

Events

TeamRetro can fire 21 webhook events:

  • Meetings: retrospective.created, retrospective.completed, healthCheck.created, healthCheck.completed, estimation.created, estimation.completed, standup.created, standup.completed
  • Actions: action.created, action.updated, action.deleted, action.completed, action.assignee.changed, action.dueDate.changed
  • Agreements: agreement.created, agreement.updated, agreement.deleted
  • People: mention.created, kudos.created, team.member.invited, team.member.deleted

Plus webhook.test (sent when you trigger a test delivery from the webhook integration).

Setup steps

  1. In n8n: add the TeamRetro Trigger node, tick your events, and copy the Production URL from the Webhook URLs tab.
  2. In TeamRetro: go to Settings → Integrations → Webhooks → Add webhook. In the step-form:
    • Step 1: select the same events.
    • Step 2: paste the n8n URL into the Endpoint URL field, then copy the auto-generated signing secret into the trigger's Signing Secret field.
    • Step 3: activate the workflow in n8n, then send a test delivery to confirm.

n8n's Listen for test event listens on a separate Test URL and will not receive TeamRetro deliveries. Activate the workflow and use TeamRetro's Send test instead.

Webhook payload shape

Every delivery is a JSON body with this shape:

{
  "event": "action.created",
  "timestamp": "2026-07-16T10:00:00.000Z",
  "data": { /* event-specific payload */ }
}

The trigger emits that envelope (plus deliveryId) straight into the workflow, so expressions read {{ $json.data.action.title }}. The per-event data keys are tabulated in examples/README.md.

Fallback — the generic Webhook node

The trigger node above is the supported path. If you would rather use n8n's built-in Webhook node, you must verify the HMAC signature yourself.

HMAC signature verification

TeamRetro signs every delivery using HMAC-SHA256. The signature is in the request header:

X-TeamRetro-Signature: t=<unixTimestamp>,v1=<hexHmac>

The signed input string is <unixTimestamp>.<rawRequestBody> (timestamp from the header, dot-separated, then the raw JSON body bytes). Verify in a Code node before processing the event:

CRITICAL: You must enable "Raw Body" on the n8n Webhook node, which exposes the unsigned request bytes. Recomputing the HMAC over JSON.stringify(...) of the parsed body will NOT match TeamRetro's signature — key order and whitespace may differ. Always use the raw body.

The Code node blocks require() by default — set NODE_FUNCTION_ALLOW_BUILTIN=crypto in your n8n environment to allow the built-in crypto module.

const crypto = require('crypto'); // requires NODE_FUNCTION_ALLOW_BUILTIN=crypto

const item = $input.first();
const sigHeader = item.json.headers['x-teamretro-signature'] ?? '';
// With "Raw Body" enabled, the raw bytes arrive as base64 in binary.data.data:
const rawBody = Buffer.from(item.binary.data.data, 'base64').toString('utf8');
const secret  = 'YOUR_WEBHOOK_SIGNING_SECRET';         // from TeamRetro's step-form

const parts = Object.fromEntries(sigHeader.split(',').map((p) => p.split('=')));
if (!parts.t || !parts.v1) throw new Error('Missing X-TeamRetro-Signature header');

const expected = crypto
  .createHmac('sha256', secret)
  .update(`${parts.t}.${rawBody}`)
  .digest('hex');
const received = Buffer.from(parts.v1, 'hex');

if (received.length !== 32 || !crypto.timingSafeEqual(received, Buffer.from(expected, 'hex'))) {
  throw new Error('Invalid TeamRetro signature');
}

return $input.all();

Note: The signing secret is available in the webhook integration's settings in TeamRetro (you can re-open the form to copy it again). Store it in an n8n Credential (or environment variable) — do not hardcode it in the workflow.

Additional headers sent with every delivery:

  • X-TeamRetro-Event-Type — the event name (e.g. action.created)
  • X-TeamRetro-Webhook-Delivery-Id — unique delivery identifier (use for deduplication)

Using TeamRetro as an AI Agent Tool

The TeamRetro node is usableAsTool, so an AI Agent can call it: drag it onto the agent's Tool connector and it appears as TeamRetro Tool. Each tool node is pinned to one resource + operation, so attach one per capability you want to grant.

Prerequisites

  • Self-hosted: start n8n with N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true. Without it, community nodes are never offered as agent tools.
  • n8n 2.19 or newer if you want the ✨ Defined automatically by the model button on a Name field. Older versions block it for any parameter literally named name (an n8n-wide denylist, not specific to this node) — you can still type the expression by hand: {{ $fromAI('Meeting_Name', 'what the meeting is called', 'string') }}.

Three settings decide whether the agent behaves

Get these wrong and an agent will create a retrospective when you say "hi". That is not a misconfiguration of this node — it is the default tool metadata being too thin.

  1. Set the tool description manually. Left on Set Automatically, n8n derives it from the operation's action: Create retrospective in TeamRetro. That reads to a model as an instruction, not a capability. Switch Tool Description to Set Manually and say when not to call it:

    Creates a NEW retrospective meeting in TeamRetro. This writes data and the meeting becomes visible to everyone on the team. Only call it when the user has explicitly asked to create or schedule a retrospective AND has told you which team it is for. Do not call it to answer greetings or to look something up. If the team, the name or the date is missing, ask the user instead of guessing.

  2. Give every $fromAI() a description. The ✨ button generates $fromAI('Meeting_Name', ``, 'string') — with an empty description. That is the field the model sees as the parameter's documentation, so an empty one means it will fill the slot with whatever it last read, typically the user's own message. Click + Add a description on every AI-defined field and say what the value is and where it comes from.

  3. Constrain the agent in its system message. For example:

    Only call a tool when the user has explicitly asked for that action. Greetings and
    general questions get a plain text answer and no tool call. Never invent a team ID,
    a meeting name or a date — ask. Before any tool that creates or changes data, state
    what you are about to do and wait for confirmation.
    

Pin anything that should not be the model's decision. $fromAI() is opt-in per field — a parameter left as a literal value can't be influenced by the conversation. If the agent should only ever act on one team, type the 22-character team ID into Team ID rather than letting the model supply it.

Prefer read tools for lookups. Give the agent Team → Get Many or Retrospective → Get Many so it can resolve a team name to an ID instead of guessing one, and keep the write operations for what the user actually asked for.

A working, importable setup is example 8.

Example Workflows

Eight importable workflows — trigger-started, schedule-started, form-started, and chat-started — live in examples/, with per-key-scope notes and setup steps on each canvas.

Workflow Starts with
Retro completed → Slack digest TeamRetro Trigger
High-priority action → Slack alert TeamRetro Trigger
Kudos → Slack shout-out TeamRetro Trigger
Weekly overdue actions digest Schedule
Auto-create the sprint retrospective Schedule
Health check completed → email summary TeamRetro Trigger
Onboard a user onto a team n8n Form (account key)
AI agent retro assistant Chat (AI Agent)

License

MIT — see LICENSE.

Repository

https://github.com/TeamRetroHQ/n8n-nodes-teamretro

Discussion