
L’offerta di un programma di affiliazione è uno dei canali di marketing più efficaci per far crescere la vostra attività SaaS (Software as a Service), soprattutto nelle fasi iniziali.
L’idea è semplice: i vostri utenti esistenti (o affiliati) segnalano il vostro prodotto al loro pubblico attraverso un link unico, e in cambio guadagnano una piccola commissione per ogni nuovo cliente pagante che portano.
Vantaggi:
- Alto tasso di conversione (le persone acquistano da persone che conoscono, che amano e di cui si fidano)
- Si spende SOLO quando si guadagna (a differenza di annunci a pagamento, influencer e SEO).
Le commissioni variano, ma per i SaaS sono solitamente ricorrenti e si aggirano intorno al 30% dell’importo pagato dal cliente segnalato.
Molti fornitori di terze parti, come Rewardful, Tolt, FirstPromoter, PartnerStack e Dub Partners, vi permettono di lanciare immediatamente il vostro programma di affiliazione, ma se volete costruirne uno personalizzato in casa, continuate a leggere.
Perché costruire il programma di affiliazione internamente
Sebbene le soluzioni senza codice siano ottime, spesso comportano costi e molte limitazioni.
Uno dei fattori principali che ci ha portato a costruire il nostro programma di affiliazione da zero è stata l’incapacità di personalizzare le soluzioni di terze parti in base alle nostre esigenze.
Pro per costruire il vostro programma di affiliazione
- Nessuna commissione di terzi, quindi tassi di commissione più elevati
- Altamente personalizzabile, compreso un programma di ricompense per i dipendenti
Contro
- Costruire l’infrastruttura
- Gestione dei pagamenti agli affiliati
I contro non sono così gravi come sembrano, quindi tuffiamoci in questa storia.
Creare link di affiliazione
Personalmente non mi piacciono i link di affiliazione che sembrano molto generici e/o che appartengono a un (sotto)dominio diverso dal vostro.
Volevo invece che i nostri link di affiliazione si sentissero come parte del nostro sito web e fossero personalizzabili dall’utente, in modo simile a come si può scegliere la propria @ su Instagram, X o qualsiasi altro social network.
I nomi utente specifici che utilizziamo come percorsi per il nostro sito web, come /plans o /blog, sono limitati, ma a parte questo, gli affiliati possono essere creativi quanto vogliono e il nome utente può essere cambiato in qualsiasi momento.
Qualcuno ha scelto il nome utente freetrial -> publer .com/freetrial
Il nostro obiettivo è quello di convertire i nostri clienti esistenti in ambasciatori del marchio, piuttosto che offrire l’ennesimo programma di affiliazione; pertanto, abbiamo reso obbligatorio avere un account su Publer.

