# Programa de referidos

Un **programa de referidos** es un sistema que recompensa a los clientes o socios de la empresa ofreciendo incentivos o bonificaciones por atraer nuevos participantes.

Desde una perspectiva técnica, un programa de referidos incluye varios componentes clave:

1. Un **enlace de invitación**—un identificador único que permite a los usuarios o clientes invitar a otros a participar en el programa. El invitador puede compartir este enlace a través de varios canales (por ejemplo, este artículo cubrirá la generación de enlaces mediante un bot de WhatsApp, pero los enlaces del programa de referidos pueden compartirse a través de cualquier mensajero que prefieras).
2. Un **base de datos de participantes**, implementada mediante la integración de MaviBot y la funcionalidad de Google Sheets, donde se registra información tanto de los usuarios invitados como de los que invitan.
3. Un **sistema de seguimiento de referidos** que supervisa las acciones relacionadas con la incorporación de nuevos participantes mediante enlaces de referido. El sistema almacena datos de todos los referidos, lo que te permite comprobar si un referido dado ya existe en el sistema como un usuario previamente invitado.

{% hint style="success" %}
Recomendamos encarecidamente revisar las secciones “Conceptos básicos de construcción de bots en Mavibot.ai” <mark style="color:rojo;">**ссылка**</mark> y “Google Sheets” <mark style="color:rojo;">**ссылка**</mark> antes de crear el flujo de tu chatbot.
{% endhint %}

## Sistema de referidos en WhatsApp

La funcionalidad del bot que se creará incluirá bloques compuestos por los siguientes componentes:

1. generación de un enlace de referido (afiliado); <mark style="color:rojo;">**ссылка**</mark>
2. comprobación de si el nuevo usuario ya está en la base de datos; <mark style="color:rojo;">**ссылка**</mark>
3. notificación al usuario que invita sobre un nuevo referido; <mark style="color:rojo;">**ссылка**</mark>
4. registro de usuarios en la base de datos; <mark style="color:rojo;">**ссылка**</mark>
5. solicitud de una lista de referidos. <mark style="color:rojo;">**ссылка**</mark>

### Generación de enlace de referido

Vamos a crear un bloque con un enlace incrustado que el bot enviará al usuario al recibir el comando “link”. Para hacerlo, crea un nuevo bloque en el flujo usando uno de estos dos métodos:

1. Haz doble clic en un área vacía del lienzo del constructor:

<figure><img src="/files/532e670a2d0183e20206809d0895ed2f99702902" alt="" width="563"><figcaption><p>Cómo crear un bloque con un clic del ratón</p></figcaption></figure>

2. Usando el **botón "Guardar"** en la parte inferior de la pantalla y seleccionando el tipo de bloque:

<figure><img src="/files/5663e7b527e4ea3db02762b867b597033f4d5c99" alt="" width="563"><figcaption><p>Cómo crear un bloque con un tipo seleccionado</p></figcaption></figure>

Después de eso, en la condición del bloque, introduce la palabra **“Link”** y establece el tipo de coincidencia en **“Ignorar erratas e inexactitudes”** (esto es útil en caso de errores tipográficos del usuario u otros errores del mensaje):

<figure><img src="/files/b1277b52c811ee637ba3d915452bfae304bab00a" alt="" width="310"><figcaption><p>Fig. 1</p></figcaption></figure>

