Creating surveys

SkillWeb & browsing

The creating-surveys skill lets an AI agent build and launch PostHog surveys through MCP. It covers NPS and CSAT popovers, hosted feedback forms, and headless surveys, guiding survey type selection, audience targeting, draft review, and launch readiness. Use it when asked to create a survey or form, or before calling survey-create.

Use Creating surveys in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add Creating surveys and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use the Creating surveys skill

Details

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Have a PostHog project and an MCP connection that exposes the survey tools.

Creating surveysStart free

What your AI can do with it

  • Create PostHog popover surveys for in-app feedback
  • Build hosted external_survey forms with a shareable link
  • Set up widget surveys with an always-available feedback button
  • Define api surveys rendered in application code
  • Apply audience targeting with conditions and targeting flags
  • Review a draft and check launch readiness before publishing

Getting started

  1. Have a PostHog project and an MCP connection that exposes the survey tools.
  2. Describe the survey goal, the audience, and the questions you want.
  3. Let the skill pick a survey type and draft the questions, then review the draft.
  4. Confirm the delivery requirements, such as SDK support or event instrumentation, are in place.
  5. Launch the survey once the draft and audience are correct.

What this skill tells your AI

The instructions your AI receives, as published by posthog/posthog in products/surveys/skills/creating-surveys/SKILL.md and read by ahel’s review.

Create a useful draft from the user's goal, then verify its audience and delivery before launch. The workflow can run through MCP without opening the survey editor.

Choose the delivery and questions

Infer the name, purpose, and questions from the request. Ask only for missing information that changes who receives the survey or how it is delivered.

User's goalSurvey typeDelivery requirement
Feedback inside an apppopoverA supported PostHog SDK with surveys enabled
Always-available feedback buttonwidgetSDK support and a widget configuration
A shareable hosted formexternal_surveyA hosted survey link; no in-app targeting
A custom form built in application codeapiThe app renders questions and captures survey events

Prefer one to three questions unless the user requests more. Use a rating plus an optional open question for NPS/CSAT, or choice questions with at least two choices. Inspect the current tool schema for question types, scales, branching, and translations instead of guessing their JSON shapes. Minimal starting points are in examples.

Survey names, questions, and appearance text are public content. Do not copy private customer details into them without making that visibility clear first.

Verify the audience and appearance

  • Use conditions for URL, event, device, and linked-flag-variant conditions. Resolve existing event and flag identifiers before using them. A URL condition does not define a person or cohort audience.
  • Use targeting_flag_filters.groups[].properties[] for person, group, or cohort targeting. Groups are alternative rules; properties within a group must all match. Preserve the intended audience when translating the request.
  • Cohorts containing behavioral filters cannot be used directly for survey targeting. Explain the restriction and offer a supported static snapshot or another equivalent audience definition. A snapshot does not update with the original cohort. Get agreement before making that tradeoff; never drop a rule or broaden the audience to make a failed request pass.
  • Hosted forms (external_survey) do not use in-app display conditions or targeting flags. Do not attach those fields to a hosted form.
  • Omit appearance unless customization is needed. whiteLabel: true requires the organization's white-labelling entitlement (Enterprise). Do not infer it from a request for custom colors. Verify entitlement before setting it. surveyPopupDelaySeconds must be non-negative.
  • Leave optional fields unset when unused. Do not fill them with null as a substitute for omission; question fields and nested objects have different nullability rules.

Create and review the draft

Call posthog:survey-create with the resolved configuration. Omit start_date for a draft. If the user already asked for immediate launch, continue through the readiness check and launch without asking for the same approval again.

Keep the returned survey id. Subsequent survey tools use id, not a question ID, feature flag ID, or survey name.

Read the saved survey with posthog:survey-get. Review the questions, type, audience, schedule, response limit, and branding with the user. Show the MCP survey app when the client supports it; otherwise give a concise text review. Always include the returned _posthogUrl. A saved configuration is not evidence that an in-app popup has rendered successfully.

For changes, call posthog:survey-update after fetching the saved survey. Questions, conditions, appearance, targeting, and translations may replace nested values. Preserve unchanged fields and existing question IDs, which link questions to collected responses. Omit IDs only for new questions.

Launch and verify delivery

Before posthog:survey-launch, confirm:

  • The user authorized launch for the reviewed audience and configuration.
  • The survey is not archived and has no end_date in the past. If reopening an existing survey, unarchive it or clear/extend its end date only as authorized.
  • For in-app delivery, surveys are enabled in the project and the app's SDK supports the requested features. Event-triggered surveys need the actual triggering event in the app. Creating an event name in configuration does not instrument that event.
  • For api surveys, the application implementation handles display and event capture. Creating and launching the definition does not implement that code.

Use posthog:survey-launch with id, then verify the returned state. Report whether the survey is a draft, launched, or awaiting an SDK/setup step. For hosted forms, return a verified public form URL when available; _posthogUrl is the management page and is not a respondent link.

Use posthog:survey-stats or posthog:surveys-responses-list to check subsequent activity. Zero responses immediately after launch do not prove delivery failed. For a survey that should have been shown, follow debugging-surveys.

Recover from errors

Read the validation field and reason before retrying. For appearance failures, check branding entitlement and the supplied appearance fields. For targeting failures, verify cohort support and rule structure. Preserve requested behavior when correcting inputs; explain any change that affects the audience or branding.

Creation is not idempotent. After a timeout or uncertain result, use posthog:surveys-get-all to find and inspect a possible existing draft before retrying creation. A matching name alone is not proof that it is the same survey.

Signals

GitHub stars
40k
Forks
3k
Last commit
Sep 2026

Questions

What survey types can it create?
It supports popover surveys for in-app feedback, widget surveys with an always-available button, external_survey hosted forms, and api surveys rendered in application code.
Does it handle audience targeting?
Yes. It uses conditions for URL, event, device, and linked-flag-variant rules, and targeting_flag_filters for person, group, or cohort targeting. Hosted forms do not use in-app targeting.
Can it use a cohort with behavioral filters for targeting?
No. Cohorts containing behavioral filters cannot be used directly for survey targeting. The skill explains the restriction and can offer a static snapshot or another equivalent audience, with your agreement.
Advanced
Item type
skill
Key
creating-surveys
Source
github.com/posthog/posthog