Create your affiliate program in under 15 minutes with the help of our quickstart guide. Then invite your dev team to complete installation.

Follow your program checklist to test, launch, and promote your affiliate program. With GrowSurf, you'll get guided every step of the way to ensure you find success with your affiliate marketing efforts.

Real-time analytics and admin dashboard give you powerful insights like who your top affiliates are and the engagement funnel for your affiliate program, while weekly and monthly email reports keep you in the loop.

Next, tell GrowSurf when a new customer signs up through an affiliate link. Choose one of the options below based on how your signup flow works.
Add one GrowSurf script to your signup page and GrowSurf can connect each signup back to the affiliate who shared the link. It attaches affiliate tracking to the signup flow and landing pages you already use, so you do not need to change how new users or leads sign up today.
<script type='text/javascript'>
(function(g,r,s,f){g.grsfSettings={campaignId:'45hxmj',version:'2.0.0'};s=r.getElementsByTagName('head')[0];f=r.createElement('script');f.async=1;f.src='https://app.growsurf.com/growsurf.js'+'?v='+g.grsfSettings.version;f.setAttribute('grsf-campaign', g.grsfSettings.campaignId);!g.grsfInit?s.appendChild(f):';})(window,document);
</script>
After the script is installed, referred visitors still use your normal signup flow. The difference is that the page can now show invite details for that visitor, such as who sent them there and the offer tied to the visit. See the before and after example below:
Before AfterIf you use a custom form or single-page app, send the signup to GrowSurf with
growsurf.addParticipant() . Pass the new customer's email and GrowSurf can match them to the affiliate from the browser cookie.growsurf.addParticipant({
email: '[email protected]',
firstName: 'Gavin',
lastName: 'Belson',
// Optional: Save any custom data as participant metadata
country: 'UK',
subscriptionPlan: 'Pro',
});
You can also send extra fields as metadata if you want to use them later in reports or automations.
If signups happen inside your native iOS or Android app, use the GrowSurf mobile SDK. There are two parts: capture the affiliate attribution when the new customer opens the link, then create the referred participant when they sign up.
1. Capture attribution
Capture affiliate attribution before you create the referred participant, so the referral survives the journey from link to signup. A referred customer can arrive two ways: by opening your already-installed app (a direct deep link), or by installing the app first and opening it later (a deferred deep link). For deferred links, GrowSurf provides adapters for Branch, Adjust, AppsFlyer, and Singular (see the iOS and Android adapter docs); on Android it can also read the Google Play Install Referrer natively.
Direct deep link
if let url {
try await growsurf.handleDeepLink(url)
}
Deferred deep link (attribution provider)
import GrowSurfBranchAttribution
// Forward your provider's deferred deep link (Branch shown; Adjust, AppsFlyer, and Singular work the same)
try await GrowSurfBranchAttribution.handle(branchParams, sdk: growsurf)
Direct deep link
intent.data?.let { uri ->
growsurf.handleDeepLink(uri)
}
Deferred deep link (attribution provider)
lifecycleScope.launch {
// Native: read the Google Play Install Referrer
growsurf.handleDeferredDeepLink()
// Or forward an attribution provider's data (Branch, Adjust, AppsFlyer, Singular)
GrowSurfBranchAttribution.handle(branchParams, growsurf)
}
2. Create a referred participant
When the new customer signs up, call
addReferredParticipant(). The SDK validates the saved attribution and only creates the participant when the referral code is valid.// Only creates a referred participant if the referral code is valid
let created = try await growsurf.addReferredParticipant(
.init(
email: "[email protected]",
firstName: "Gavin",
lastName: "Belson",
metadata: ["subscriptionPlan": "Pro"] // Optional, saved as participant metadata
)
)
let participant = created.participant
// Only creates a referred participant if the referral code is valid
val created = growsurf.addReferredParticipant(
GrowSurfParticipantInput(
email = "[email protected]",
firstName = "Gavin",
lastName = "Belson",
metadata = mapOf("subscriptionPlan" to "Pro"), // Optional, saved as participant metadata
)
)
val participant = created.participant
You can also send extra fields as metadata if you want to use them later in reports or automations.
If your signups happen on your server, send the signup through
/POST Add Participant . Pass the new customer's email plus referredBy, which can be the affiliate ID or email address, or retrieve it with growsurf.getReferrerId() on the web, pendingAttribution() on iOS, or getPendingAttribution() on Android.curl -X POST 'https://api.growsurf.com/v2/campaign/45hxmj/participant' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d $'{
"email": "[email protected]",
"firstName": "Gavin",
"lastName": "Belson",
"referredBy": "richard-h8kp6l",
# Optional: Save custom fields as participant metadata
"metadata": {
"country": "UK",
"subscriptionPlan": "Pro"
}
}'
You can also send extra fields as metadata if you want to use them later in reports or automations.
Then tell GrowSurf when a referred customer pays. Choose one of the options below based on how you track purchases. GrowSurf keeps commissions up to date even on refunds or chargebacks.
Connecting to an integration takes less than one minute.
Connect Stripe to track purchases and calculate commissions
Alternatively, use our JavaScript method
growsurf.triggerReferral() to trigger referrals on any front-end event. Just provide the email address of the referred friend who completes the action that you deem as the qualifying event.growsurf.triggerReferral('[email protected]');If you are not using Stripe as your billing system, use
/POST Add Transaction by Participant Email to send each purchase to GrowSurf so it can calculate the commission. Just provide the email address of the referred customer and the transaction details.curl -X POST 'https://api.growsurf.com/v2/campaign/45hxmj/participant/[email protected]/transaction' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d $'{
"currency": "USD",
"grossAmount": 9900,
"amountCashNet": 7900,
"invoiceId": "invoice_54",
"paidAt": 1733702400000,
"description": "Renewal for Pro subscription"
}'
Finally, pay affiliates. GrowSurf emails affiliates when they earn a payout, and once they qualify, you can send payouts in bulk from the dashboard.
Connect to PayPal in less than one minute.
Connect PayPal to send payouts in bulk
You can set a minimum payout amount, such as $50, so you do not send very small payouts. GrowSurf does not charge a payout processing fee.

