home / skills / rshankras / claude-code-apple-skills / analytics-setup

analytics-setup skill

/skills/generators/analytics-setup

This skill generates a protocol-based analytics setup with swappable providers to track events without changing app code.

npx playbooks add skill rshankras/claude-code-apple-skills --skill analytics-setup

Review the files below or copy the command above to add this skill to your agents.

Files (8)
SKILL.md
4.6 KB
---
name: analytics-setup
description: Generates protocol-based analytics infrastructure with swappable providers (TelemetryDeck, Firebase, Mixpanel). Use when user wants to add analytics, track events, or set up telemetry.
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
---

# Analytics Setup Generator

Generate a protocol-based analytics infrastructure that makes it easy to swap providers without changing app code.

## When This Skill Activates

Use this skill when the user:
- Asks to "add analytics" or "set up analytics"
- Mentions "TelemetryDeck", "Firebase Analytics", "Mixpanel"
- Wants to "track events" or "add telemetry"
- Asks about "privacy-friendly analytics"
- Wants to swap analytics providers

## Key Feature: Swappable Providers

The generated code uses a protocol-based architecture:

```swift
// Your app uses the protocol
analytics.track(.buttonTapped("subscribe"))

// Swap providers by changing ONE line:
let analytics: AnalyticsService = TelemetryDeckAnalytics() // or FirebaseAnalytics()
```

## Pre-Generation Checks

### 1. Project Context Detection
- [ ] Check for existing analytics implementations
- [ ] Look for TelemetryDeck/Firebase/Mixpanel in Package.swift or Podfile
- [ ] Identify source file locations

### 2. Conflict Detection
Search for existing analytics:
```
Glob: **/*Analytics*.swift, **/*Telemetry*.swift
Grep: "protocol.*Analytics" or "TelemetryDeck" or "Firebase"
```

If found, ask user:
- Extend existing analytics?
- Replace with new implementation?
- Add new provider to existing setup?

## Configuration Questions

Ask user via AskUserQuestion:

1. **Which provider(s)?**
   - TelemetryDeck (privacy-friendly, recommended)
   - Firebase Analytics
   - Mixpanel
   - None (NoOp for now, add later)

2. **What events to track?**
   - App lifecycle (launch, background, foreground)
   - Screen views
   - User actions (buttons, features used)
   - Errors
   - Custom events

3. **User properties?**
   - App version
   - Subscription status
   - Custom properties

## Generation Process

### Step 1: Create Core Files

Always generate these files:
1. `AnalyticsService.swift` - Protocol (never changes)
2. `AnalyticsEvent.swift` - Event definitions (app-specific)
3. `NoOpAnalytics.swift` - For testing/privacy mode

### Step 2: Create Selected Provider(s)

Based on user selection:
- `TelemetryDeckAnalytics.swift`
- `FirebaseAnalytics.swift`
- `MixpanelAnalytics.swift`

### Step 3: Create Environment Integration

For SwiftUI apps:
- `AnalyticsServiceKey.swift` - Environment key for dependency injection

### Step 4: Determine File Location

Check project structure:
- If `Sources/` exists → `Sources/Analytics/`
- If `App/` exists → `App/Analytics/`
- Otherwise → `Analytics/`

## Output Format

After generation, provide:

### Files Created
```
Sources/Analytics/
├── AnalyticsService.swift          # Protocol (stable interface)
├── AnalyticsEvent.swift            # Your app's events
├── Providers/
│   ├── NoOpAnalytics.swift         # Testing/privacy
│   └── [Provider]Analytics.swift   # Selected provider(s)
└── AnalyticsServiceKey.swift       # SwiftUI Environment (optional)
```

### Integration Steps

**App Entry Point:**
```swift
@main
struct MyApp: App {
    // Choose your provider
    private let analytics: AnalyticsService = TelemetryDeckAnalytics(appID: "YOUR-APP-ID")

    init() {
        analytics.configure()
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.analytics, analytics)
        }
    }
}
```

**Tracking Events:**
```swift
struct ContentView: View {
    @Environment(\.analytics) private var analytics

    var body: some View {
        Button("Subscribe") {
            analytics.track(.buttonTapped("subscribe"))
        }
    }
}
```

### Required Dependencies

**TelemetryDeck:**
```swift
// Package.swift
.package(url: "https://github.com/TelemetryDeck/SwiftClient", from: "1.0.0")
```

**Firebase:**
```swift
// Package.swift
.package(url: "https://github.com/firebase/firebase-ios-sdk", from: "10.0.0")
// Also requires GoogleService-Info.plist
```

### Swapping Providers Later

To switch providers:
1. Add new provider file (or generate with this skill)
2. Change ONE line in App.swift:
```swift
// Before
private let analytics: AnalyticsService = TelemetryDeckAnalytics(...)

// After
private let analytics: AnalyticsService = FirebaseAnalytics()
```

### Testing
- Use `NoOpAnalytics()` in tests and previews
- All tracking calls become no-ops
- No external dependencies in tests

## References

- **analytics-patterns.md** - Protocol architecture and best practices
- **templates/** - All template files

Overview

This skill generates a protocol-based analytics infrastructure for Swift apps, enabling easy swapping between providers like TelemetryDeck, Firebase, and Mixpanel. It scaffolds core protocol files, provider implementations, and SwiftUI environment integration so tracking calls remain stable across provider changes. Use it to add telemetry, track events, and support privacy-friendly or test-friendly analytics modes.

How this skill works

The generator creates a stable AnalyticsService protocol and an AnalyticsEvent enum to centralize event definitions. It then adds provider-specific implementations (TelemetryDeckAnalytics, FirebaseAnalytics, MixpanelAnalytics) plus a NoOpAnalytics for testing or privacy modes. For SwiftUI projects it also produces an EnvironmentKey to inject the chosen analytics service into views, and it suggests where to place files based on common project layouts.

When to use it

  • When adding analytics to a Swift app for the first time
  • When you want to swap telemetry providers without changing app code
  • When you need privacy-friendly or testable (NoOp) analytics
  • When tracking events, screen views, lifecycle events, or errors
  • When preparing provider-specific configuration (e.g., Firebase plist)

Best practices

  • Keep AnalyticsService and AnalyticsEvent stable; add new events to AnalyticsEvent only
  • Prefer TelemetryDeck for privacy-focused deployments and NoOpAnalytics for tests and previews
  • Register provider once in App init and inject via SwiftUI environment or DI container
  • Store provider credentials and config outside source (Secrets, plist) and avoid hardcoding
  • Track high-level, product-relevant events and include contextual properties for analysis

Example use cases

  • Scaffold TelemetryDeckAnalytics to enable privacy-first telemetry with minimal code changes
  • Add FirebaseAnalytics implementation and the required GoogleService-Info.plist for full feature tracking
  • Create NoOpAnalytics for unit tests and SwiftUI previews to avoid external dependencies
  • Swap providers by changing one line in App.swift to move from TelemetryDeck to Mixpanel
  • Generate AnalyticsEvent entries for app lifecycle, screen views, button taps, and error reporting

FAQ

How do I switch analytics providers later?

Add the new provider implementation (or generate it) and change the single provider assignment in your App entry to the new AnalyticsService instance.

Can I use NoOpAnalytics in production?

NoOpAnalytics is intended for testing and privacy modes; use a real provider in production unless you intentionally want to disable telemetry.

Where does this place generated files?

It suggests common locations: Sources/Analytics/, App/Analytics/, or a top-level Analytics/ folder depending on your project layout.