Abbiamo fatto un ulteriore passo avanti e ora approviamo manualmente l ‘accesso agli affiliati per gli utenti del piano gratuito.
Link multipli di affiliazione
La condivisione della homepage del prodotto di solito funziona. Tuttavia, se avete una comunità di nicchia, potrebbe essere più efficace condividere una pagina di destinazione specifica o un articolo che si rivolge direttamente ai punti dolenti della vostra comunità.
Nonostante l’utilizzo di tecnologie diverse, come Framer, Vercel e WordPress, abbiamo investito molto per fare in modo che ogni link del nostro sito sia un link di affiliazione.
Gli affiliati possono condividere qualsiasi link del nostro sito web come link di affiliazione semplicemente aggiungendo /USERNAME alla fine dell’URL.
Ecco il codice 404.php di WordPress che cattura i link del blog con /USERNAME alla fine, verifica che l’USERNAME sia valido tramite una richiesta cURL e reindirizza il visitatore al link originale passando il parametro ?referral=ID nell’URL.
<?php
$url = rtrim(strtok($_SERVER["REQUEST_URI"], '?'), '/');
$LINK_WITHOUT_AMBASSADOR = "https://publer.com/blog" . substr($url, 0, strrpos($url, '/'));
// Don't honor clicks from ads
if (!$_GET['gclid'] && !$_GET['gad_source'] && !$_GET['via']) {
preg_match("/[^\/]+$/", $url, $matches);
$AMBASSADOR = $matches[0];
$referrer = isset($_GET['referrer']) ? $_GET['referrer'] : $_SERVER['HTTP_REFERER'];
// The data to send to the API
$postData = array(
'username' => $AMBASSADOR,
'link' => 'https://publer.com/blog' . $LINK_WITHOUT_AMBASSADOR,
'referrer' => $referrer
);
// Setup cURL
$ch = curl_init('https://app.publer.com/ambassador');
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
CURLOPT_POSTFIELDS => json_encode($postData)
));
$response = curl_exec($ch);
if ($response) {
$data = json_decode($response, TRUE);
$ambassador_id = $data['id'];
header("Location: $LINK_WITHOUT_AMBASSADOR/?referral=$ambassador_id");
exit();
} else {
header("Location: $LINK_WITHOUT_AMBASSADOR/");
exit();
}
} else {
header("Location: $LINK_WITHOUT_AMBASSADOR/");
exit();
}
get_header();
?>
<div>
<h3>Oops! That page can’t be found.</h3>
<p>Try searching or go to the <a href="/blog">homepage</a></p>
</div>
In header.php, l’ID di riferimento, se esiste, viene memorizzato come cookie, che viene poi utilizzato a fini di tracciamento.
<?php
// Don't honor clicks from ads
if ($_GET['referral'] && !$_GET['gclid'] && !$_GET['gad_source'] && !$_GET['via']) {
$expiration = 30 * 24 * 60 * 60; // 30 days
echo "<script>document.cookie = 'referral=" . $_GET['referral'] . ";path=/;domain=.publer.com;max-age=$expiration;samesite=none;secure=true';</script>";
echo "<script>window.history.replaceState({}, document.title, window.location.href.split('?')[0]);</script>";
}
?>
Le soluzioni per le rotte Vercel e Framer differiscono leggermente e/o sono più complesse, ma la logica di fondo rimane la stessa. Non esitate a inviarmi un ping se desiderate gli snippet di codice per queste soluzioni.
Tracciamento dei link affiliati
Il modo più semplice per tracciare i referral è attraverso i cookie a tempo, che di solito sono validi per 30 o 60 giorni.
I cookie sono piccoli file di testo che i siti web inviano al browser dell’utente per memorizzare informazioni sulla sua visita.
Memorizziamo il cookie di riferimento a livello di .domain in modo che il sottodominio dell’app possa accedervi.
Ogni volta che qualcuno si iscrive alla nostra piattaforma, eseguiamo questo metodo Ruby helper per verificare se proviene da un link di affiliazione, ovvero se esiste un cookie di riferimento.
def check_referral(user)
referral = cookies[:referral]
return if referral.blank?
# Mark referred user as such and offer a sign up commission
Ambassador::CommissionsService.new(user, referral).registration_commission
cookies.delete(:referral)
end
Tracciamento delle installazioni di app mobili
I cookie sono ottimi per il tracciamento su piattaforme web, ma le cose si complicano se offrite un’applicazione mobile.
Non è possibile passare parametri di tracciamento personalizzati a Google Play o Apple App Store, quindi questo è stato il nostro workaround:
- Prima di reindirizzare i visitatori a Google Play o Apple App Store dal nostro sito web
- Copiamo negli appunti il cookie di riferimento (se esiste)
- E utilizzare l’ID copiato quando il visitatore installa l’app e si iscrive
Anche se sulla carta è buona, questa soluzione non è a prova di bomba. Il visitatore potrebbe copiare qualcos’altro prima di iscriversi tramite la nostra applicazione mobile, oppure il sistema operativo potrebbe non consentire la copia negli appunti senza autorizzazione.
Riferimenti mancanti
È normale che qualcuno faccia clic su un link di affiliazione dal telefono, ma decida di saperne di più e di iscriversi via web.
I cookie non sono cross-device e non sono cross-browser.
Per evitare inutili ticket di assistenza clienti e modifiche manuali al database, consentiamo agli utenti di specificare volontariamente se qualcuno li ha indirizzati a Publer.
Metriche monitorate
Anche se gli insight non sono stati il nostro obiettivo principale, teniamo traccia delle seguenti metriche essenziali:
- Numero di clic giornalieri e totali
- Numero di iscrizioni giornaliere e totali
- Numero di aggiornamenti giornalieri
- I link (affiliati) più cliccati
- Siti di riferimento principali
Il cruscotto di affiliazione è stato costruito nel 2016 utilizzando jQuery, Chartist, Bootstrap e DataTables. Niente di eclatante, ma fa ancora il suo lavoro a distanza di 10 anni senza bisogno di manutenzione.
Commissioni e pagamenti
Per ogni pagamento effettuato da un cliente segnalato, l’affiliato ha diritto a una commissione di circa il 30%.
Per chi paga 10 dollari al mese, l’affiliato guadagnerebbe 3 dollari al mese.
RATE = 0.3 # 30% commission
def payment_commission(payment, next_bill_date)
monthly_price = payment.unit_price.to_f
commission = (monthly_price * RATE).round(2)
Ambassador::Commission.create(created_at: Time.current, commission: commission, user: @user, ambassador: @ambassador, payment: payment)
Notification.create(reason: 'commission_pending', user_id: @ambassador.user.id.to_s)
end
Le commissioni maturate vengono generalmente messe in attesa per 30 giorni per soddisfare eventuali richieste di rimborso.
Si tratta di un lavoro giornaliero che contrassegna automaticamente le commissioni come “approvate” o “rifiutate” a seconda dello stato del pagamento e una volta trascorsi 30 giorni.
scheduler.cron '7 18 * * *' do # Every day at 18:07 UTC
Ambassador::CommissionsTask.new.execute
end
module Ambassador
class CommissionsTask
def execute
pipeline = [
{ '$match': { state: 'pending', created_at: { '$lte': 30.days.ago.beginning_of_day } } },
{ '$project': { _id: 1 } }
]
ids = Ambassador::Commission.collection.aggregate(pipeline).map { |oid| oid.as_json['_id']['$oid'] }
ids.each_slice(BATCH_SIZE) do |bulk|
# Mark as 'approved' or 'declined' depending on the payment status
Ambassador::CommissionsWorker.perform_async(bulk)
end
end
end
end
Le commissioni approvate vengono poi raggruppate e pagate quando la somma raggiunge una soglia specifica, di solito 20 o 50 dollari.
Tracciamento delle commissioni
Gli affiliati possono vedere in tempo reale ogni commissione guadagnata e ogni cliente pagante che hanno portato, oltre ad alcuni dettagli relativi al loro piano.

