Built for apps developed using Claude Code, Codex, and other LLM-based development tools

Mobile analytics made
for agentic development

Undercurrent Analytics is an all-in-one mobile analytics platform that uses open standards to give you the best possible understanding of how your mobile app is used by real people.

Free until your app gets traction.

Why Undercurrent

Simple and complete, with a generous free tier, made for entrepreneurial developers.

Produce usage data that's specific to your app's domain, and visualize bespoke engagement and activation metrics using Grafana - the visualization tool your agent is most familiar with.

Handles event ingest, storage, querying, and visualizations

One service from device to dashboard. We provide prompts for easy integration into your app.

Analyse data using the open standards of SQL and Grafana

Your agent's favoured toolkit for writing queries and defining visualizations. We provide an importable skill to help you be as successful as possible.

Pay only once you start to see traction for your app

Our business model is to charge based on the number of distinct app users producing events, so that you only need to pay out of your app's revenue.

How it works

Track, query, visualize

Add the mobile analytics client library to your app, then ask your LLM of choice to create relevant, insightful visualizations in Grafana to understand the effectiveness of your activation funnel, and figure out how users are engaging with your app.

UsageAnalytics.swift
// Track an event from your app.

// 1. Add https://github.com/mixpanel/mixpanel-swift as a Swift Package Manager dependency.
//    Undercurrent ingest is wire-compatible with Mixpanel.

// 2. Set up a reusable mechanism for creating events throughout your app.
import Mixpanel

class UsageAnalytics {

  private let tracker: MixpanelInstance

  init(distinctId: String) {
    self.tracker = Mixpanel.initialize(token: "<your-undercurrent-project-token>", trackAutomaticEvents: false,
                                       serverURL: "https://ingest.undercurrent.dev")
    tracker.identify(distinctId: distinctId)
  }

  func event(eventName: String, properties: [String: String]?) {
    tracker.track(event: eventName, properties: properties)
  }
}

// 3. Produce events based on user interactions.
struct MyView: View {

  @EnvironmentObject var usageAnalytics: UsageAnalytics

  var body: some View {
    Button(action: {
      // <Do something>
      usageAnalytics.event(eventName: "tappedButton", properties: ["userFeedback": "This is a useful app!"])
    }) {
      Text("Submit")
    }
  }
}
TODO-grafana-panel.json
-- Paying users by plan, this month
SELECT plan,
       count(distinct user_id) AS users
FROM   mobile_events
WHERE  event = 'checkout_completed'
GROUP BY plan
ORDER BY users DESC;
TODO replace with Grafana screenshot
checkout_completed — distinct users by plan
1,284
Distinct users
$31,802
Revenue
7.4%
Conversion
Pricing

Pricing that tracks your traction

Our business model is simple: Pay based on the number of distinct app users producing events each month. If you're still in the friends and family stage, we're here for you too.

Early access
Free for early users

We're looking for partners. Let us help you understand your customers, which will help us to refine the experience and value we provide. Undercurrent is free for early adopters.

  • Billing scales with the distinct monthly users so you pay only based on your ability to monetize.
  • Pay nothing until your app starts to see real traction.
  • Free while we're in early access.

Register your interest

We're onboarding early teams now. Leave your email and we'll reach out with access.