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.
Usa bar en su lugar cuando las categorías no están ordenadas o no te importa el drop-off cumulativo. Usa 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. Ordena en la query Malloy subyacente para controlar la secuencia — el shape estándar es un SELECT … UNION ALL por stage con una columna de ordenamiento explícita:
# models/ec_fulfillment_funnel.malloy — one row per stage, in order.
##! experimental.parameters
source: ec_fulfillment_funnel() is ecommerce.sql("""
SELECT 'Created' AS stage, COUNT(*) AS order_count, 1 AS stage_order
FROM `bigquery-public-data.thelook_ecommerce.orders`
UNION ALL
SELECT 'Shipped', COUNT(*), 2
FROM `bigquery-public-data.thelook_ecommerce.orders`
WHERE status IN ('Shipped', 'Complete')
UNION ALL
SELECT 'Complete', COUNT(*), 3
FROM `bigquery-public-data.thelook_ecommerce.orders`
WHERE status = 'Complete'
""") extend {
view: fulfillment_funnel is {
select: stage, order_count, stage_order
order_by: stage_order asc
}
}
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. Setea 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 sort de los stages:"ascending","descending", o"none". Omite la key (o seteanone) para dejar ganar el orden de filas de la query; los otros dos hacen que el renderer reordene por valor.
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. Usa{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; setea 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 una firma de source del archivo de model propio de esta viz. - 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 — setea
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
Notas de diseño
- El funnel renderiza los stages en el orden del resultado de la query — ordena en la query Malloy para controlar la secuencia.
chart.min_sizemantiene visibles los stages finales chicos.- Elige el modo de porcentaje deliberadamente:
"first"para cascadas de conversión (cada stage ÷ el primero),"total"para share del total,"none"para counts crudos. - En funnels apretados, mueve los labels de stage afuera (
chart.label.position: "right") o reducefont_size. - Para comparación A/B, pon dos funnels lado a lado en un dashboard — un funnel muestra una secuencia.