Docs
grovs.io Start for free

Link creation

Generate smart links programmatically in your React Native app, and look up a link by path.

Create smart links from your app with generateLink, and read a link back with linkDetails.

Pass one options object. Every field is optional:

typescript
import Grovs from 'react-native-grovs-wrapper';
 
try {
    const link = await Grovs.generateLink({
        title: 'Check out this product',
        subtitle: 'Limited time offer',
        imageURL: 'https://example.com/image.jpg',
        data: { productId: '12345', screen: 'product_detail' },
        tags: ['promotion', 'share'],
        tracking: {
            utm_campaign: 'spring_sale',
            utm_source: 'in_app',
            utm_medium: 'share_button',
        },
    });
    console.log('Generated:', link);
} catch (error) {
    console.error('Error:', error);
}

The native SDK must be configured and authenticated. Until then the promise rejects with an Error whose message starts Failed to generate link:. While disabled with setSDK(false), it rejects with code 'SDK_DISABLED'. See Privacy & Consent.

Parameters

ParameterTypeDescription
titlestring?Link preview title
subtitlestring?Link preview subtitle
imageURLstring?Link preview image URL
data{ [key: string]: Any }?Custom payload delivered on deep link open. Strings, numbers, booleans and flat arrays of those
tagsAny[]?Tags for filtering and analytics. Pass strings
customRedirectsCustomRedirects?Override the default redirect per platform. See Custom redirects
showPreviewIosboolean?Show the link preview page on iOS. Leave undefined to use the project default
showPreviewAndroidboolean?Show the link preview page on Android. Leave undefined to use the project default
tracking{ utm_campaign?, utm_source?, utm_medium? }?UTM campaign, source and medium
copyToClipboardIosboolean?Copy the link to the clipboard from the preview page on iOS, for clipboard-assisted deferred deep linking. Leave undefined to inherit the project setting
copyToClipboardAndroidboolean?Same, for Android. Leave undefined to inherit the project setting

copyToClipboardIos and copyToClipboardAndroid apply only when that platform shows the preview page. Passing false is an explicit override, unlike leaving the field out. Flow and limits: Copy to Clipboard.

typescript
const link = await Grovs.generateLink({
    title: 'Invite a friend',
    data: { referrer: 'user-123' },
    copyToClipboardIos: true,
    copyToClipboardAndroid: true,
});

Positional form

The 1.x positional signature still works, with the two copy flags appended. Prefer the options object in new code.

typescript
Grovs.generateLink(
    title, subtitle, imageURL, data, tags, customRedirects,
    showPreviewIos, showPreviewAndroid, tracking,
    copyToClipboardIos, copyToClipboardAndroid
)

Custom redirects

Override where a link sends users per platform:

typescript
const link = await Grovs.generateLink({
    title: 'Special offer',
    data: { promoId: 'summer25' },
    customRedirects: {
        ios: { link: 'https://example.com/ios-promo', open_if_app_installed: true },
        android: { link: 'https://example.com/android-promo', open_if_app_installed: true },
        desktop: { link: 'https://example.com/desktop-promo', open_if_app_installed: false },
    },
});

With open_if_app_installed true, the app opens if installed, otherwise the redirect URL is used. With false, the redirect URL is always used. The CustomRedirects type requires all three platforms.

From 3.1.0, Android forwards each platform's own flag. In wrapper 3.0.x, Android sent the ios flag for desktop (new architecture) or always true (legacy bridge).

Pass the link to the system share sheet:

typescript
import { Share } from 'react-native';
import Grovs from 'react-native-grovs-wrapper';
 
const link = await Grovs.generateLink({ title: 'Share this', data: { itemId: 'abc' } });
await Share.share({ message: link });

linkDetails (3.1.0) fetches a link generated in the current environment by its path: the part after the domain, without the leading / and without a query string.

typescript
try {
    const details = await Grovs.linkDetails('abc123');
    console.log(details.title, details.data, details.tags);
} catch (error) {
    // the link doesn't exist, the request failed, or the SDK is disabled (code 'SDK_DISABLED')
}

The result is a LinkDetails with the backend's snake_case fields, such as path, title, subtitle, image, data, tags, access_path, active, the tracking fields and the custom redirects. An empty path rejects before the request.

Next steps

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