Docs
grovs.io Start for free

Quick start

Install the Grovs Unity package, fill in Project Settings and open your first link on a device.

Install the package, fill in Project Settings and open your first link on a device. Takes about fifteen minutes.

Using an AI coding agent?

Copy one prompt into Claude Code, Cursor or Copilot and it does these steps in your project.

Open in Cursor

Requirements

  • Unity 2022.3 or newer (Unity 6 included). Mono and IL2CPP, with or without Android minify.
  • iOS 13.0+.
  • Android target API level 34 or higher. The build fails below 34.
  • External Dependency Manager for Unity (EDM4U). It pulls in the native SDKs.
  • Your bundle ID, Apple Team ID, package name and SHA-256 signing fingerprints registered in the Grovs dashboard. See Dashboard setup.

Installation

1. Install EDM4U

Install it from OpenUPM or from its GitHub releases. Without it, Grovs logs Grovs needs External Dependency Manager for Unity once per Editor session.

2. Add the Grovs package

In Window → Package Manager, click + → Add package from git URL and enter:

https://github.com/grovs-io/grovs-unity.git#upm/v1.0.0

Or add it to Packages/manifest.json:

JSON
{
  "dependencies": {
    "com.grovs.sdk": "https://github.com/grovs-io/grovs-unity.git#upm/v1.0.0"
  }
}

Use a upm/vX.Y.Z tag, not the main branch. Only the upm branch holds the prebuilt Android bridge libraries.

The package pins the native SDKs: CocoaPods Grovs ~> 3.1 and Maven io.grovs:Grovs:[3.1.0,3.2). Don't add them yourself.

3. Check the EDM4U settings

Open Assets → External Dependency Manager → iOS Resolver → Settings and check:

  • Add pods to Unity framework target: on. The Grovs bridge lives in UnityFramework, so the pod must be linked there.
  • Link frameworks statically: on (the default).

On Android, run Assets → External Dependency Manager → Android Resolver → Resolve, or keep auto-resolution on. Grovs works with Unity's custom Gradle templates (mainTemplate.gradle, gradleTemplate.properties), which EDM4U writes the dependencies into.

Project Settings

Open Edit → Project Settings → Grovs. The values are stored in Assets/Grovs/GrovsSettings.asset and are read only at build time, never at runtime. Commit this asset with your project.

SettingDefaultDescription
API keyemptyProject API key from the Grovs dashboard. An empty key gives a build warning, and the game can't authenticate.
EnvironmentTest for development buildsTest for development builds uses the test environment for development builds and production for the rest. Or pick Production or Test for every build.
Base URLemptyDomain of a self-hosted backend. Leave empty for the Grovs cloud.
Start enabledonWhether Grovs runs before the player has made a consent choice. A choice saved on the device wins. See Privacy & Consent.
Clipboard domainsemptyExtra link hosts accepted by clipboard-assisted deferred deep linking.
URI schemeemptyThe URI scheme from the dashboard. Required: the build fails when it's empty, because iOS authentication fails without it.
Link domainsemptyYour link hosts. List both the production host (x.sqd.link) and the test host (x.test-sqd.link), plus any custom domain.
Push enabledoffTurns on Grovs push notifications. See Push notifications.
Android push modeAutoAuto, Firebase Unity or Standalone. See Push on Android.
iOS own notification delegateonGrovs installs a forwarding notification center delegate so it sees push taps.
Android small iconemptyDrawable resource name for the small notification icon.
Google services JSON pathemptyAndroid Standalone push only: path to your google-services.json.
Track scenesoffReports each active scene change as a screen view. See Tracking scenes.
Log levelErrorNative SDK log level: Info, Warn or Error. Android has no warn level, so Warn logs at Info there.

Native automatic screen tracking is always off. Screen views come from TrackScreenView or Track scenes.

What the build changes

iOS, in the exported Xcode project:

  • Info.plist: the Grovs keys, such as GrovsApiKey, GrovsUseTestEnvironment and GrovsEnabled, and a URL type for the scheme.
  • Entitlements: an applinks: associated domain for each link domain.
  • UnityFramework target: the Swift build settings the bridge needs.
  • With push on: the aps-environment entitlement, the remote-notification background mode and UNITY_USES_REMOTE_NOTIFICATIONS=1.

No UnityAppController changes are needed. Grovs hooks URL opens, universal links and the push token itself.

Android:

  • Generates Assets/Plugins/Android/GrovsConfig.androidlib with the Grovs meta-data. It's rebuilt on every build, so you can gitignore it.
  • Adds an intent filter for the URI scheme and an https intent filter with autoVerify for each link domain to your launcher activity, whatever its class name. The filters are replaced on each build.
  • Sets android.useAndroidX=true and android.enableJetifier=true in gradle.properties.
  • When the Android Gradle plugin is older than 8 (Unity 2022.3 uses 7.4.2), adds a newer R8 (com.android.tools:r8:8.5.35) to the root build.gradle. See Troubleshooting.

Dashboard setup

Set up the app in the Grovs dashboard as you would a native app.

iOS (SDK Setup → iOS):

Android (SDK Setup → Android):

  • Package name.
  • The SHA-256 fingerprint of every key that signs your game: the Unity debug keystore, your upload keystore and the Play App Signing key. See How to Get the SHA-256 Fingerprint in Unity.
  • For push campaigns: the Firebase service account.
  • For revenue: the Play API access key.

The dashboard serves apple-app-site-association and assetlinks.json from these values. Copy the URI scheme and link domains it shows into Project Settings.

C#
using GrovsSDK;
using UnityEngine;
 
public class LinkRouter : MonoBehaviour
{
    void OnEnable() => Grovs.DeeplinkReceived += OnDeeplink;
    void OnDisable() => Grovs.DeeplinkReceived -= OnDeeplink;
 
    void OnDeeplink(GrovsDeeplink deeplink)
    {
        Debug.Log("Opened from " + deeplink.Link);
    }
}

Put it in your first scene. Links that arrive before anyone subscribes are kept and delivered to the first subscriber.

Build to a device, open a link from the dashboard in Notes or Messages, and check the log. To try routing without a device, use Grovs → Simulate Deep Link.

Troubleshooting

Message or symptomFix
Build fails: Grovs: URI scheme is emptySet URI scheme to the value from the dashboard.
Build warns: Grovs: API key is emptySet API key. The game builds but can't authenticate.
Build fails: Grovs: Android target API level must be 34 or higherSet Player Settings → Android → Target API Level to 34 or newer, or Automatic with SDK 34 installed.
Android build fails while dexing (D8 or R8) on Unity 2022.3Unity 2022.3 uses Android Gradle plugin 7.4.2, whose R8 can't process the libraries Grovs uses. Grovs patches the root build.gradle. If your custom base Gradle template sets the plugin version through a variable, Grovs logs a warning instead: add classpath 'com.android.tools:r8:8.5.35' to the buildscript dependencies yourself.
iOS: No such module 'Grovs' or link errorsCheck the EDM4U settings, open Unity-iPhone.xcworkspace (not the .xcodeproj), and run pod install again if needed.
iOS: links don't open the gameCheck the link domains, the Associated Domains capability on your App ID, and the Team ID on the dashboard.
Android: links open the browserThe SHA-256 of the key that signed this build is missing from the dashboard. Play Store installs need the Play App Signing key.
No deep link reaches my handlerSubscribe to DeeplinkReceived early, and check Grovs.IsEnabled.
A Task never completesPending tasks have no timeout. Call Grovs from the main thread and make sure the player loop is running.

Next steps

See also

Last updated 2026-10-26
Was this page helpful?