Affiliati paganti
Questo è probabilmente il più grande svantaggio quando si tratta di gestire un programma di affiliazione interno:
- È necessario capire come pagare gli affiliati, ad esempio con PayPal, Stripe, ecc.
- La vostra attività deve essere registrata in un paese supportato da PayPal o Stripe.
- È necessario gestire i moduli fiscali, le ritenute, la contabilità e la rendicontazione.
Tuttavia, utilizzando servizi online come FirstBase e Online Taxman è molto facile incorporarsi negli Stati Uniti e mantenere il proprio status legale.
👉 Come incorporare e aprire un conto bancario negli Stati Uniti
I pagamenti possono essere completamente automatizzati su base mensile o bisettimanale.
scheduler.cron '7 13 1 * *' # First day of the month at 13:07 UTC
Ambassador::PayoutsTask.new.execute
end
Pagamenti con PayPal
PayPal è il metodo più semplice, in quanto l’affiliato deve solo fornire il proprio indirizzo e-mail PayPal.
module Ambassador
class PaypalPayoutsWorker
include Sidekiq::Worker
def perform(params)
commission_ids = []
payout_items = params.map do |item|
ambassador = Ambassador::Detail.find(item['ambassador'])
receiver = ambassador.payout_method&.[](:email)
next unless receiver
commission_ids.concat(item['commissions'])
{
recipient_type: 'EMAIL',
amount: {
value: item['total'].round(2),
currency: 'USD'
},
note: <<~NOTE,
Thank you for being an Ambassador of #PublerNation.
Login to your dashboard: <a href='https://app.publer.com/ambassador'>https://app.publer.com/ambassador</a><br>
NOTE
sender_item_id: ambassador.username,
receiver: receiver
}
end
payout_params = {
sender_batch_header: {
sender_batch_id: SecureRandom.hex(8),
email_subject: 'Your payment from the Publer Ambassador program!'
},
items: payout_items.compact
}
payout = PayPal::SDK::REST::DataTypes::Payout.new(payout_params)
Ambassador::Commission.in(id: commission_ids.map { |id| BSON::ObjectId(id) }).update_all(state: 'sending')
payout.create
rescue => ex
Sentry.capture_exception(ex, extra: { params: params })
end
end
end
L’unico inconveniente di PayPal è che è necessario impostare un endpoint e ascoltare i webhook di PayPal, che notificano se i pagamenti sono andati a buon fine o meno.
Stripe Connect
Stripe è un’altra eccellente alternativa per coloro che non possono o preferiscono non utilizzare PayPal.
A differenza di PayPal, gli affiliati che utilizzano Stripe devono completare alcune fasi di onboarding per fornire i propri dati personali e le coordinate bancarie.
Una volta che l’affiliato ha completato l’onboarding, il pagamento delle commissioni approvate avviene in un’unica fase.
module Ambassador
class StripePayoutsWorker
include Sidekiq::Worker
include AmbassadorHelpers
def perform(payout)
ambassador = Ambassador::Detail.find(payout['ambassador'])
commissions = Ambassador::Commission.where(_id: { '$in': payout['commissions'] })
commissions.update_all(state: 'sending')
params = { currency: 'usd',
amount: (payout['total'] * 100).to_i,
destination: ambassador.payout_method[:id],
description: 'Thank you for being an Ambassador of #PublerNation!' }
transfer = Stripe::Transfer.create(params)
notify_payout(payout['total'], transfer.id, ambassador, :stripe)
rescue => ex
commissions&.update_all(state: 'approved')
Sentry.capture_exception(ex, extra: { payout: payout })
end
end
end
Mentre i pagamenti di PayPal vengono inviati tramite PayPal, quelli di Stripe vengono depositati direttamente sul conto bancario collegato dell’affiliato.
Incentivazione del programma di affiliazione
Se pensate che la creazione di un programma di affiliazione sia tutto ciò che serve per far sì che influencer e clienti inizino a promuovere il vostro prodotto, vi aspetta una delusione.
Di seguito sono riportati alcuni degli incentivi personalizzati che abbiamo implementato per il nostro programma di affiliazione.
Tassi di commissione progressivi
I tassi di commissione standard iniziano come segue:
- 0,25 dollari per ogni nuova iscrizione legittima, indipendentemente dal fatto che il piano venga aggiornato o meno
- 50% di commissione sul primo pagamento mensile per ogni nuovo cliente pagante
- 20% di commissione sui pagamenti ricorrenti per i clienti che pagano attivamente
In base alle vendite effettuate dall’affiliato nel mese precedente, le commissioni possono aumentare:
- $0 – $500 → 50% di commissione per il primo pagamento, 20% per i pagamenti ricorrenti
- 500 – 1.000 dollari → 60% e 25% rispettivamente
- > 1.000 dollari → 70% e 30% rispettivamente
Per i grandi influencer offriamo tassi di commissione fissi, ma più elevati.
Accesso anticipato alle nuove funzionalità
Coloro che promuovono attivamente Publer, indipendentemente dal loro successo, hanno la possibilità di testare le nuove funzionalità prima di tutti gli altri, di lasciare feedback e quindi di entrare direttamente nel processo decisionale.
Frequenza di pagamento
Analogamente all’accesso anticipato alle nuove funzionalità, gli affiliati che lavorano più duramente vengono pagati bisettimanalmente, anziché mensilmente.
Premi in denaro
Abbiamo stanziato un budget mensile di 175 dollari per i primi 3 affiliati (in base alle entrate mensili derivanti da nuovi clienti paganti).
Testimonianza popup
Le persone acquistano da persone (o marchi) che conoscono, che amano e di cui si fidano, quindi volevamo che i nostri affiliati facessero parte del nostro sito web, letteralmente.
Suggerimento: i popup supportano il markdown, quindi gli affiliati possono collegare il loro sito web aziendale o personale alla loro testimonianza per ottenere una maggiore consapevolezza del marchio.
Condivisione dello sconto
Perché qualcuno dovrebbe iscriversi a un servizio utilizzando un link di affiliazione invece di andare direttamente al sito web? Gli sconti sono sempre un ottimo motivo!