Para identificar quién refirió al usuario, el bot crea un enlace usando la siguiente plantilla: [https://wa.me/(tu](https://wa.me/%28your) número de teléfono vinculado al bot)text=Fuiste%20recomendado%20por%20#{phone}%20😌Hola

<figure><img src="/files/e03f8e46170fe59ff3cd4a2320488834b512d9da" alt=""><figcaption><p>Fig. 2 Cómo insertar un enlace en un bloque del flujo</p></figcaption></figure>

Veamos más de cerca la plantilla del enlace: [https://wa.me/(tu](https://wa.me/%28your) número de teléfono vinculado al bot)?text=Fuiste%20recomendado%20por%20#{phone}%20😌Hola, donde:

1. Reemplaza los paréntesis "(tu número de teléfono vinculado al bot)" con el número de teléfono correspondiente;
2. \#{phone} se reemplaza automáticamente con el número de teléfono del usuario que solicitó su enlace de socio.

Enviamos el enlace generado no como texto del bloque, sino como un adjunto: un enlace clicable con una notificación (ver Fig. 2 y Fig. 3):

* elige insertar un adjunto
* &#x20;selecciona el tipo — Enlace, y pégalo en el campo 'URL del adjunto':

<figure><img src="/files/c817494eb02bf24f786da86bc463235cde73f8b0" alt="" width="323"><figcaption><p>Fig. 3. Adjunto -> tipo -> enlace</p></figcaption></figure>

En este caso, el enlace aparecerá visualmente acortado:

![Fig. 4. Vista en WhatsApp](https://lh5.googleusercontent.com/vW_tS8GIDqDbN0PkdgQsa6xeeiBBfxuC4Qp8QuzXRz98yI4fphKEUIE22MiBcq4q_RvlQLlAEtlVzcL-hln5DbHaM-F1tuSBNp9y5zhvR5efRmjzDbcTlox5AUDvhnVorlBEdYsX)

Probemos la funcionalidad del enlace usando la **función "Probar bot"** .

<figure><img src="/files/61918a19ad19ee2e4896a8719279673c26ec58e8" alt="" width="237"><figcaption><p>Fig. 5. Cómo probar un bot</p></figcaption></figure>

Aquí está el resultado: el enlace dirige al usuario al chat correspondiente del mensajero con tu número de teléfono:

<figure><img src="/files/68af68a9be65f72625102f79c7ddf3d18cd74396" alt="" width="563"><figcaption><p>Probando la funcionalidad del enlace</p></figcaption></figure>

De este modo, has generado con éxito un enlace de invitación que los usuarios potenciales pueden usar para acceder al chatbot. Además, al hacer clic en este enlace, el usuario es redirigido a la ventana de chat con un mensaje prellenado. (Ver Fig. 6)

![Fig. 6. Mensaje completado en WhatsApp](https://lh5.googleusercontent.com/60e0Pcv5362t53lD5Y0evDiAAmeyCoL-eSg_1wXPsgFiKw-Nn0Zmb3WUwBE16lCBr84e56RB863VJd8GFW4kqZAsXMRzEEIFum_ThIdbr58IqV9_JP-kp3IVnfNZoAsJ7d_n4OI4)

### Verificación del usuario&#x20;

**Uso de funciones y expresiones regulares en un bloque**

El comando de verificación y entrada en la base de datos solo funcionará si el bot encuentra un número de teléfono en el mensaje del usuario. Por lo tanto, es necesario dividir la frase recibida en partes.

Para ello, se usa la función **splitter()** .

{% tabs %}
{% tab title="Función Splitter()" %}
**splitter(str, s, n)** - divide una cadena en partes. La función devuelve una matriz de elementos. <br>

Parámetros:

<mark style="color:rojo;">**!**</mark> <mark style="color:rojo;">**str**</mark> <mark style="color:rojo;"></mark><mark style="color:rojo;">- la cadena original</mark>

<mark style="color:rojo;">**!**</mark> <mark style="color:rojo;">**s**</mark> <mark style="color:rojo;"></mark><mark style="color:rojo;">- el delimitador de la cadena</mark>

**n** - el número máximo de elementos
{% endtab %}

{% tab title="Ejemplo" %}
Función de división de cadenas:

<figure><img src="/files/9f415ec5bad4a8fe423396da2d410f83fe6985be" alt=""><figcaption><p>Fig. 8. División de la cadena</p></figcaption></figure>
{% endtab %}
{% endtabs %}

A continuación, el bot necesita verificar si la secuencia de dígitos en la cadena es realmente un número de teléfono. Para ello, usamos las siguientes expresiones regulares:

* Número de teléfono general: `^(\+)?((\d{2,3}) ?\d|\d)(([ -]?\d)|( ?(\d{2,3}) ?)){5,12}\d$`
* <mark style="color:rojo;">**¡Cambiar el número ruso!**</mark> Solo número de teléfono ruso: `^((\+7|7|8)+([0-9]){10})$`

<figure><img src="/files/e3fec0fe6931669c4995da3628d45f33b4029ec2" alt="" width="500"><figcaption><p>Fig. 9. Expresión regular para número de teléfono</p></figcaption></figure>

{% hint style="info" %}
Para obtener información sobre cómo trabajar con expresiones regulares, consulta el artículo titulado "Expresiones regulares". <mark style="color:rojo;">**ссылка**</mark>
{% endhint %}

Después de que el bot verifique que la secuencia de dígitos es realmente un número de teléfono, guárdalo del mensaje como una variable (por ejemplo, #{reff}).

**Comprobación del número de teléfono del usuario como referido en la base de datos**

Ahora es necesario comprobar si el número de teléfono del usuario que siguió el enlace ya es un referido (previamente invitado por alguien y registrado en nuestra base de datos). Para ello, crea un bloque en el flujo con una función de búsqueda de columna.

Usa la función de búsqueda de columna haciendo clic en **"Solicitud API"** en el bloque, donde debes establecer los siguientes valores de parámetros:

<figure><img src="/files/b39c819390024faae93fca09835a39e20dbfca03" alt="" width="337"><figcaption><p>Fig. 9</p></figcaption></figure>

<mark style="color:rojo;">**!**</mark>**&#x20;URL de la función**: <https://store.salebot.pro/function/findcell> <mark style="color:rojo;">**ссылка**</mark>

<mark style="color:rojo;">**!**</mark>**&#x20;JSON** **parámetros de la solicitud:**&#x20;

**{ "id": "your\_table\_id", "find": "text\_to\_search", "col": column\_number\_to\_search\_in, "return": column\_number\_to\_return, "creds\_path": "path\_to\_your\_auth\_credentials\_file" }**

Parámetros de respuesta:

"status": "1" — valor encontrado

"status": "0" — valor no encontrado

"data" — el valor encontrado

"cell\_number" — la ubicación de la celda encontrada

{% tabs %}
{% tab title="Búsqueda por columna y mostrar texto de toda la fila" %}
El parámetro return debe establecerse en 0.\
\&#xNAN;**{ "id": "your\_table\_id", "find": "text\_to\_search", "col": 2, "return": 0 }**\
Respuesta: {"status":"1","data":{"0":"\u0441\u043e\u043b\u043d\u0446\u0435","1":"\u0440\u0430\u0441\u0441\u0432\u0435\u0442","2":"\u043a\u0440\u044b\u0448\u0430","3":"","4":"\u043d\u0435\u0431\u043e"},"cell\_number":{"row":4,"col":1, "col\_letter":"A"}}\
Desglose de la respuesta:&#x20;

data — respuesta

data|0 — Celda 1

data|1 — Celda 2

data|2 — Celda 3

data|3 — Celda 4

cell\_number|row — fila&#x20;

cell\_number|col — columna&#x20;
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Para obtener más información sobre las funciones disponibles para trabajar con tablas, consulta el artículo titulado "Google Sheets". <mark style="color:rojo;">**ссылка**</mark>
{% endhint %}

### Bloque de notificación

Para notificar al usuario que compartió el enlace de referido que un nuevo cliente lo ha seguido con éxito, crearemos un bloque dedicado. Para enviar una notificación sobre la creación de un nuevo referido, usa los siguientes parámetros de solicitud (tipo: **POST - JSON**):

<figure><img src="/files/a1fca5ba4bace9680793c181bb0fc194cc93375c" alt="" width="357"><figcaption></figcaption></figure>

Las solicitudes se realizan usando el **POST** método a la URL: **`https://chatter.salebot.pro/api/{api_key}/{action}`** Dónde:

* **`api_key`** es la clave de acceso API de tu proyecto, que puede obtenerse en la configuración del proyecto (ver Fig. 11).

<figure><img src="/files/6477f4b20e4069534c23d9cc864cd21253ab16d1" alt="" width="563"><figcaption><p>Fig. 11.</p></figcaption></figure>

Puedes recuperar la clave de acceso usando la variable **#{api\_key}**, que almacena el token de acceso generado actualmente. **No olvides generar el token antes de usarlo.**

<mark style="color:rojo;">**!**</mark>**&#x20;URL de la solicitud:** [**https://chatter.salebot.pro/api/#{api\_key}/whatsapp\_message**](https://chatter.salebot.pro/api/#{api_key}/whatsapp_message) <mark style="color:rojo;">**ссылка**</mark>

<figure><img src="/files/315b4388c1c1296d6cae573a0063be56a6ad9a35" alt="" width="563"><figcaption><p>Fig. 12. Notificación en WhatsApp</p></figcaption></figure>

{% hint style="info" %}
ПPuedes encontrar más detalles sobre las funciones de solicitud de API aquí. <mark style="color:rojo;">**ссылка**</mark>
{% endhint %}

### Añadir los usuarios invitados y los que invitan a la base de datos

Para ello, usaremos la entrada fila por fila en columnas específicas, lo cual se realiza usando el **mapeo** función.

{% hint style="danger" %}
La tabla debe tener un encabezado completado (al menos una celda en la primera fila).
{% endhint %}

<mark style="color:rojo;">**!**</mark>**&#x20;URL de la función** <https://store.salebot.pro/function/gsheets> <mark style="color:rojo;">**ссылка**</mark>

<mark style="color:rojo;">**!**</mark>**&#x20;JSON** **parámetros de la solicitud:**&#x20;

{ "id": "your\_table\_id", "mapping": { "a": "#{variable}", "b": "#{another\_variable}", "d": "plain text" } }

Si quieres escribir filas no en la primera hoja, añade el parámetro **list\_name** a la solicitud:

{ "id": "your\_table\_id", "mapping": { "a": "plain text", "b": "#{variable}" }, "list\_name": "SheetName" }

Parámetros:

* **id** — identificador de la tabla\*
* **a, b, c, d** — nombres de columna
* **list\_name** — nombre de tu hoja (por ejemplo, "Sheet2")

\*Asegúrate de reemplazarlo con el ID real de tu tabla.

> Ejemplo de respuesta:  **{"number\_row":8}**

Si la solicitud se ejecuta correctamente, la respuesta incluirá el número de fila, que puedes guardar y usar para operaciones posteriores.

### Ver la lista de referidos

Vamos a añadir un comando adicional al bot que permita a los usuarios ver su lista de referidos.

Para encontrar todos los valores especificados en una columna, usa la **findcell** función con el parámetro **"find\_all"**. Esto localizará todas las apariciones del **"find\_all"** valor en la **columna "col"** especificada y devolverá una lista de valores únicos de la **columna "return"** como una cadena.

<mark style="color:rojo;">**!**</mark>**&#x20;URL de la función:**  <https://store.salebot.pro/function/findcell> <mark style="color:rojo;">**ссылка**</mark>

<mark style="color:rojo;">**!**</mark>**&#x20;Parámetros de la solicitud JSON:**&#x20;

{ "id": "table\_id", "find\_all": "search\_value", "list\_name": "sheet\_name", "col": "column\_number\_to\_search\_in", "return": "column\_number\_to\_return\_values\_from", "find": "!" }

<figure><img src="/files/7074b8a94d7e0fc4120bf2fb9bee41cdb32b9f46" alt="" width="449"><figcaption></figcaption></figure>

En los valores guardados, especifica:

lista → Lista

cantidad → Cantidad

Para el usuario, muestra el mensaje:*"Has referido a #{spisok}, tu total de referidos: #{quantity}"*

En otros mensajeros, implementar un sistema de referidos así es aún más fácil porque los datos del invitador se pasan como un parámetro oculto durante la transición del enlace, por lo que el nuevo usuario no necesita enviar un mensaje como *“Fui invitado por este número.”*


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mavibot.ai/doc/es/como-hacer.../programa-de-referidos.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
