Loop
Sign inGet started
← All posts
April 8, 2026·7 min read

Introducing Loop v2: feedback as a first-class signal

Loop v2 turns scattered user feedback into a structured, queryable signal your whole team can act on — with a new SDK, drop-in widget, and signed real-time webhooks.

MO
Mara Ostrowski
Co-founder

Most teams already collect feedback. It arrives through support tickets, sales calls, a Slack channel nobody fully reads, and the occasional screenshot pasted into a thread. The problem was never collection. The problem is that feedback rarely becomes a signal anyone can act on without a human stitching it together by hand.

Loop v2 is our attempt to change the shape of that work. Instead of treating feedback as text that lands somewhere and waits, we treat each item as a structured event with enough context to route, group, and resolve it automatically.

What "first-class signal" actually means

When we say feedback should be a first-class signal, we mean it should behave like the other signals you already trust: metrics, logs, traces. Those are queryable, attributable, and easy to wire into automation. Feedback usually is none of those things.

A Loop feedback item carries the fields you need to do real work:

  • user — who said it, with whatever identity you already use
  • message — the raw thing they told you
  • sentimentpositive, neutral, or negative
  • source — where it came from, like in-app-widget or your support inbox
  • tag and status — for triage and lifecycle (open or resolved)

Because every item shares that shape, you can ask questions you could not ask before. Which features get the most negative feedback from accounts on the Scale plan? What did people say in the week after a release? Those become filters, not archaeology.

The SDK is the contract

The center of v2 is the SDK. We rewrote it so that creating feedback is a single, predictable call, and so the types tell you what is allowed before you ship.

import { Loop } from '@loop/sdk';

const loop = new Loop(process.env.LOOP_API_KEY);

await loop.feedback.create({
  user: { id: 'u_8f2c' },
  message: 'The export dialog hangs on large CSV files.',
  sentiment: 'negative',
  source: 'in-app-widget',
});

The same operation looks just as natural from Python:

from loop import Loop
import os

loop = Loop(api_key=os.environ['LOOP_API_KEY'])

loop.feedback.create(
    user={'id': 'u_8f2c'},
    message='Loving the new keyboard shortcuts.',
    sentiment='positive',
)

We spent real time making sentiment a closed set rather than a free string, so a typo fails at the boundary instead of polluting your data months later. Small decision, large downstream payoff.

A widget you can drop in without a meeting

Not every team wants to wire feedback through their own code. The v2 widget is a single script tag and a publishable key. It collects the message, infers source: 'in-app-widget', and lets the user pick a sentiment without writing a sentence. Everything it captures flows into the same pipeline as the SDK, so there is no second-class data path.

The widget and the SDK produce identical feedback items. There is one schema, one inbox, one set of webhooks. We were strict about that on purpose.

If you outgrow the defaults, you can attach your own tags and user metadata. If you do not, it still works on day one.

Real-time webhooks you can trust

Collecting feedback is only useful if something happens next. Loop v2 emits a webhook for every relevant event — a new item, a status change, a tag applied. Three properties made this worth rebuilding:

  • Signed payloads. Every request carries a signature derived from your endpoint secret, so you can verify it came from us and was not modified.
  • Automatic retries. If your endpoint is down, we back off and try again rather than dropping the event.
  • Exactly-once delivery. Your handler can treat each event as happening a single time, which removes a whole category of defensive code.

That last one is harder than it sounds, and we wrote a separate post about how the delivery layer works. The short version: you should be able to create a changelog entry, open a ticket, or ping a channel in response to feedback without writing idempotency logic yourself.

Plans, briefly

Loop v2 keeps a generous Free tier at 1,000 items per month, which is enough to wire feedback into a side project or a small product and feel the difference. Pro and Scale add higher volumes, longer retention, and the throughput guarantees larger teams need. Pricing should never be the reason feedback stays scattered, so the entry point stays free.

Where to start

If you have five minutes, drop in the widget and watch items land in your inbox. If you have an afternoon, install the SDK, send a few real events from your app, and point a webhook at a handler that does one small useful thing — file a ticket, post to a channel, append to a doc.

Feedback was always there. Loop v2 is about making it something you can act on without thinking about plumbing.

productfeedbacksdk