Creare una comunità intorno al programma di affiliazione
Infine, è necessario stabilire canali di comunicazione tra voi e i vostri affiliati.
- Email automatiche per condividere report e classifiche
- Gruppo Facebook dedicato per condividere aggiornamenti e novità sui prodotti
Ed è sempre un’ottima idea preparare grafiche, tutorial e post già pronti.
Suggerimenti SEO
Avere link di affiliazione come parte del vostro dominio principale è un vantaggio SEO significativo, ma può anche ritorcersi contro di voi.
Indicizzazione
Non volete che i link di affiliazione appaiano nei risultati di Google Search ogni volta che qualcuno cerca il vostro prodotto, giusto?
È necessario assicurarsi che i motori di ricerca non indicizzino i link di affiliazione.
<Header image={image} description={description} title={title} url={url}>
<meta name="robots" content="noindex" />
</Header>
URL canonico
Inoltre, non è consigliabile avere più link per la stessa pagina di destinazione, in quanto ciò porterebbe alla cannibalizzazione delle parole chiave (link che si contendono il traffico).
Invece, l’URL canonico dovrebbe sempre essere quello non affiliato.
<link rel="canonical" href="https://publer.com"> ✅
<link rel="canonical" href="https://publer.com/affiliate"> ❌
<link rel="canonical" href="https://publer.com/anotherone"> ❌
<link rel="canonical" href="https://publer.com/random123"> ❌
Pulizia dell’URL
Una volta memorizzato il cookie di affiliazione nel browser, è sempre una buona idea cancellare i parametri di tracciamento dall’URL della barra degli indirizzi.
removeURLParameter('username');
removeURLParameter('referrer');
const removeURLParameter = useCallback(
(parameter) => {
let params = new URLSearchParams(window.location.search);
params.delete(parameter);
const url = constructURL(params.toString());
window.history.replaceState({}, document.title, url);
},
[constructURL]
);
In caso contrario, i visitatori potrebbero accidentalmente condividere il link di affiliazione e causare inutili commissioni di affiliazione, a meno che non si offra un programma di affiliazione multilivello (una struttura di commissioni in cui un affiliato guadagna non solo dalle sue vendite dirette, ma anche dalle vendite generate dalle sue vendite dirette).
Prevenzione degli annunci
In quasi tutti i programmi di affiliazione, il primo termine da concordare è il seguente:
Continuando accetti di non utilizzare annunci a pagamento per promuovere i tuoi link di affiliazione, il nostro sito web o le parole chiave del nostro marchio.
Questo perché non volete che gli affiliati facciano offerte per il traffico di parole chiave verso il vostro sito web o il vostro marchio.
Inoltre, non volete che vengano visualizzati annunci di affiliazione casuali su Google quando qualcuno cerca il vostro prodotto. Perdete con l’offerta di parole chiave e perdete con le commissioni di affiliazione.
Ma le regole sono fatte per essere infrante, quindi l’unico modo per impedire del tutto agli affiliati di pubblicare annunci è quello di non onorare i clic e le commissioni derivanti da tali annunci.
const router = useRouter();
const { ambassador, referrer, gclid, gad_source, via } = router.query;
const isAffiliateMarketingNetwork = (referrer) => {
return /shareasale\.com|googleadservices\.com|google\.com/.test(referrer || '');
};
useEffect(() => {
// Don't honor clicks from ads
router.push({
pathname: '/',
query:
gclid || gad_source || via || isAffiliateMarketingNetwork(referrer)
? {}
: { username: ambassador, referrer },
});
}, [ambassador, referrer, gclid, gad_source, via, router]);
Trasformare il programma di affiliazione in un programma di ricompensa per i dipendenti
Non importa quanto si paghi in commissioni, i migliori ambasciatori di un marchio saranno sempre i suoi dipendenti.
Sarebbe un peccato non offrire commissioni simili al vostro team di marketing e assistenza, soprattutto se disponete già dell’infrastruttura.
Ogni volta che qualcuno decide di aggiornare il proprio piano su Publer, appare questa maschera.
Il dipendente selezionato, ad eccezione di me, riceverà una commissione del 10% sui pagamenti per un periodo massimo di un anno, un ottimo incentivo per chiunque voglia fare il passo più lungo della gamba.
Proprio come qualsiasi altro affiliato, utilizzando la stessa dashboard, i dipendenti possono anche condividere il loro link unico per attirare nuovi clienti dai social media e non solo.
E c’è un premio aggiuntivo di 50 dollari per il miglior dipendente del mese (basato sulle entrate provenienti da nuovi clienti paganti).
Ritorno sull’investimento
Sebbene questo programma di affiliazione abbia compiuto 10 anni, il suo sviluppo iniziale è durato solo poche settimane, con alcuni aggiornamenti minori apportati nel corso degli anni. È una macchina generatrice di entrate completamente autonoma.
Ad oggi, abbiamo pagato ai nostri affiliati, compresi i dipendenti, oltre 208.000 dollari in commissioni.
In cambio, abbiamo guadagnato 742.000 dollari di profitto (esclusi i ricavi del mio personal branding).
Con un ROI del 355%, questo programma di affiliazione supera con ampio margine ogni altro canale di marketing che abbiamo testato finora.
Piani per il futuro
Visto il successo di queste poche righe di codice, sto seriamente pensando di offrire ciò che abbiamo costruito come prodotto SaaS autonomo.
Sarebbe una grande aggiunta alla nostra missione di potenziare la vostra presenza online.
Fatemi sapere se è una cosa che vi interessa.
E se siete arrivati a leggere fino a qui, spero che ne sia valsa la pena.
Grazie!
Altri aggiornamenti che potrebbero esservi sfuggiti: