NUOVO

Marketing

Costruito in casa: Come il nostro programma di affiliazione ha generato entrate per 1 milione di dollari

Settembre 16, 2025
Costruito in casa: Come il nostro programma di affiliazione ha generato entrate per 1 milione di dollari

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.

Gli utenti possono creare un link di affiliazione con un nome utente di loro scelta.

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.

I dettagli degli ambasciatori sono memorizzati in un modello separato che appartiene a :user

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à.

Gli affiliati registrati possono condividere l'annuncio di Publer API come link di affiliazione.

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.

Gli utenti possono inserire manualmente il loro referrer in Impostazioni

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.

Publer AI e Publer API sono stati creati da membri dei nostri ambasciatori

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.

Alicia Noelle ha scelto questo pop-up da visualizzare ogni volta che qualcuno clicca sul suo link di affiliazione

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!

Gli affiliati possono condividere parte delle loro commissioni come sconti per i nuovi clienti segnalati.

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.

Risorse di marketing preconfezionate

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 qualità di amministratore delegato, il mio tasso di commissione è pari allo 0%.

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:

Rimaniamo in contatto

Iscrivetevi alla nostra newsletter e vi terremo aggiornati sulle nostre novità. caratteristiche rivoluzionarie e offerte speciali. Inoltre, sarete i primi a sapere sulle ultime tendenze, i suggerimenti e i trucchi dei social media.