
Ofrecer un programa de afiliación es uno de los canales de marketing más eficaces para hacer crecer su negocio de SaaS (software como servicio), especialmente en las primeras etapas.
La idea es sencilla: tus usuarios actuales (o afiliados) recomiendan tu producto a su público a través de un enlace único y, a cambio, ganan una pequeña comisión por cada nuevo cliente de pago que traigan.
Ventajas:
- Alta tasa de conversión (la gente compra a personas que conoce, le gustan y en las que confía)
- Sólo gastas dinero cuando ganas dinero (a diferencia de los anuncios de pago, los influencers y el SEO)
Las comisiones varían, pero en el caso del SaaS suelen ser recurrentes y rondan el 30% del importe pagado por el cliente referido.
Muchos proveedores externos, como Rewardful, Tolt, FirstPromoter, PartnerStack y Dub Partners, le permiten poner en marcha su programa de afiliación al instante, pero si desea crear uno personalizado internamente, siga leyendo.
¿Por qué crear el programa de afiliación internamente?
Aunque las soluciones sin código son estupendas, suelen conllevar comisiones y muchas limitaciones.
Uno de los principales factores que nos llevó a crear nuestro programa de afiliación desde cero fue la imposibilidad de adaptar las soluciones de terceros a nuestras necesidades.
Ventajas para crear su programa de afiliación
- Sin gastos de terceros, por lo que las comisiones son más elevadas
- Altamente personalizable, incluido un programa de recompensas para empleados
Contras
- Construir la infraestructura
- Gestión de los pagos a los afiliados
Los contras no son tan malos como parecen, así que entremos en materia.
Crear enlaces de afiliación
Personalmente, no me gustan los enlaces de afiliación que parecen muy genéricos y/o pertenecen a un (sub)dominio diferente al tuyo.
En su lugar, quería que nuestros enlaces de afiliados se sintieran como parte de nuestro sitio web y que el usuario pudiera personalizarlos, de forma similar a como alguien puede elegir su @ en Instagram, X o cualquier otra red social.
Los nombres de usuario específicos que utilizamos como rutas para nuestro sitio web, como /planes o /blog, están restringidos, pero aparte de eso, los afiliados pueden ser todo lo creativos que quieran, y el nombre de usuario puede cambiarse en cualquier momento.
Alguien ha elegido el nombre de usuario freetrial -> publer .com/freetrial
Nuestro objetivo es convertir a nuestros clientes actuales en embajadores de la marca, en lugar de ofrecer otro programa de afiliación más; por lo tanto, hemos hecho que sea obligatorio tener una cuenta en Publer.

Hemos dado un paso más y ahora aprobamos manualmente el acceso de afiliados para los usuarios del plan gratuito.
Múltiples enlaces de afiliados
Compartir la página de inicio del producto suele funcionar. Sin embargo, si tienes una comunidad de nicho, puede ser más eficaz compartir una página de destino específica o un artículo que se dirija directamente a los puntos débiles de tu comunidad.
A pesar de utilizar diferentes tecnologías, como Framer, Vercel y WordPress, hemos invertido una cantidad significativa para hacer posible que cada enlace de nuestro sitio web sea un enlace de afiliado.
Los afiliados pueden compartir cualquier enlace de nuestro sitio web como enlace de afiliado simplemente añadiendo /USERNAME al final de la URL.
Este es el código 404.php de WordPress que captura enlaces de blog con /USERNAME al final, verifica que el USERNAME es válido mediante una petición cURL, y redirige al visitante de vuelta al enlace original pasando el parámetro ?referral=ID en la 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>
En header.php, el ID de referencia, si existe, se almacena como una cookie, que luego se utiliza con fines de seguimiento.
<?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>";
}
?>
Las soluciones para las rutas Vercel y Framer difieren ligeramente y/o son más complejas, pero la lógica subyacente sigue siendo la misma. No dude en enviarme un ping si desea los fragmentos de código para ellos.
Seguimiento de enlaces de afiliados
La forma más sencilla de realizar un seguimiento de las referencias es mediante cookies temporales, que suelen tener una validez de 30 o 60 días.
Las cookies son pequeños archivos de texto que los sitios web envían a su navegador para almacenar información sobre su visita.
Almacenamos la cookie de referencia en el nivel .domain para que el subdominio de la aplicación pueda acceder a ella.
Cada vez que alguien se registra en nuestra plataforma, ejecutamos este método Ruby helper para comprobar si proceden de un enlace de afiliado, es decir, si existe la cookie de referencia.
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
Seguimiento de las instalaciones de aplicaciones móviles
Las cookies son excelentes para el seguimiento en plataformas web, pero las cosas se complican si ofreces una aplicación móvil.
No se pueden pasar parámetros de seguimiento personalizados a Google Play o Apple App Store, así que esta fue nuestra solución:
- Antes de redirigir a los visitantes a Google Play o Apple App Store desde nuestro sitio web
- Copiamos en el portapapeles la cookie de referencia (si existe)
- Y utilizar el ID copiado cuando el visitante instale la aplicación y se registre.
Aunque es buena sobre el papel, esta solución no es a prueba de balas. Es posible que el visitante copie otra cosa antes de registrarse a través de nuestra aplicación móvil, o que el sistema operativo no permita copiar al portapapeles sin permiso.
Faltan remisiones
Es normal que alguien haga clic en un enlace de afiliado desde su teléfono, pero decida obtener más información y registrarse a través de la web.
Las cookies no son multidispositivo ni multinavegador.
Para evitar tickets innecesarios de atención al cliente y cambios manuales en la base de datos, permitimos que los usuarios especifiquen voluntariamente si alguien les recomendó Publer.
Métricas seguidas
Aunque la información no ha sido nuestro principal objetivo, sí llevamos un seguimiento de las siguientes métricas esenciales:
- Número de clics diarios y totales
- Número de inscripciones diarias y totales
- Número de actualizaciones diarias
- Enlaces (afiliados) más visitados
- Principales sitios de referencia
El panel de afiliados se creó en 2016 con jQuery, Chartist, Bootstrap y DataTables. Nada del otro mundo, pero sigue cumpliendo su función 10 años después sin necesidad de mantenimiento.
Comisiones y pagos
Por cada pago realizado por un cliente referido, el afiliado tiene derecho a una comisión de aproximadamente el 30%.
Por alguien que paga 10 $/mes, el afiliado ganaría 3 $/mes
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
Las comisiones ganadas suelen quedar en suspenso durante 30 días para atender las solicitudes de reembolso que puedan surgir.
Se trata de un trabajo diario que marca automáticamente las comisiones como «aprobadas» o «rechazadas» en función del estado del pago, y una vez transcurridos 30 días.
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
A continuación, las comisiones aprobadas se agrupan y se pagan una vez que la suma alcanza un umbral específico, normalmente 20 o 50 dólares.
Seguimiento de las comisiones
Los afiliados pueden ver en tiempo real todas las comisiones ganadas y todos los clientes de pago que han traído, junto con algunos detalles sobre su plan.