If you want full control, use webhooks and handle payouts or rewards in your own system. You can also pass reward metadata so your team can change payout rules without changing code each time.
// Node.js webhook example
app.post('/your/webhook/payload-url', function(req, res) {
const body = req.body;
try {
if (body.event === 'PARTICIPANT_REACHED_A_GOAL') {
// Write code here to do something when a participant wins a reward
console.log(`${body.data.participant.email} just won this reward: ${body.data.reward.description}`);
// If the reward is approved
if (body.data && body.data.reward && body.data.reward.approved) {
// Do something
// Optional: If there is any reward metadata, use it:
if (body.data.reward.metadata && body.data.reward.metadata["proRewardValue"]) {
console.log(`${body.data.participant.email} earned an amount of ${body.data.reward.metadata["proRewardValue"]}.`);
}
}
// If this is a double-sided reward, use body.data.reward.isReferrer to determine if this is for the referrer or referred person
if (body.data && body.data.reward && body.data.reward.isReferrer) {
// Do something
}
}
} catch (err) {
res.status(400).end();
}
res.json({received: true});
});
First, give each affiliate a place to get their link, share it, and see their signups, commissions, and payouts. Here are three simple ways to do that.
If your affiliates are not users of your product, use the hosted page that comes with your program. You can also put it on your own subdomain, such as https://affiliates.yoursite.com.

Use a popup if you want a simple way to show each affiliate their link, referrals, commissions, and payouts inside your product / web app. Open it from any button in your UI and pass the logged-in user's email so GrowSurf knows whose details to show.
Example button code:
<a class="growsurf-window-open"
data-grsf-email="[email protected]"
data-grsf-first-name="Gavin"
data-grsf-last-name="Belson">
Refer and Earn $100
</a>
If you want this inside your own app, embed the pieces you need on your affiliate page. When the user is logged in, their link and stats can load automatically.
Referral Link - Show each affiliate's referral link

Example embed code:
<div data-grsf-block-form
data-grsf-email="[email protected]"
data-grsf-first-name="Gavin"
data-grsf-last-name="Belson"
></div>
Invite Form - Let affiliates send email invites from this page

Example embed code:
<div data-grsf-block-invite></div>Referral Status - Show each affiliate's progress

Example embed code:
<div data-grsf-block-referral-status></div>You can style these embedded blocks to match your product. See our docs for setup details.
Have a native iOS or Android app? Use the GrowSurf mobile SDK to show each affiliate their link, referrals, commissions, and payouts in a native window. Open it from any button in your app with
presentGrowSurfWindow() and pass a participant token so GrowSurf knows whose details to show.
iOS

Android
Example code:
growsurf.presentGrowSurfWindow(
from: viewController,
identity: .existingParticipantToken(participantToken)
)
growsurf.presentGrowSurfWindow(
activity = this,
identity = GrowSurfWindowIdentity.ExistingParticipantToken(participantToken)
)
Connect your email tool to add affiliate links to the emails you already send.
Add affiliate links to email campaigns and transactional emails

Chargebee
Webhooks

