Skip to content

¿Cuál es la manera más sencilla de mover datos de Stripe a Postgres?

Published: at 09:00

Check this post in English 🇬🇧.

Últimamente encuentro bastantes oportunidades para satisfacer mi curiosidad en Twitter/X. La última la encontré en este tweet.

Tweet que inspiró este post
Tweet que inspiró este post

Creo que extraer datos de Stripe es bastante frecuente en muchos negocios digitales que quieren trazar métricas como su MRR (Ingreso Recurrente Mensual), o analizar datos de pago conectándolos con su CRM y/o el backend de su producto. En este caso, esta petición se podría generalizar a “quiero mover datos de <Inserte aquí un SaaS> a <Inserte aquí una base de datos>” con los siguientes requisitos:

  1. Que sea gratis.
  2. Sin escribir una línea de código.

Para este caso asumí que no se necesitaban los datos en tiempo real.

Llevo moviendo datos en los últimos 5 años, y a día de hoy aún no tengo claro qué herramienta recomendar. He desarrollado integraciones ad-hoc con Stripe, y he usado Meltano y Airbyte para hacer tareas similares, pero nunca con la integración con Stripe. Tanto Meltano como Airbyte me parecen buenas herramientas, pero recomendé Airbyte porque tenía un cloud que permitía hacer una prueba de concepto rápida de manera gratuita y de manera visual a través del navegador.

Tras recomendarlo (mal hecho, tenía que haber probado el conector antes 🤦🏻), me creé una cuenta de prueba en Airbyte Cloud y configuré una nueva conexión, pero me fallaba al crearla con un error 502. Lo probé en días distintos, así que di por supuesto que no era un problema temporal.

Error 502 devuelto por Airbyte Cloud al crear la conexión
Error 502 devuelto por Airbyte Cloud al crear la conexión

Parece que para este caso de uso, Airbyte (o al menos Airbyte Cloud) no era la mejor opción. Otro de los comentarios del hilo sugería dlt, así que pensé que sería una buena oportunidad para probarlo y sacar mis propias conclusiones.

Probando dlt

dlt es una librería de Python para extraer datos de múltiples fuentes y cargarlos en una base de datos o sistema de archivos. De hecho, su nombre (dlt = data load tool) recuerda mucho a otra librería muy conocida para los ingenieros de datos: dbt (data build tool). dlt quiere ser la parte EL del paradigma ELT (Extract-Load-Transform) y dejar a dbt la T.

Una de las cosas que me sorprendió fue su simplicidad y ligereza. Con dlt init stripe_analytics postgres, tenía un esqueleto completamente funcional en el que solo tenía que configurar un archivo secrets.toml para hacerlo funcionar. Sin embargo, esto rompía uno de los requisitos del problema inicial: No escribir una sola línea de código. Y es que, aunque sea configuración, necesitas clonar el repositorio, crear un entorno virtual, instalar dependencias… y luego automatizar su ejecución en una máquina remota. Desde luego, bastante trabajo para una herramienta “no-code”.

Así que me propuse desarrollar una aplicación para poder desplegar un pipeline automatizado y funcionando simplemente usando el navegador.

Para empezar, modifiqué el script principal generado por dlt con una interfaz mucho más configurable: Tipo de carga (full load e incremental) e intervalos de tiempo (fecha de inicio y fin). No me gustan los pipelines incrementales que usan un estado porque hacen difícil hacer backfilling de los datos cuando, por ejemplo, los datos no estaban listos en la fuente (Muy bien explicado en este artículo).

También añadí una imagen de Docker para que se pudiera lanzar sin necesidad de crear un entorno virtual ni instalar dependencias y se pudiera configurar con variables de entorno. Esto es muy útil cuando lanzas los trabajos en Kubernetes (punto 5 de mis 10 reglas para un ingeniero de datos).

Para cumplir con el primer requisito (Que sea gratis), usé GitHub Actions, que te da 2000 minutos al mes gratis, para automatizar el proceso de carga. Para alojar la base de datos PostgreSQL, elegí Tembo, que te da una instancias PostgreSQL gratuitas con 0.25 de vCPU y 1 GB de memoria, y soporta la extensión Hydra en su stack DataWarehouse (Por que un data warehouse puede ser “simplemente un Postgres”)

Con todo esto, se podía automatizar la extracción y carga de Stripe a PostgreSQL sin salir del navegador simplemente:

  1. Haciendo un fork de este repositorio en Github.
  2. Configurar las variables de entorno como secretos de GitHub.

Tengo que reconocer que he hecho algo de trampas, y esto funciona bien como prueba de concepto, pero si quieres ajustar algo del pipeline ya tienes que bajar al barro y tocar algo de código. Aun así, dlt está tan bien diseñado que simplemente cambiando un par de variables, puedes hacer que el pipeline escriba a una base de datos distinta (como DuckDB). Un auténtico descubrimiento y que probablemente recomiende de aquí en adelante.

Hasta pronto!