Afiliados de pago
Esta es probablemente la mayor desventaja a la hora de gestionar un programa de afiliación interno:
- Tienes que averiguar cómo pagar a los afiliados, es decir, PayPal, Stripe, etc.
- Su empresa debe estar registrada en un país compatible con PayPal o Stripe.
- Tienes que ocuparte de los formularios fiscales, las retenciones, la contabilidad y los informes
Sin embargo, utilizando servicios en línea como FirstBase y Online Taxman es muy fácil constituir una sociedad en Estados Unidos y mantener su estatuto jurídico.
👉 Cómo constituir una sociedad y abrir una cuenta bancaria en Estados Unidos
Los pagos pueden automatizarse por completo con una periodicidad mensual o quincenal.
scheduler.cron '7 13 1 * *' # First day of the month at 13:07 UTC
Ambassador::PayoutsTask.new.execute
end
Pagos con PayPal
PayPal es el método más sencillo, ya que el afiliado sólo tiene que facilitar su dirección de correo electrónico de 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
El único inconveniente de PayPal es que debe configurar un punto final y escuchar los webhooks de PayPal, que le notifican si los pagos se han realizado correctamente o no.
Raya Connect
Stripe es otra excelente alternativa para aquellos que no pueden o prefieren no utilizar PayPal.
A diferencia de PayPal, los afiliados de Stripe tienen que completar unos pocos pasos para proporcionar su información personal y los datos de su cuenta bancaria.
Una vez que el afiliado ha completado su incorporación, el pago de sus comisiones aprobadas es un proceso de un solo paso.
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
Mientras que los pagos de PayPal se envían a través de PayPal, los pagos de Stripe se depositan directamente en la cuenta bancaria conectada del afiliado.
Incentivar el programa de afiliación
Si crees que basta con crear un programa de afiliación para que influencers y clientes empiecen a promocionar tu producto, te vas a llevar un chasco.
A continuación encontrará algunos de los incentivos personalizados que hemos implementado para nuestro programa de afiliados.
Comisiones progresivas
Las comisiones estándar son las siguientes
- 0,25 $ por cada nueva inscripción legítima, independientemente de si actualizan o no su plan.
- 50% de comisión sobre la primera mensualidad de cada nuevo cliente de pago
- 20% de comisión sobre los pagos recurrentes de los clientes que pagan activamente
Y en función de las ventas que el afiliado haya realizado el mes anterior, las comisiones pueden subir:
- 0 $ – 500 $ → 50% de comisión por el primer pago, 20% en pagos periódicos
- 500 $ – 1.000 $ → 60% y 25%, respectivamente.
- > 1.000 dólares → 70% y 30% respectivamente
A los grandes influencers les ofrecemos comisiones fijas, pero más elevadas
Acceso anticipado a nuevas funciones
Los que promueven activamente Publer, independientemente de su éxito, consiguen probar las nuevas funciones antes que los demás, dejan sus comentarios y, por lo tanto, pasan a formar parte directamente del proceso de toma de decisiones.
Frecuencia de pago
Al igual que ocurre con el acceso anticipado a las nuevas funciones, los afiliados que más trabajan cobran quincenalmente, en lugar de mensualmente.
Premios
Hemos asignado un presupuesto mensual de 175 $ para los 3 mejores afiliados (basado en los ingresos mensuales aportados por los nuevos clientes de pago).
Ventana emergente de testimonios
La gente compra a personas (o marcas) que conoce, le gustan y en las que confía, así que queríamos que nuestros afiliados formaran parte de nuestro sitio web, literalmente.
Consejo de experto: Los popups admiten markdown, por lo que los afiliados pueden enlazar su negocio o sitio web personal en su testimonio para dar a conocer su marca.
Descuentos compartidos
¿Por qué iba alguien a contratar un servicio utilizando un enlace de afiliado en lugar de ir directamente al sitio web? Los descuentos son siempre un buen motivo.

Crear una comunidad en torno al programa de afiliación
Por último, debe establecer canales de comunicación entre usted y sus afiliados.
- Correos electrónicos automáticos para compartir informes y clasificaciones
- Grupo de Facebook específico para compartir actualizaciones y noticias sobre productos
Y siempre es una buena idea preparar gráficos, tutoriales y entradas ya preparados.
Consejos SEO
Tener enlaces de afiliados como parte de su dominio principal es una ventaja SEO significativa, pero también puede ser contraproducente para usted.
Indexación
No querrás que aparezcan enlaces de afiliados en los resultados de búsqueda de Google cada vez que alguien busque tu producto, ¿verdad?
Debe asegurarse de que los motores de búsqueda no indexen los enlaces de afiliados.
<Header image={image} description={description} title={title} url={url}>
<meta name="robots" content="noindex" />
</Header>
URL canónica
Tampoco querrá tener varios enlaces para la misma página de destino, ya que eso provocaría canibalización de palabras clave (enlaces que luchan entre sí por el tráfico).
En su lugar, la URL canónica debe ser siempre la no afiliada.
<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"> ❌
Limpieza de URL
Una vez que haya almacenado la cookie de afiliado en el navegador, siempre es una buena idea borrar los parámetros de seguimiento de la URL de la barra de direcciones.
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]
);
De lo contrario, los visitantes podrían volver a compartir accidentalmente el enlace de afiliado y causarle comisiones de afiliación innecesarias, a menos que ofrezca un programa de afiliación de varios niveles (una estructura de comisiones en la que un afiliado gana no sólo de sus ventas directas, sino también de las ventas generadas por sus ventas directas).
Prevención de anuncios
En casi todos los programas de afiliación, el primer término que hay que acordar es el siguiente:
Al continuar, acepta no utilizar anuncios de pago para promocionar sus enlaces de afiliado, nuestro sitio web o las palabras clave de nuestra marca.
Esto se debe a que no desea que los afiliados pujen por el tráfico de palabras clave hacia su sitio web o marca.
Tampoco quieres que aparezcan anuncios de afiliados aleatorios en Google cuando alguien busque tu producto. Pierdes con las pujas por palabras clave y pierdes en comisiones de afiliación.
Pero las reglas están para romperlas, así que la única forma de evitar por completo que los afiliados publiquen anuncios es no pagar los clics y las comisiones de dichos anuncios.
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]);
Convertir el programa de afiliación en un programa de recompensas para los empleados
Por mucho que pague en comisiones, los mejores embajadores de una marca siempre serán sus empleados
Sería una pena no ofrecer comisiones similares a su equipo de marketing y asistencia, sobre todo si ya dispone de la infraestructura necesaria.
Cada vez que alguien decide actualizar su plan en Publer, aparece este modal.
El empleado seleccionado, excepto yo, recibirá una comisión del 10% sobre los pagos hasta un año, un excelente incentivo para que cualquiera haga un esfuerzo adicional.
Al igual que cualquier otro afiliado, utilizando el mismo panel de control, los empleados también pueden compartir su enlace exclusivo para atraer a nuevos clientes desde las redes sociales y más allá.
Y hay un premio adicional de 50 $ para el mejor empleado del mes (basado en los ingresos obtenidos de nuevos clientes de pago).
Retorno de la inversión
Aunque este programa de afiliación cumple 10 años, su desarrollo inicial sólo llevó unas semanas, con algunas actualizaciones menores realizadas a lo largo de los años. Es una máquina de generar ingresos totalmente autónoma.
Hasta la fecha, hemos pagado a nuestros afiliados, incluidos los empleados, más de 208.000 dólares en comisiones.
A cambio, hemos obtenido 742.000 dólares de beneficios (sin contar los ingresos de mi marca personal).
Con un ROI del 355%, este programa de afiliación supera ampliamente a todos los demás canales de marketing que hemos probado hasta ahora
Planes para el futuro
Dado el éxito de estas pocas líneas de código, estoy considerando seriamente ofrecer lo que hemos construido como un producto SaaS independiente.
Sería un gran complemento a nuestra misión de potenciar su presencia en línea.
Por favor, hágamelo saber si esto es algo que le interesaría.
Y si ha leído hasta aquí, espero que haya merecido la pena.
Gracias.
Otras actualizaciones que puede que te hayas perdido: