🎯 Lanzando una campaña en AppSumo para Gato GraphQL, con Gato GraphQL y Lemon Squeezy
¡Gato GraphQL se lanza hoy en AppSumo! 🙌
Como requisito, el equipo de Gato GraphQL tuvo que enviar 10.000 códigos de canje a AppSumo. Estos códigos son el puente entre AppSumo (donde el usuario paga por el producto) y Gato GraphQL (donde el usuario descarga el plugin).
Cuando el usuario viene a gatographql.com para canjear los códigos, generamos un correspondiente "código de descuento del 100%" (canjeable solo una vez, y restringido a ese producto específico), y hacemos que el usuario "compre" el plugin usando el código de descuento.
Los miles de códigos de descuento tuvieron que crearse por adelantado, y almacenarse en nuestro proveedor de marketplace, Lemon Squeezy.
Lemon Squeezy permite crear descuentos vía su API. Como Gato GraphQL tiene un HTTP Client, hemos ejecutado entonces una consulta GraphQL que se conecta contra la API de Lemon Squeezy y crea los miles de códigos de descuento. (En otras palabras, Gato GraphQL está potenciando su propia campaña en AppSumo 😆)
Los 10.000 códigos de canje para AppSumo se crearon ejecutando esta consulta GraphQL:
Los códigos de descuento correspondientes se crearon ejecutando esta consulta GraphQL:
La primera consulta es muy simple. La segunda es algo más compleja. Vamos a explorarla con más detalle.
Creando el código de descuento
La consulta GraphQL usa el campo _generateRandomString para generar el código de descuento como una cadena aleatoria, usando los caracteres ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.
Al código también se le antepone un namespace (vía la variable $codePrefix), para emparejar un producto y nivel específicos.
Por ejemplo, el namespace APSMV1T1 significa:
- Campaña AppSumo
- Producto Variation 1
- Tier 1
A todos los códigos de descuento también se les da un nombre descriptivo único, para ayudarnos a encontrarlos en el dashboard de Lemon Squeezy:
Appsumo campaign #1Appsumo campaign #2Appsumo campaign #3- ...
Appsumo campaign #{recordNumber}
Entonces, buscando Appsumo campaign #, podemos visualizar los códigos:

Y haciendo clic en cualquiera de ellos, vemos que se aplica a un único producto y variación:

Ejecutando la consulta varias veces vía un script bash
La consulta ejecuta (por defecto) 100 peticiones HTTP asíncronas contra la API de LemonSqueezy, con cada petición creando un único código de descuento. Como tal, ejecutar la consulta producirá 100 códigos de descuento.
No ejecutamos las 10.000 peticiones a la vez porque, en algún punto (ciertamente con 500 llamadas), la API de LemonSqueezy produce un error "Too many requests".
Por eso dividimos la ejecución de la consulta en lotes de 100 peticiones, y añadimos un retardo entre ellas.
El primer paso es crear una Persisted queries en nuestro sitio WordPress, copiar/pegar la consulta, y publicarla:

Una vez publicada, podemos ejecutar la persisted query a voluntad dentro de un script bash usando curl, proporcionando las variables GraphQL como parámetros a la URL de la persisted query.
Este script ejecuta la persisted query 100 veces (100 x 100 = 10.000), pasando las variables apropiadas a cada petición, y esperando 30 segundos entre ellas (aquí está el código para los primeros 300 códigos de descuento):
curl --user "{username}:{applicationPassword}" "https://my-wp-site.com/graphql-query/create-redemption-codes-for-appsumo-in-lemonsqueezy/?codePrefix=APSMV1T1&storeID={storeId}&variantIDs[]={productVariantId}&lemonSqueezyAccessToken={accessToken}&postId={postId}"
sleep 30
curl --user "{username}:{applicationPassword}" "https://my-wp-site.com/graphql-query/create-redemption-codes-for-appsumo-in-lemonsqueezy/?firstRecordNumber=101&codePrefix=APSMV1T1&storeID={storeId}&variantIDs[]={productVariantId}&lemonSqueezyAccessToken={accessToken}&postId={postId}"
sleep 30
curl --user "{username}:{applicationPassword}" "https://my-wp-site.com/graphql-query/create-redemption-codes-for-appsumo-in-lemonsqueezy/?firstRecordNumber=201&codePrefix=APSMV1T1&storeID={storeId}&variantIDs[]={productVariantId}&lemonSqueezyAccessToken={accessToken}&postId={postId}"
# ...Recolectando todos los códigos generados
Como estamos operando en nuestro sitio WordPress, podemos crear convenientemente una entrada para recolectar todos los nuevos códigos de descuento generados.
Proporcionando un parámetro $postId, cada vez que se ejecute la consulta añadirá los nuevos 100 códigos al final de esa entrada.

Al final de ejecutar el script bash, la entrada contendrá los 10.000 códigos.
La tarea está hecha
Ejecuté la primera consulta, copié las 10.000 cadenas aleatorias, las pegué en un nuevo fichero codes.csv, y se lo envié a AppSumo.
Ejecuté la segunda consulta, copié los 10.000 códigos de descuento, y los pegué en la lógica de mi aplicación para que el usuario pueda descargar el plugin.
Gato GraphQL está listo para la campaña en AppSumo.
Deséanos suerte 🙏