Cuándo usar funnel
Funnel es la elección correcta para flows de conversión, pipelines de fulfillment, o cualquier proceso donde importa el orden entre pasos y el drop-off — visitor del sitio → product view → cart → checkout → purchase, u orden creado → packed → shipped → delivered. Cada fila de la query es un stage.
Usá bar en su lugar cuando las categorías no están ordenadas o no te importa el drop-off cumulativo. Usá grid cuando la audiencia necesita los counts exactos de cada step y las tasas de conversión lado a lado.
Mapping
mapping.stage— requerido. Field string cuyos valores se vuelven los labels por stage.mapping.value— requerido. Field numérico para el tamaño por stage.
mapping:
stage: stage
value: order_count
El orden de los stages en el chart sigue el orden de las filas en el resultado de la query. Ordená en la query Malloy subyacente para controlar la secuencia (típicamente por order_index o por valor descendente).
Shortcuts de chart
El bloque chart es tipado y cerrado.
chart.percent_mode—"first"(default),"total", o"none". Elige la base para el porcentaje mostrado al lado de cada valor de stage:- first — relativo al primer stage (cascade de conversión: 100% → 80% → 60% …).
- total — relativo a la suma de todos los stages (share del funnel).
- none — sin porcentajes, solo valores raw.
chart.show_value_labels— boolean. Prende los labels de stage. Estilizalos conchart.labelabajo.chart.cross_filter— boolean, defaulttrue. Seteá afalsepara suprimir la emisión de click en esta viz (igual consume pills seteados en otro lado).chart.height— altura en pixels del container de la viz.
Fields pass-through de layout:
chart.left/chart.top/chart.bottom— distancia desde el borde correspondiente del container del chart.chart.width— ancho horizontal del funnel (string porcentaje o número de pixels).chart.gap— pixels entre stages.chart.min_size— ancho mínimo de stage (ej."10%"). El stage más estrecho no se va a achicar más allá de esto incluso si su valor es chiquito.chart.max_size— ancho máximo de stage.chart.sort— orden de stage. El default deja ganar el orden de fila; seteá a un valor conocido si querés que el renderer reordene.
Labels de stage
chart.label estiliza el label de cada stage cuando chart.show_value_labels está prendido:
position—"inside"(label se sienta sobre el stage),"left","right","top","bottom".rotate,color,font_size,font_weight.formatter— template string. Usá{b}para el nombre del stage,{c}para el valor,{d}para el porcentaje (cuandopercent_modees"first"o"total").distance,align,vertical_align,clip.
Legend & tooltip
chart.legend y chart.tooltip comparten el mismo shape que en bar. Para una viz de funnel único la legend es usualmente redundante; seteá chart.legend.show: false.
format
format.yoformat[<value_field_name>]— pattern para labels de valor de stage y valores de tooltip.formaten root — fallback.
Comportamiento de cross-filter
Funnel participa completamente en cross-filtering. Dentro de un dashboard:
- Emite — clickear un stage agrega un pill
{ field: <el field del stage>, value: <nombre del stage clickeado> }, siempre quechart.cross_filter !== falseY el field esté declarado como parámetro en al menos un model del dashboard. - Consume — pills seteados en otros lados, y filtros a nivel dashboard, se vuelven parámetros en el próximo run; la query subyacente del funnel re-corre y los stages se recomputan en consecuencia.
- Opt-out — seteá
chart.cross_filter: falsepara suprimir emisión de click mientras igual consume pills.
Ejemplos trabajados
Funnel de conversión estándar con porcentaje de primer stage:
id: ec_fulfillment_funnel
title: Fulfillment Funnel
query: "models/ec_fulfillment.malloy::funnel"
type: funnel
mapping:
stage: stage
value: order_count
chart:
height: 360
width: "80%"
show_value_labels: true
label:
position: inside
formatter: "{b}: {c} ({d}%)"
percent_mode: first
legend:
show: false
format:
order_count: "#,##0"
published: true
Funnel total-share (cada stage mostrado como % de la suma):
chart:
percent_mode: total
show_value_labels: true
Funnel compacto embedded en una fila de dashboard al lado de KPIs:
chart:
height: 240
width: "100%"
gap: 6
min_size: "20%"
max_size: "100%"
show_value_labels: true
label:
position: right
formatter: "{b}: {c}"
percent_mode: none
Errores comunes
- Los stages están en el orden equivocado. El funnel respeta el orden del resultado de query. Ordená en la query Malloy para controlar la secuencia.
- Los últimos stages chiquitos desaparecen. Seteá
chart.min_sizepara forzar un ancho visible mínimo. - El percent mode produce números inesperados. Elegí deliberadamente:
"first"para cascades de conversión (cada stage ÷ primer stage),"total"para share del total (cada stage ÷ suma),"none"para counts raw. - Los labels de stage se solapan con las barras. Movelos afuera (
chart.label.position: "right") o reducífont_size. - Clickear un stage no hace nada. Funnel emite pills de cross-filter solo dentro de un dashboard, y solo si (a)
chart.cross_filterno esfalse, y (b) el field de stage está declarado como parámetro en al menos un model del dashboard. Agregá la declaración de parámetro en el model Malloy subyacente para habilitar el pill. - Comparación multi-funnel. No soportada en una viz; poné dos funnels lado a lado en un dashboard para comparación A/B.