Android

Feature requests for Android apps: collect ideas and votes inside your app

Android developers get feature requests from three places: Google Play reviews, the email address on the store listing, and the occasional Reddit thread. None of them count votes, and none of them tell a user when their idea ships. Adding feature requests to an Android app with a proper board takes one Kotlin function and a dependency you probably already have. This page shows the setup with Chrome Custom Tabs and Jetpack Compose, and compares the alternatives honestly.

To add feature requests to an Android app, open a hosted feedback board with Chrome Custom Tabs from a settings entry. It is one dependency (androidx.browser) and about five lines of Kotlin. Users suggest and upvote inside your app, and you get a dashboard with statuses, duplicate merging, and Android-versus-iOS breakdowns. Free for 10 requests, then $5 a month.

Why Google Play reviews don't work as a feature request system

Play Console lets you reply to reviews, and that is where its feature-request support ends. There is no voting, so you cannot tell whether "add a widget" is one person's wish or a hundred. Reviews are tied to a star rating, so users who want to ask for something often knock a star off to get attention, which hurts your listing. And a reply is a one-time message: when you finally ship the widget six weeks later, the reviewer never finds out.

Android also has a fragmentation problem that iOS mostly avoids. The same request can mean different things on a Pixel and a Samsung tablet, and you want to be able to ask the person who posted it. A board with comments lets you do that without publishing the exchange to your store page.

The tools built for this were priced for SaaS companies, not app developers. Canny's Pro plan is $79 a month and scales with tracked users. Featurebase charges $59 a month on Basic. Frill starts at $25 a month and caps you at 50 ideas. pick a feature is free for one project and 10 requests and then $5 a month, flat, which is the assumption behind the setup below.

Your options for an Android feature request board

  1. Chrome Custom Tabs to a hosted board. Your project gets a public page at a pickafeature.com URL. A Custom Tab opens it inside your app with your toolbar color, shares Chrome's cookies so votes persist, and falls back gracefully on devices without Chrome. No SDK to maintain. This is the recommended route and the one detailed below.
  2. WebView with the web widget. Embed the pick a feature web widget in inline mode inside a WebView when you want the board to live inside your own layout, for example as a tab. More styling control, and you can pass the signed-in user's id so votes follow their account.
  3. Flutter SDK. If the app is written in Flutter, use the native Flutter package instead. It renders the board with Material widgets and reports the platform as Android automatically.
  4. Build it yourself. A Room table, a Compose list, and a Firebase backend gets you a board in a week. It also gets you moderation, spam, duplicate cleanup, and notifications to build next. The build versus buy breakdown puts the ongoing cost at 80 to 120 developer hours.

Open the board with Chrome Custom Tabs

Add the AndroidX browser dependency if it is not already there:

build.gradle.kts
dependencies {
    implementation("androidx.browser:browser:1.8.0")
}

Then launch the board from wherever you keep support links. Copy your board URL from the Projects page of the dashboard; it looks like https://pickafeature.com/b/your-app.

FeatureRequests.kt
import android.content.Context
import android.net.Uri
import androidx.browser.customtabs.CustomTabColorSchemeParams
import androidx.browser.customtabs.CustomTabsIntent

fun openFeatureRequests(context: Context) {
    val colors = CustomTabColorSchemeParams.Builder()
        .setToolbarColor(0xFF6366F1.toInt())
        .build()
    CustomTabsIntent.Builder()
        .setDefaultColorSchemeParams(colors)
        .setShowTitle(true)
        .build()
        .launchUrl(context, Uri.parse("https://pickafeature.com/b/your-app"))
}

In Jetpack Compose, wire it to a settings row:

SettingsScreen.kt
@Composable
fun SettingsScreen() {
    val context = LocalContext.current
    ListItem(
        headlineContent = { Text("Feature requests") },
        supportingContent = { Text("Vote on what we build next") },
        modifier = Modifier.clickable { openFeatureRequests(context) }
    )
}

Custom Tabs use the device's default browser when Chrome is absent, and Android falls back to a normal browser intent on the rare device with neither. Either way the board loads. The page follows the system dark theme and stores the user's votes in browser storage, so one person gets one vote per request.

Embedding the board in a WebView instead

Some apps want the board as a first-class screen rather than a browser sheet. For that, host a small HTML page (or serve it from assets) that loads the web widget in inline mode, and show it in a WebView with JavaScript enabled:

board.html
<div id="board"></div>
<script
  src="https://pickafeature.com/sdk/v1/pickafeature.js"
  data-api-key="YOUR_PROJECT_KEY"
  data-container="#board"
  defer
></script>

The project key is a public key, the same kind that ships inside any mobile binary, and the server rate-limits it per project. If your app has accounts, call PickAFeature.identify from the page with the user's id so their votes survive a reinstall. The web widget documentation lists every option.

What happens after a user posts a request

New requests arrive as pending in your dashboard and are invisible to users until you approve them, which keeps spam and support questions off the public board. You get an email for each new request, vote, and comment. Move cards across a kanban board (pending, under review, planned, in progress, completed) and users see the status change on their next visit.

When two people ask for the same thing in different words, drag one card onto the other. The merge dialog shows both, lets you keep or combine the titles and descriptions, and carries over votes with each voter counted once. The analytics page then shows requests and users split by Android, iOS, and web, so you know whether a request is an Android pain point or a product-wide one.

How pick a feature fits an Android developer

pick a feature is priced so a developer with one app on Google Play can afford it: free for one project and 10 feature requests, $5 a month for three projects with unlimited requests, $15 a month for unlimited projects. No per-seat and no per-tracked-user fees, so a Play Store feature does not become a billing event.

You get the hosted board for Custom Tabs, the web widget for WebViews, a Flutter SDK if you go cross-platform, and one dashboard with merge and per-platform analytics across all of them. A native Kotlin library is on the roadmap; tell us if you need it and we will weigh it against the other requests, which is exactly the process the product is built for.

Frequently asked questions

Do I need Chrome installed on the user's device?

No. Custom Tabs use whichever browser supports the protocol, including Samsung Internet, Firefox, and Edge. If no browser supports Custom Tabs, Android opens the board in the default browser. The board itself works in any modern browser.

Can I match the board to my app's theme?

Partly. Custom Tabs let you set the toolbar color, and the board follows the system light or dark setting. If you embed the web widget in a WebView instead, you can set the primary color, corner radius, theme, and every text string.

How do you stop one user voting many times?

Each browser gets a stable device id stored locally and the server accepts one vote per request per id. Clearing browser data resets it, which is the same limitation every hosted feedback tool has for anonymous voters. For account-tied votes, use the web widget with identify or the Flutter SDK.

Does this work for Android TV or Wear OS?

Custom Tabs are a phone and tablet feature. For TV and Wear, collect requests through your companion phone app or website instead, or show a QR code that links to the hosted board. All of them feed the same project.

What does it cost?

Free for one project and 10 feature requests with no card required. Starter is $5 a month for three projects and unlimited requests. Unlimited is $15 a month for unlimited projects. Pricing is flat and does not change with your install count.

Start collecting feature requests today

Free plan: 1 project, 10 feature requests, no credit card. Paid plans from $5 a month.