Shinkansen · Payout metadata (→ BigQuery)
De punta a punta: del webhook de Shinkansen (notificación tipo
metadata) a la tabla crudashinkansen.shinkansen_metadataen BigQuery. Es la rama warehouse del mismo topic del que también cuelga el proceso CEP de LoanPro.
¿Llegaste hasta acá desde…?
Usa esta tabla para entrar en sentido inverso (lo que ves → de dónde sale):
| Si ves… | Eso sale de… | La lógica está en… |
|---|---|---|
La tabla shinkansen.shinkansen_metadata en BigQuery / Metabase |
solvento-data-prod.shinkansen.shinkansen_metadata (RAW) |
Ingesta (sin lógica de negocio); ver "Paso a paso" |
| El comprobante de pago (receipt URL) escrito en un loan de LoanPro | Otro consumidor del mismo topic | ver shinkansen-loanpro-cep.md (rama writeback a la app) |
| Un evento de Shinkansen que no llega a ninguna tabla | Clasificación del webhook | webhook_shinkansen → cloud_run/main.py (detect_event_type) |
Resumen
| Campo | Valor |
|---|---|
| Origen | Webhook de Shinkansen, notificación metadata (document.notifications[].notification_type == "metadata") |
| Patrón | Event-driven (Cloud Run clasifica → Pub/Sub → Dataflow → BigQuery) |
| Tabla RAW | solvento-data-prod.shinkansen.shinkansen_metadata |
| Frecuencia | Streaming |
| Criticidad | 🟡 Media |
| Dueño | Martin (data eng) |
| Repos | webhook_shinkansen · templates-dataflow |
Diagrama de linaje
graph LR
SHK[["📨 Shinkansen<br/>webhook (metadata)"]]
CR["Cloud Run<br/>webhook-shinkansen-inline-prod<br/><i>clasifica por tipo</i>"]
TOP(["Pub/Sub<br/>shinkansen-payout-metadata-prod"])
SUB(["sub<br/>shinkansen-payout-metadata-prod-sub"])
DF["Dataflow<br/>shinkansen-metadata-webhook-prod-20260112-200033"]
BQ[("solvento-data-prod<br/>shinkansen.shinkansen_metadata")]
CEP["Cloud Run CEP<br/>(otro consumidor · writeback LoanPro)"]
MB["Metabase / análisis"]
SHK -->|HTTP| CR -->|"SHINKANSEN_PAYOUT_METADATA_TOPIC"| TOP
TOP -->|"sub warehouse"| SUB --> DF --> BQ --> MB
TOP -.->|"fan-out · otra sub"| CEP
classDef src fill:#fde68a,stroke:#b45309,color:#000;
classDef store fill:#bfdbfe,stroke:#1e40af,color:#000;
class SHK src;
class BQ store;
Paso a paso
- Shinkansen emite un webhook por cada notificación de payout. Cuando es de tipo
metadata, traereceipt_urlytracking_keydentro dedocument.notifications[]. - Cloud Run
webhook-shinkansen-inline-prod(webhook_shinkansen,cloud_run/main.py) recibe el POST en/shinkansen(o/webhook/shinkansen), clasifica el evento condetect_event_type(payout_metadata,payout_results,response) y publica el de tipometadataen el topic configurado enSHINKANSEN_PAYOUT_METADATA_TOPIC. - Pub/Sub desacopla: topic
shinkansen-payout-metadata-prodcon fan-out (dos consumidores, ver abajo). - Suscripción
shinkansen-payout-metadata-prod-subalimenta el Dataflowshinkansen-metadata-webhook-prod-20260112-200033(templates-dataflow, carpetashinkansen-metadata-webhook;INPUT_SUBSCRIPTIONyOUTPUT_TABLEen suprod.env). - BigQuery: el Dataflow escribe el dato crudo en
solvento-data-prod.shinkansen.shinkansen_metadata(OUTPUT_TABLE=solvento-data-prod:shinkansen.shinkansen_metadata). No hay lógica de negocio en la ingesta.
Fan-out — no confundir con el CEP: el mismo topic
shinkansen-payout-metadata-prodtiene otro consumidor, el proceso CEP de LoanPro, que toma elreceipt_urly lo escribe de vuelta en el loan de LoanPro (no carga BigQuery). Ese flujo está documentado aparte enshinkansen-loanpro-cep.md. Esta ficha es solo la rama warehouse → BigQuery.
Tablas que alimenta
| Tabla | Contenido | Job que la carga |
|---|---|---|
solvento-data-prod.shinkansen.shinkansen_metadata |
Metadata cruda de notificaciones de payout de Shinkansen | Dataflow shinkansen-metadata-webhook-prod-20260112-200033 |
Consumo aguas abajo
- Metabase / análisis de payouts leen directamente de
solvento-data-prod.shinkansen.shinkansen_metadata. - Si existe una capa de staging sobre esta tabla, vive en
dbt-analytics(models/staging/shinkansen— (confirmar)). Por criticidad media no se rastrean los modelos aquí.
Si falla 🛠️
Impacto: deja de actualizarse shinkansen.shinkansen_metadata en BigQuery (queda desactualizada la metadata de payouts para análisis). No afecta a la rama CEP (es otra suscripción del mismo topic). Pub/Sub retiene los mensajes hasta que el Dataflow los consuma.
| Síntoma | Dónde mirar | Acción |
|---|---|---|
| No llegan eventos nuevos a ninguna tabla de Shinkansen | Logs Cloud Run webhook-shinkansen-inline-prod |
Si fue un deploy → rollback; verificar que SHINKANSEN_PAYOUT_METADATA_TOPIC esté configurado |
| Llega al topic pero la RAW no avanza | Dataflow shinkansen-metadata-webhook-prod-…: watermark del job; backlog de la sub shinkansen-payout-metadata-prod-sub |
Transitorios se recuperan solos consumiendo la misma suscripción; si hay duda, relanzar/escalar |
Eventos clasificados como UNKNOWN |
Logs del webhook (detect_event_type) |
Revisar si Shinkansen cambió el esquema; ajustar la detección en cloud_run/main.py |
| Datos en BQ pero "raros" en Metabase | Capa dbt en dbt-analytics (si aplica) |
Revisar la transformación en el repo, no la ingesta |
Escalación: lógica SQL / Metabase → Diego · resto (ingesta, Cloud Run, Dataflow, Pub/Sub) → Martin.
Enlaces
- 📊 Estado en vivo: dashboard "Data Processes" (Cloud Monitoring)
- 📦 Ingesta:
webhook_shinkansen· template Dataflow entemplates-dataflow→ carpetashinkansen-metadata-webhook - 🔗 Vista que unifica los payouts (este flujo + results + treasury): Shinkansen · Payouts unificado
- 🔀 Mismo topic, otra rama (writeback a LoanPro):
shinkansen-loanpro-cep.md
Última actualización: 2026-06-21 · Si cambia el flujo o el esquema del webhook, actualizar esta ficha en el mismo MR.