iOS

Analytics for iOS

No SDK to add to your project. One URLSession call reports a screen or a conversion, and it lands beside your web traffic in the same dashboard.

One function

func track(path: String, name: String = "pageview") {
    var req = URLRequest(url: URL(string: "https://app.stepmetrics.co/v1/collect")!)
    req.httpMethod = "POST"
    req.setValue("application/json", forHTTPHeaderField: "Content-Type")
    req.httpBody = try? JSONSerialization.data(withJSONObject: [
        "siteId": yourSiteId,
        "name": name,
        "path": path,
        "client": ["platform": "ios",
                   "device": UIDevice.current.userInterfaceIdiom == .pad ? "tablet" : "mobile"],
    ])
    URLSession.shared.dataTask(with: req).resume()
}

Call it when a screen appears and when something worth counting happens. Put the app version and build in props; there are no dedicated fields, because a field the server accepted and then dropped would be worse than none.

Why the client field matters

Send it. Bot filtering reads the user agent and assumes a browser wrote it; a mobile HTTP stack often sends none, which on the web is a crawler. Declaring client tells the server to judge the request as an app. Without it your traffic is filed as automated and disappears from every default view.

What is different from the web

Every field an app can send is in the docs.

Read it from your editor

Connect Claude Code, Cursor or any MCP client with a read-only key, and ask in words: which pages lost traffic this week, where mobile visitors drop out of signup, whether Tuesday's spike was a crawler. The agent gets the same numbers as the dashboard.

claude mcp add --transport http stepmetrics https://app.stepmetrics.co/mcp \
  --header "Authorization: Bearer dak_..."

Claude Code ยท Cursor

Try it on your site.

Add your first site for free. See where visitors come from, what they look at, and how many take the next step.

No credit card required.