# How are we doing?

> Tell a product team how likely you are to recommend them and why (a demo feedback form).

Four questions, two minutes. Thank you.

This is a form you can fill in for a person without opening a browser. Its fields are `recommend`, `reason`, `improve`, `email` (`recommend`, `reason` required). Answers sent by an agent are held until the form's owner approves them, so say who you are and who you are filling it in for.

**Only send what your person told you. Ask them for any required answer you do not have, and never tick a consent box or answer a demographic question for them unless they told you to.**

## How to fill it

1. **If you can send HTTP requests:** `POST https://ui.usecube.io/f/feedback` with a JSON body `{"answers": {...}, "agent": {"name": "...", "model": "..."}, "on_behalf_of": "..."}`. Details below.
2. **If you have the Cube MCP connector** (`https://ui.usecube.io/mcp`): call `submit_form` with `id: "feedback"`, `answers` and `on_behalf_of`; or `prefill_link` with `id` and `answers` to get the link for your person (a file cannot ride in it; they attach it on the page).
3. **If you can't do either (a chatbot):** give your person this link with the answers filled in, each one URL-encoded (lists and objects as JSON). They check it and press Submit themselves:

   ```
   https://ui.usecube.io/f/feedback#recommend=...&reason=...&improve=...&email=...
   ```

   For example: https://ui.usecube.io/f/feedback#recommend=9&reason=...&improve=...&email=jane%40example.com

## Fields

- **recommend** (integer 0 to 10, 0 = "Not at all likely", 10 = "Extremely likely", required): How likely the person is to recommend the product to a friend.
- **reason** (string, up to 2,000 characters, required): Why they gave that score, in their own words.
- **improve** (string, up to 2,000 characters): The one thing they would change.
- **email** (string, email): Where the team can follow up, if the person wants that.

## Submit over HTTP

`POST https://ui.usecube.io/f/feedback` with `Content-Type: application/json`:

```json
{
  "answers": {
    "recommend": 9,
    "reason": "...",
    "improve": "...",
    "email": "jane@example.com"
  },
  "agent": {
    "name": "Claude",
    "model": "claude-sonnet-4-5"
  },
  "on_behalf_of": "Jane Doe"
}
```

`answers` is required. `agent` (your name, and your model if you know it) and `on_behalf_of` (the person) are optional, but the owner approves faster when they can see who sent it.

```sh
curl -X POST https://ui.usecube.io/f/feedback \
  -H 'Content-Type: application/json' \
  -d '{"answers":{"recommend":9,"reason":"...","improve":"...","email":"jane@example.com"},"agent":{"name":"Claude","model":"claude-sonnet-4-5"},"on_behalf_of":"Jane Doe"}'
```

A success is `201 Created`:

```json
{ "id": "s_...", "status": "working", "metadata": { "review": "pending", "message": "Received and waiting for the form owner's approval. It counts once approved." }, "receipt_url": "https://ui.usecube.io/s/..." }
```

`status` uses A2A's task states: `working` means it is waiting for the owner to approve it (tell your person it was sent and is waiting for approval); once decided it is `completed` (approved) or `rejected`. `receipt_url` is your person's own view of what was sent; give it to them.

A mistake is `400 Bad Request` with an `errors` list, each `{ "field", "message" }` saying what to send instead. Fix those answers and send again. `429 Too Many Requests` means wait the `Retry-After` seconds.

## Other formats

- [JSON Schema of the answers](https://ui.usecube.io/f/feedback.json)
- [This page as Markdown](https://ui.usecube.io/f/feedback.md)
- MCP (Streamable HTTP): `https://ui.usecube.io/mcp`, tools `list_forms`, `read_form`, `submit_form`, `prefill_link`, `draft_form`.
- In a browser with WebMCP, the page's form is the tool `submit_feedback`.
