Docs
Collect feedback in your iOS app and turn it into insights. Everything below is what the SDK and dashboard actually do today.
Overview
Echoed helps you understand what to build next. Ask the right users a question inside your iOS app, connect your other feedback sources, and Echoed turns it all into ranked hypotheses backed by real quotes.
The flow
- Install the SDK in your iOS app.
- Identify who is using the app so feedback is tied to real customers.
- Ask questions at key moments, and pull in App Store reviews and CSV imports.
- Echoed forms ranked insights about what your users need.
- You decide what to build, and validate by asking users directly.
Requirements: iOS 16.0+, Swift 5.7+, Xcode 14+.
Install & initialize
Add Echoed with Swift Package Manager. In Xcode, choose File → Add Package Dependencies and enter the repository URL:
https://github.com/tgrady18/EchoedSDK.gitThen initialize the SDK once at launch, before any other Echoed call:
import Echoed
@main
struct YourApp: App {
init() {
EchoedSDK.shared.initialize(
apiKey: "YOUR_API_KEY",
companyId: "YOUR_COMPANY_ID"
)
}
var body: some Scene {
WindowGroup { ContentView() }
}
}Finding your credentials
Your API key and Company ID are both in the dashboard under Settings at echoed-feedback.com/companyConfig.
If the API key or Company ID is empty, initialize does nothing and logs an error. The optional baseURL parameter defaults to Echoed’s production host, so you can leave it off.
Identify customers
Tell Echoed who is using your app so feedback is tied to a real person instead of an anonymous device. Call setCustomer after login or signup. All parameters are optional.
// After login or signup
EchoedSDK.shared.setCustomer(
id: "user_123",
name: "Jane Smith",
email: "jane@acme.com"
)You can identify progressively. Set a name during onboarding, then add the id later:
// During onboarding, before an account exists
EchoedSDK.shared.setCustomer(name: "Jane")
// Later, after signup
EchoedSDK.shared.setCustomer(id: "user_123", email: "jane@acme.com")Nothing is lost
Feedback submitted before you identify a customer is linked to them retroactively once setCustomer is called.
Clear the identity on logout so later feedback is not attributed to the wrong person:
EchoedSDK.shared.resetCustomer()resetCustomer clears only the customer identity. Internal session data and any user tags you set are preserved. If your app has no accounts, skip this entirely and feedback is grouped by device.
Ask questions
Questions appear at moments you choose, called anchors. Call hitAnchor with an anchor id where the moment happens, usually in onAppear:
struct CheckoutSuccessView: View {
var body: some View {
Text("Order confirmed")
.onAppear {
EchoedSDK.shared.hitAnchor("checkout_complete")
}
}
}Create the matching message in the dashboard under Messages → Create Message. Set the same Anchor ID, write the question, and choose targeting and how often it can show. The anchor string in your code must match the message’s Anchor ID exactly.
Message types
textInputModal with a free-text fieldmultiChoiceModal with selectable optionssliderModal with a numeric slideryesNoBanner that slides in from the topthumbsUpDownBanner that slides in from the top
Every response comes back as a string.
A message is drawn over your app, so an active window scene must exist when the anchor fires. Responses send immediately and are not queued offline, so a failed network call is not retried.
How insights work
Echoed reads every response and groups it into insights. An insight is a lasting hypothesis about your users that updates as new feedback arrives, not a one-off label.
What each insight carries
- State — where it stands: emerging, active, validated, refuted, watching, dormant, or dismissed.
- Severity — opportunity, friction, or validation are worth acting on; behavior and noise are kept as background patterns.
- Confidence — a score from 0 to 1 that rises with more supporting evidence.
- Evidence — the real quotes behind the insight, with the customer and source for each.
- Trend and themes — whether it is growing, and the topics it touches.
Actionable insights surface first; low-signal patterns stay out of the way behind a count. You can confirm, refute, watch, dismiss, or add a note, merge duplicates, and split an insight that is too broad.
When an insight needs proof, use Ask users to turn it into a targeted in-app question. Those answers flow back into the same pipeline as fresh evidence, and the confidence updates on its own.
Other sources
In-app questions are one source. You can bring in more, and everything flows into the same insights.
App Store reviews
Connect your app, pick the countries you care about, and Echoed backfills existing reviews and keeps pulling new ones.
CSV import
Upload a CSV from a survey tool, support inbox, or spreadsheet. Map your columns once, and Echoed dedupes and analyzes it with everything else.
Manage all of this under Sources in the dashboard.
FAQ
What does Echoed cost?+
Echoed is in early access by invitation. Pricing is shared on request.
Why aren't my messages showing up?+
Check that the Company ID is correct, the Anchor ID matches exactly between your code and the dashboard, the message is active, and its frequency rules have not already been met. A message also needs an active window scene to draw over.
How often should I ask questions?+
Start conservatively, around once per user per week, and avoid the very first launch. Raise the frequency if response rates are low.
How accurate are the insights?+
Every insight carries a confidence score and shows the real responses behind it, so you can check the reasoning yourself. Confidence grows as more feedback arrives.
Do I need to ship an app update to change a question?+
No. Once the SDK is installed, you create, edit, and remove messages entirely from the dashboard.
Still stuck? Email hello@echoed-feedback.com.