---
title: In-app features - Flutter
description: Enable testing and debugging capabilities within your Flutter app using in-app features for enhanced development workflow
lastUpdated: 11 March 2026
source_url:
  html: https://docs.contentsquare.com/en/csq-sdk-flutter/experience-analytics/in-app-features/
  md: https://docs.contentsquare.com/en/csq-sdk-flutter/experience-analytics/in-app-features/index.md
---

Alongside its tracking capabilities, the SDK embeds some features aimed at Contentsquare users such as Screenshot Capture and SDK Logs.

In order to allow Contentsquare users to enable in-app features in your Flutter app, the implementation depends on the native platform.

## Android

To enable in-app features within your app, you have to **first make sure your app is launched in the background**. To do so, start it and press the Android home button. Then, follow the appropriate method described as follows.

### On a device: scan the QR code

If you have access to the Contentsquare platform, you can open the in-app features modal from the menu and scan the QR code with your phone.

![](https://docs.contentsquare.com/_astro/in-app-features-android.D5RNg6DD_ZrdldA.webp)

Note

On Android, some devices have a built-in QR code reader feature in the default camera app. If that is not the case for you, use [QR & Barcode Reader by TeaCapps ↗](https://play.google.com/store/apps/details?id=com.teacapps.barcodescanner\&hl=en\&gl=US).

### On an emulator: use the ADB command

If you are using an emulator, you can use the ADB command to enable in-app features.

If you have access to the Contentsquare platform, you can open the in-app features modal from the menu and select "Copy this ADB command".

![](https://docs.contentsquare.com/_astro/enable-in-app-features-android-emulator.D8FuW10u_cOBhQ.webp)

It will look like this:

```shell
adb shell am start -W -a android.intent.action.VIEW -d "cs-{{packageName}}://contentsquare.com?activationKey={{uniqueActivationKey}}\&userId={{userId}}"
```

If you don't have access to the Contentsquare platform, you can ask the Contentsquare team to share the link with you.

## iOS

In order to allow Contentsquare users to enable in-app features, you must perform 2 implementation tasks:

1. [Add the custom URL scheme in your app Info](#add-the-custom-url-scheme-in-your-app-info)
2. [Call the SDK when the app is launched via a deeplink](#call-the-sdk-when-the-app-is-launched-via-a-deeplink)

### Add the custom URL scheme in your app Info

You have to allow your app to be opened via a custom URL scheme which can be done using one of the following methods:

#### Xcode

1. Open your project settings
2. Select the app target
3. Select the `Info` settings
4. Scroll to `URL Types`
5. Set the URL scheme to `cs-$(PRODUCT_BUNDLE_IDENTIFIER)`

#### Text editor

1. Open the `Info.plist` of your project

2. Add the following snippet:

   **Info.plist**

   ```xml
   <key>CFBundleURLTypes</key>
   <array>
       <dict>
           <key>CFBundleURLSchemes</key>
           <array>
               <string>cs-$(PRODUCT_BUNDLE_IDENTIFIER)</string>
           </array>
       </dict>
   </array>
   ```

### Call the SDK when the app is launched via a deeplink

Depending on the project, there are multiple ways to handle the deeplink opening. Choose the method matching your project structure:

* AppDelegate

  In your `AppDelegate` class, complete or implement the function `application(app, open url:, options:)` with: `CSQ.handle(url: url)`

* SceneDelegate

  In your `WindowSceneDelegate` class, you need to:

  1. Update `func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)` with:

     ```swift
     if let url = connectionOptions.urlContexts.first?.url {
           CSQ.handle(url: url)
     }
     ```

  2. Complete or implement `func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)` with:

     ```swift
     if let url = URLContexts.first?.url {
         CSQ.handle(url: url)
     }
     ```

* SwiftUI

  In the `body` of your main App struct, add the `onOpenURL` modifier and call the `Contentsquare` SDK to handle the URL:

  ```swift
  @main
  struct MyApp: App {
    var body: some Scene {
      WindowGroup {
        MyView()
          .onOpenURL { url in
            CSQ.handle(url: url)
          }
      }
    }
  }
  ```

### Enable in-app features

Once the implementation is done, in-app features can be enabled in different ways:

#### Scan the QR code

If you have access to the Contentsquare platform, you can open the in-app features modal from the menu and scan the QR code displayed with your iPhone.

![](https://docs.contentsquare.com/_astro/in-app-features-ios-gif.Ctuh2Vtn_Z7bMWd.webp)

#### Use the custom link for simulator

If you have access to the Contentsquare platform, you can open the in-app features modal from the menu and select "Copy link" (to copy the deeplink) and paste it in Safari on your Simulator to trigger the in-app features.

![](https://docs.contentsquare.com/_astro/enable-in-app-features-ios-simulator.6FS54E5B_ZUTQmA.webp)

Note

If you don't have access to the Contentsquare platform, you can ask the Contentsquare team to share the link with you.

#### Using the Terminal

In a Terminal console, open an URL in your current simulator with the following command (replacing `CUSTOM_LINK` with yours):

```shell
xcrun simctl openurl booted "CUSTOM_LINK"
```

## Debugging and Logging

Contentsquare provides Logging capabilities that allow you to see the raw event data logged by your app in the macOS Console App, Xcode or in the Contentsquare platform. Use this for validation purposes during the instrumentation phase of development and can help you discover errors and mistakes in your analytics implementation and confirm that all events are being logged correctly.

### Viewing local logs

By default, almost all logs are disabled. There is only one log that is always visible to notify that the SDK has started:

```plaintext
┌───────────────────────────────────────────────────────────────────────────────
│ 🔔 IMPORTANT 🔔 (CSLIB 4.1.0)
├───────────────────────────────────────────────────────────────────────────────
│ Contentsquare Flutter SDK 4.1.0 starting in app:
│ com.example.testapp
└───────────────────────────────────────────────────────────────────────────────
```

In order to enable all logs, activate [in-app features](#enable-in-app-features). Logging is directly linked to in-app features state: it starts when in-app features are enabled and stops when you disable in-app features.

### Viewing logs in the Contentsquare platform

To view logs directly on the platform, you can use Log visualizer. Log visualizer is a helper tool to see SDK logs without logging tools. It requires having platform access for your project and enabling in-app features. See the [SDK Log Visualizer Help Center Article ↗](https://support.contentsquare.com/hc/en-us/articles/37271699876625) for more information.

### Screenshot capture

In order to unlock the full data-visualization capabilities of Contentsquare, the SDK provides a way to capture screenshots of your app screens. These screenshots can only be taken by Contentsquare's users on their device. They are not captured from your end-users device. It means your Personal Data is safe, as long as you use a test user account.

Warning

For screenshot capture to work, the session has to be tracked (included in tracked users and not opted-out) and a first screenview event has to be sent before.

Note

Screenshots require a screenview event to be triggered before they can be captured.

![](https://docs.contentsquare.com/_astro/screenshot-capture-ios.BvmQHkfu_ZkkTKx.webp)

Screenshots are used in the **Zoning Analysis** module to look at zone-level metrics (Tap rate, Swipe rate...):

![](https://docs.contentsquare.com/_astro/screenshot-use-in-zoning.88Ur0anU_sK7QB.webp)
