Skip to content

Surveys

In Configure → Surveys, create a Survey creative with its questions, display limits, and delivery settings. Surveys use the same Designer, block layout, theme, localization, and creative-version history as paywalls and surfaces.

Use a campaign placement to choose when an eligible customer receives the survey. Campaign schedules, audiences, assignment caps, and the survey’s own presentation limits all apply. Start in Test and leave the survey inactive until the consuming app has been checked.

Use Collect again when you need another round of feedback. It starts a new collection round without deleting earlier answers. Editing a survey does not reset its presentation limit.

The native iOS survey renderer requires iOS 16 or later. Install the host once near the app root, then present a survey from an app-owned moment:

ContentView()
.oneSurveys(one.surveys)
func requestFeedback(using one: OneSDK) async throws {
_ = try await one.surveys.present(placement: "feature_feedback", mode: .manual)
}

Automatic presentation uses the same placement call with the default mode. A placement that has no eligible survey returns no presentation. The SDK owns reservation, display/dismissal/response delivery, durable retry, and identity handling; do not add an app-owned survey uploader or retry loop.

For a custom UI, render SurveyView(presentation:). Preserve the received question and choice IDs and submit the received revision. Do not re-shuffle choices or send answers through analytics events.

Use the controlled component when the app owns the presentation trigger:

import { Survey } from '@repo/sdk-web';
const [feedbackOpen, setFeedbackOpen] = useState(false);
<Survey
placement="feature_feedback"
open={feedbackOpen}
onOpenChange={setFeedbackOpen}
mode="manual"
/>

Install <SurveyHost /> once inside the existing OneProvider when the app uses the headless client.surveys.prepare(...) API or configured paywall follow-ups.

The Svelte component accepts the provider client or an explicit client and binds the controlled open state:

<script lang="ts">
import { Survey } from '@repo/sdk-svelte';
let feedbackOpen = false;
</script>
<Survey
{client}
placement="feature_feedback"
bind:open={feedbackOpen}
mode="manual"
/>

Use <SurveyHost {client} /> once for headless preparation and configured follow-ups. Do not mount both a controlled Survey and a host for the same presentation.

The iOS Developer Console has a Surveys page on iOS 16 or later. It loads the selected app’s compatible Survey catalog, including inactive designs, and uses the saved design in a preview. Pull to refresh after editing in One.

Previewing never saves answers, impressions, or dismissals, and does not affect campaign eligibility or delivery limits. Test actual targeting, delivery limits, offline response delivery, and customer changes in the consuming app before enabling a survey for customers.

Use the Survey’s results view to inspect responses by collection round and revision, then export the bounded result set as CSV when needed. Lifecycle reporting records that a survey was shown, completed, or dismissed without placing written answers in analytics events.

One Agent support is scoped per workspace token. The Survey tools are one_list_surveys, one_get_survey, one_get_survey_results, one_export_survey_results, and one_plan_manage_survey. Reading requires surveys:read; creating, updating, and starting a new round require a reviewed action plan with surveys:write. Survey deletion is not supported by the Agent.

Next: iOS setup, Messaging, config, and rules, or release checklist.