---
title: "Migrate surveys"
description: "Move survey exports from other survey tools into Deck as CSV uploads, and confirm that Deck processed every row."
url: "/docs/agents/workflows/migrate-surveys"
---

This page is an agent-readable workflow for Deck. Humans can follow along. Coding agents should treat the steps as the source of truth.

# Migrate surveys — agent workflow

* **Use it when:** the user says "import our Typeform results", "move our Qualtrics or SurveyMonkey history into Deck" or "bring our old NPS survey into Deck".
* **Outcome:** each survey export is a CSV upload in Deck with the status `COMPLETED`, and the user knows what Deck found in it.
* **Needs:** Deck MCP and the Deck web app. The user uploads the file in Manage → CSV Uploads, because no MCP tool imports feedback. Free text answers use credits. A file can be at most 10 MB. NPS through MCP needs the Starter plan or higher.

## 1. Probe Deck MCP

Call `get_user_context`. This must be a real tool call.

* 401 Unauthorized: tell the user to connect Deck MCP in this client (Settings → Connections). Stop.
* No Deck tools: fetch and follow [https://docs.getdeck.io/docs/agents/getting-started/prompts/ai-pm.md](https://docs.getdeck.io/docs/agents/getting-started/prompts/ai-pm.md). Stop this workflow until the tools work.
* More than one Deck organization: call `select_organization`, ask which one to use, and pass its `org_id` on every later call.

## 2. Check what Deck already has

Make these calls in parallel:

* `list_sources` with import\_source set to `CSV`: read `file_name`, `csv_type`, `status` and `total_rows` of each upload. Do not upload the same export again.
* `explore_integrations` with `integration_type: "POSTHOG"`: PostHog surveys sync through the native integration. For PostHog, follow [Connect feedback stack](/docs/agents/workflows/connect-feedback-stack) instead.
* `get_overview`: record Deck's data counts before the import.

## 3. Pick the CSV type

Ask the user for each export file and the tool that made it. Then pick one Deck type:

| Export                                                             | Deck CSV type | Format                                                                                                                                   |
| ------------------------------------------------------------------ | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Full survey from Qualtrics, SurveyMonkey, Typeform or Google Forms | Survey        | One row for each respondent, one column for each question. Keep the native export. Deck detects the platform.                            |
| NPS score list                                                     | NPS           | One row for each response. `score` (0-10) is required. `reason`, `respondent_email`, `respondent_name` and `response_date` are optional. |
| Open comments only                                                 | Feedback      | One row for each comment. `content` is required.                                                                                         |

See [CSV Import](/docs/features/csv-import) for every field.

## 4. Prepare the file

You can do these checks on the user's local file:

* Do not change the respondents' words. Do not translate, summarize or fix answers.
* Keep the email columns. Deck uses them to link each row to a contact.
* A file larger than 10 MB: split it by rows. Put the full header block at the top of each part. Qualtrics uses 3 header rows and SurveyMonkey uses 2.
* A large export: suggest a test file of 20-50 rows first.
* Do not reshape a native survey export into the flat format.

## 5. Check credits

For a large file or a survey with many free text questions, follow [Credits readiness check](/docs/agents/workflows/credits-readiness-check) first. The upload wizard shows the credit cost of a Survey upload before the user submits. Structured answers (NPS, rating, yes or no, select) use 0 credits.

## 6. Hand off the upload

Give the user these steps:

1. In the Deck web app, open Manage → CSV Uploads and click **Upload CSV**.
2. Select the type from step 3.
3. Survey: check the column roles (Question, Metadata or Skip) and the question types. Read the credit counter.
4. Other types: check the column mapping.
5. Review the invalid rows, then submit.

Wait until the user says that the upload is submitted.

## 7. Track processing

1. Call `list_sources` with import\_source set to `CSV`. Find the new upload. Read `status`, `total_rows`, `processed_rows` and `failed_rows`.
2. While `status` is `PENDING` or `PROCESSING`, wait about 10 seconds and call again. Stop after 5 checks and tell the user that processing continues in the background.
3. Call `list_sources` with the `upload_id` to see each row and its status.
4. `PARTIALLY_COMPLETED` or `FAILED`: the user can click **Retry Failed** in the upload detail view. Retried rows use credits again.
5. `CREDIT_BLOCKED`: follow [Credits readiness check](/docs/agents/workflows/credits-readiness-check).

## 8. Show what Deck found

Make these calls in parallel:

* `get_overview`: report Deck's data counts after the import.
* `explore_themes` with `sort: "insight_count"`: Deck's largest themes after the import.
* `explore_nps` (Starter plan or higher), for an NPS upload or a survey with an NPS question: the score and the breakdown.

For an NPS or Feedback upload, call `read_transcript` with the `feedback_id` of one row to show what Deck extracted. Survey rows have no `feedback_id`.

A large import can add new themes. To clean them up, follow [Review the theme taxonomy](/docs/agents/workflows/taxonomy-review).

## Rules

* No MCP tool uploads a CSV. The user uploads it in the Deck web app.
* Never invent, edit or merge survey answers.
* Only the user deletes an upload, in Manage → CSV Uploads. A delete is permanent and Deck does not refund the credits.
* Quote Deck's numbers. Do not compute your own. Let the upload wizard compute the credit cost.
* This workflow only reads. Do not call write tools.

## Done when

* Each export is an upload with the status `COMPLETED`, or the user knows the blocker and the next step.
* The user has Deck's row counts for each upload and Deck's top themes after the import.

---

[View full sitemap](/docs/sitemap)
