---
title: "Plain"
description: "Use Plain for MainSDK feedback and support - API key, main.yaml, opening reports and tickets, local testing and swapping."
section: "integrations"
canonical: "https://mainsdk.dev/docs/integrations/plain"
updated: "2026-10-28"
---

# Plain

> Use Plain for MainSDK feedback and support - API key, main.yaml, opening reports and tickets, local testing and swapping.

Canonical: https://mainsdk.dev/docs/integrations/plain · Updated: 2026-10-28

Plain is a customer support platform and one of the drivers behind [`feedback`](https://mainsdk.dev/docs/interfaces/feedback). Reports from `feedback.open()` and tickets from `support.ticket()` land in Plain with the trace, version, device and steps attached. Pick it when your team already runs support in Plain.

> **Note:** `feedback` has no spec yet. The calls and options on this page are provisional and may change when the spec lands.

## Interfaces it serves

### Feedback and support (`feedback`)

- Status: Building for 0.6 · ships as a beta API
- Driver: `plain` (Plain)
- Docs: https://mainsdk.dev/docs/interfaces/feedback.md

```yaml
feedback:
  driver: plain
```

Swap to another provider: `builtin`, `intercom`, `zendesk`.

## Before you start

1. Have a Plain workspace.
2. Create an API key in its settings with permission to create customers and threads, and store it in your secrets manager.

## Configure

```yaml title="main.yaml"
feedback:
  driver: plain
  # [TBD] key name; the key goes in as secret:PLAIN_API_KEY (suggested name)
```

## Use it

```ts title="app/report.ts"
"use client";
import { feedback } from "mainsdk";

export function reportProblem(user: { id: string }) {
  feedback.open({ for: user, context: { screen: "settings" } });
}
```

`support.ticket()` arguments arrive with the spec.

## Local development and testing

Use `driver: builtin` in a development overlay. In tests, `createTestApp()` from `@mainsdk/testing` runs `feedback` on an in-memory fake, and `chaos.on("feedback", { outage: true })` simulates Plain being down.

## What MainSDK adds on top

- Screenshots redacted and support access audited.
- Trace, version, device and steps on every report.

See [Feedback and support](https://mainsdk.dev/docs/interfaces/feedback).

## Limits and notes

Planned driver, not in a spec yet: `feedback` is phase 2. Key names are [TBD].

## Swap to or from it

```yaml title="main.yaml"
feedback:
  driver: plain   # was builtin
```

Past threads stay in the old tool.

## FAQ

**Does Plain need its own SDK in my app?** No. Your code calls `feedback`; the driver talks to Plain.

## Next

- [Feedback and support](https://mainsdk.dev/docs/interfaces/feedback)
- [Intercom](https://mainsdk.dev/docs/integrations/intercom) and [Zendesk](https://mainsdk.dev/docs/integrations/zendesk)
