Case study · Plan B build Case study · build Plan B

Etsy Toolkit — Excel Edition Etsy Toolkit — Edición Excel

Same accounting framework as the browser-based GL + P&L generator — rebuilt in a single offline Excel workbook with a Power Query pipeline, a Power Pivot data model, and a CUBEVALUE dashboard. Validated against real Etsy monthly statements: every journal entry ties Dr = Cr. El mismo framework contable del GL + P&L generator en el navegador — reconstruido en un único workbook Excel offline con un pipeline de Power Query, un modelo de datos en Power Pivot y un dashboard con CUBEVALUE. Validado con monthly statements reales de Etsy: cada asiento cuadra Dr = Cr.

8 sheets · 135 formulas 8 hojas · 135 fórmulas Power Query Power Pivot DAX / CUBEVALUE Offline · no subscription Offline · sin suscripción
Author:Autora: Leslie Nicol Villanueva Published:Publicado: May 2026 Read time:Tiempo de lectura: ~6 min
Etsy_Toolkit_validated.xlsx — Dashboard
Period:Período: Feb 2026 Oct 2025
Gross SalesVentas Brutas
$220.54
Etsy FeesFees Etsy
$68.34
Net CashCash Neto
$122.94
Effective Fee %Fee Efectivo %
31.0%
Period Detail — JE Type Detalle del período — tipo de JE
JE 1 · Sale RecognitionDr 220.54Cr 220.54 JE 2 · Fees & ShippingDr 68.34Cr 68.34 JE 3 · Cash ReceivedDr 122.94Cr 122.94 JE 4 · Monthly ClosingDr 29.26Cr 29.26
README Listings Pricing Calculator Dashboard Transactions Journal Entries Periods M Code

Mockup of the validated Feb 2026 dashboard view — the real workbook ties Dr = Cr on every JE. Mockup de la vista Dashboard validada para Feb 2026 — el workbook real cuadra Dr = Cr en cada asiento.

Why a Plan B in Excel

The browser-based GL + P&L generator is the primary tool. But not every accountant or Etsy seller wants real-time analysis running in a browser tab. Some want the data on their own machine, in a format every accountant has had open at least once today, with no subscription and no login.

The Excel edition exists to cover that audience. Same accounting opinion, different surface: the four journal entries, the per-fee breakdown, and the period-level closing logic are identical — the user experience is a single offline workbook that refreshes the whole pipeline with one click.

Por qué un Plan B en Excel

El GL + P&L generator en el navegador es la herramienta principal. Pero no todos los contadores o sellers de Etsy quieren análisis en tiempo real corriendo en una pestaña del browser. Algunos quieren su data en su propia máquina, en un formato que todo accountant ha abierto al menos una vez hoy, sin suscripción y sin login.

La edición Excel existe para cubrir esa audiencia. La misma opinión contable, distinta superficie: los cuatro asientos, el desglose por fee y la lógica de cierre a nivel de período son idénticos — la experiencia de usuario es un solo workbook offline que refresca el pipeline completo con un click.

What this version does differently from the browser tool

The Excel edition isn’t a 1:1 port. The browser tool reads your CSV in real-time; Excel embeds the logic permanently inside the workbook:

 Browser toolExcel edition
CSV handlingUpload & parse in-browser1 click “Refresh All” via Power Query
Data modelJavaScript in-memoryPower Pivot (OLAP)
DashboardLive HTML tableCUBEVALUE + PivotChart + slicers
OfflineYes (browser-based)Yes (desktop file)
Account requiredNoNo

The whole pipeline — CSV normalization, journal entry generation, period aggregation, and dashboard — lives inside a single Excel file. One click refreshes everything.

Qué hace diferente a esta versión del browser tool

La edición Excel no es un port 1:1. El browser tool lee tu CSV en tiempo real; Excel embebe la lógica permanentemente dentro del workbook:

 Browser toolEdición Excel
Manejo del CSVUpload y parseo en el browser1 click “Refresh All” vía Power Query
Modelo de datosJavaScript en memoriaPower Pivot (OLAP)
DashboardTabla HTML en vivoCUBEVALUE + PivotChart + slicers
OfflineSí (basado en browser)Sí (archivo desktop)
Cuenta requeridaNoNo

Todo el pipeline — normalización del CSV, generación de asientos, agregación por período y dashboard — vive dentro de un solo archivo Excel. Un click refresca todo.

Architecture — 8 sheets, one data model

The user only interacts with four sheets. The other four are documentation, validation, and the model-feeding layer.

User-facing

  • README — setup in 30 seconds, license, contact.
  • Listings — editable table of products with per-unit COGS. Drives margin calculations.
  • Pricing Calculator — standalone tool. Inputs (Item Price, Shipping, Ad Spend) → outputs (All Fees, Net Margin %, Break-even Price). Pure formulas, no model dependency.
  • Dashboard — the screen at the top of this page. Period slicer + four CUBEVALUE KPI cards + a PivotChart trend + a JE-grouped period detail.

Model + support

  • Transactions — one row per completed order, output of Power Query (auto-generated, not user-edited).
  • Journal Entries — cascading GL output: JE 1 / JE 2 / JE 3 / JE 4 per period, one row per Dr/Cr line.
  • Periods — the dimension table: one row per month with Effective Fee %, Net Margin %, AOV.
  • M Code — the full Power Query M script as plain text, ready to paste into the Advanced Editor of any clean workbook for audit or reuse.

Across those 8 sheets sit 135 formulas — the Pricing Calculator logic, the Listings joins, the Dashboard CUBEVALUE calls, and the validation checks on the Journal Entries sheet.

Arquitectura — 8 hojas, un modelo de datos

El usuario solo interactúa con cuatro hojas. Las otras cuatro son documentación, validación y la capa que alimenta al modelo.

De cara al usuario

  • README — setup en 30 segundos, licencia, contacto.
  • Listings — tabla editable de productos con COGS por unidad. Alimenta los cálculos de margen.
  • Pricing Calculator — herramienta standalone. Inputs (Item Price, Shipping, Ad Spend) → outputs (All Fees, Net Margin %, Break-even Price). Fórmulas puras, no depende del modelo.
  • Dashboard — la pantalla del inicio de esta página. Slicer de período + cuatro tarjetas KPI con CUBEVALUE + un PivotChart de tendencia + el detalle del período agrupado por JE.

Modelo + soporte

  • Transactions — una fila por orden completada, output de Power Query (auto-generada, no editable por el usuario).
  • Journal Entries — GL cascada: JE 1 / JE 2 / JE 3 / JE 4 por período, una fila por línea de Dr/Cr.
  • Periods — la tabla dimensión: una fila por mes con Effective Fee %, Net Margin %, AOV.
  • M Code — el script M completo de Power Query como texto plano, listo para pegar en el Advanced Editor de cualquier workbook limpio para auditoría o reutilización.

A través de esas 8 hojas viven 135 fórmulas — la lógica del Pricing Calculator, los joins de Listings, las llamadas CUBEVALUE del Dashboard y los chequeos de validación en la hoja Journal Entries.

The Power Query pipeline — five chained queries

The same CSV normalization logic from the browser tool becomes five chained queries inside the workbook. The user points the workbook at their CSV and clicks Refresh.

  1. qry_Raw — reads the CSV, strips the UTF-8 BOM, replaces the literal -- placeholder, removes currency symbols, casts dates and decimals.
  2. qry_Transactions — filters down to sale orders, consolidates partial refunds with their original order, joins Listings to bring COGS, outputs one row per completed order.
  3. qry_FeeBreakdown — applies the Etsy fee rules per transaction: Listing Fee $0.20, Transaction Fee 6.5% of (item + shipping + discount), Payment Processing 3% × (item + shipping) + $0.25 (excluding sales tax), Offsite Ads 12% or 15% by seller status.
  4. qry_JournalEntries — groups by Period and emits the four JEs as cascading Dr/Cr rows.
  5. qry_Periods — aggregates Gross, Fees, Net Cash, Effective Fee %, Net Margin %, AOV per month.

The two intermediate queries (qry_Raw, qry_FeeBreakdown) load as Connection Only; the three terminal queries plus the editable Listings table load into the Power Pivot data model.

// excerpt from qry_Raw (M)
let
    Source = Csv.Document(File.Contents(SourcePath), [Delimiter=",", Encoding=65001]),
    Promoted = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    Cleaned = Table.ReplaceValue(Promoted, "--", null, Replacer.ReplaceValue, {"Amount","Fees & Taxes","Net"}),
    NoCurrency = Table.TransformColumns(Cleaned, {{"Amount", each Number.FromText(Text.Replace(Text.Replace(_,"$",""),",","")), type number}}),
    Typed = Table.TransformColumnTypes(NoCurrency, {{"Date", type date}})
in
    Typed

The full M script ships on the M Code sheet so anyone reviewing the workbook can audit every transformation without opening the Advanced Editor.

El pipeline de Power Query — cinco queries encadenados

La misma lógica de normalización del CSV del browser tool se vuelve cinco queries encadenados dentro del workbook. El usuario apunta el archivo a su CSV y clickea Refresh.

  1. qry_Raw — lee el CSV, quita el BOM UTF-8, reemplaza el placeholder literal --, saca símbolos de moneda, castea fechas y decimales.
  2. qry_Transactions — filtra a sale orders, consolida los refunds parciales con la orden original, joinea Listings para traer COGS, output una fila por orden completada.
  3. qry_FeeBreakdown — aplica las reglas de fees Etsy por transacción: Listing Fee $0.20, Transaction Fee 6.5% de (item + shipping + discount), Payment Processing 3% × (item + shipping) + $0.25 (excluyendo sales tax), Offsite Ads 12% o 15% según status del seller.
  4. qry_JournalEntries — agrupa por Período y emite los cuatro JEs como filas de Dr/Cr en cascada.
  5. qry_Periods — agrega Gross, Fees, Net Cash, Effective Fee %, Net Margin %, AOV por mes.

Los dos queries intermedios (qry_Raw, qry_FeeBreakdown) cargan como Connection Only; los tres terminales más la tabla editable Listings cargan al modelo Power Pivot.

// extracto de qry_Raw (M)
let
    Source = Csv.Document(File.Contents(SourcePath), [Delimiter=",", Encoding=65001]),
    Promoted = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    Cleaned = Table.ReplaceValue(Promoted, "--", null, Replacer.ReplaceValue, {"Amount","Fees & Taxes","Net"}),
    NoCurrency = Table.TransformColumns(Cleaned, {{"Amount", each Number.FromText(Text.Replace(Text.Replace(_,"$",""),",","")), type number}}),
    Typed = Table.TransformColumnTypes(NoCurrency, {{"Date", type date}})
in
    Typed

El script M completo va en la hoja M Code para que cualquiera revisando el workbook pueda auditar cada transformación sin abrir el Advanced Editor.

The data model — a small star schema

Three fact-ish/dimension tables, two relationships, and the dashboard never has to do a VLOOKUP.

Listings ──many-to-one──> Transactions ──many-to-one──> Periods
                              JournalEntries ──many-to-one──> Periods

Transactions and JournalEntries both relate to Periods, so a single Period slicer on the Dashboard filters every visual coherently — KPI cards, trend chart, and JE-by-period detail all redraw together.

This is the same star-schema shape AP teams build for any reconciliation framework: dimension tables for time and entity, fact tables for events, relationships in the model instead of formulas in every cell.

El modelo de datos — un star schema chico

Tres tablas (fact-ish + dimensiones), dos relaciones, y el dashboard nunca tiene que hacer VLOOKUP.

Listings ──many-to-one──> Transactions ──many-to-one──> Periods
                              JournalEntries ──many-to-one──> Periods

Transactions y JournalEntries se relacionan con Periods, así que un solo Period slicer en el Dashboard filtra todos los visuales coherentemente — tarjetas KPI, trend chart y detalle JE-por-período se redibujan juntos.

Es la misma forma star-schema que los equipos de AP arman para cualquier framework de reconciliación: tablas dimensión para tiempo y entidad, tablas fact para eventos, relaciones en el modelo en vez de fórmulas en cada celda.

Why CUBEVALUE for the KPIs (not pivot tables)

CUBEVALUE returns a single scalar from the data model, so each KPI card is one clean cell — no embedded pivot headers, no extra rows. Visually it reads like a finished number, not like a report fragment. And it travels: copy the cell, formula goes with it, model lookup stays intact.

=CUBEVALUE("ThisWorkbookDataModel",
   "[Measures].[Gross Sales]",
   "[Periods].[Period].&[2026-02]")

The trend chart, which needs to show every period regardless of the slicer, is a separate PivotChart deliberately disconnected from the Period slicer. The KPI cards and the JE-detail pivot stay slicer-linked. Two visual modes, one screen, no conflict.

Por qué CUBEVALUE para los KPIs (y no pivot tables)

CUBEVALUE devuelve un escalar del modelo de datos, así que cada tarjeta KPI es una celda limpia — sin headers de pivot embebidos, sin filas extra. Visualmente se lee como un número terminado, no como fragmento de reporte. Y es portátil: copias la celda, la fórmula viaja con ella, el lookup al modelo se mantiene.

=CUBEVALUE("ThisWorkbookDataModel",
   "[Measures].[Gross Sales]",
   "[Periods].[Period].&[2026-02]")

El trend chart, que tiene que mostrar todos los períodos sin importar el slicer, es un PivotChart aparte deliberadamente desconectado del slicer de Período. Las tarjetas KPI y el pivot de detalle JE quedan conectados al slicer. Dos modos visuales, una sola pantalla, sin conflicto.

Validation — real Etsy statements, every JE ties

This isn’t a paper design. The workbook was validated against two real Etsy monthly statements:

  • October 2025 — a mixed-volume month with refunds, partial reimbursements, and Offsite Ads charges.
  • February 2026 — a clean month used as the headline reproducible example.

For Feb 2026 the workbook reproduces the seller’s actual numbers to the cent:

MetricWorkbook outputEtsy statement
Gross sales$220.54$220.54
Etsy fees (total)$68.34$68.34
Net cash to bank$122.94$122.94
Effective fee %31.0%31.0%

Across both periods every journal entry balances Dr = Cr. The Journal Entries sheet carries a per-JE check column that flags any mismatch; on the validated workbook it shows zero variances on every row, period.

The effective fee of 31% on a $220.54 gross is the exact gap the toolkit was built to expose — the seller takes home $122.94 of every $220.54, not $220.54. Seeing that on the dashboard is the point.

Validación — statements reales de Etsy, cada JE cuadra

Esto no es un diseño en papel. El workbook fue validado contra dos monthly statements reales de Etsy:

  • Octubre 2025 — mes de volumen mixto con refunds, reembolsos parciales y cargos de Offsite Ads.
  • Febrero 2026 — mes limpio usado como ejemplo reproducible insignia.

Para Feb 2026 el workbook reproduce los números reales del seller al centavo:

MétricaOutput del workbookStatement de Etsy
Ventas brutas$220.54$220.54
Fees Etsy (total)$68.34$68.34
Cash neto al banco$122.94$122.94
Fee efectivo %31.0%31.0%

En los dos períodos todos los asientos cuadran Dr = Cr. La hoja Journal Entries lleva una columna de chequeo por JE que marca cualquier mismatch; en el workbook validado muestra cero diferencias en cada fila, punto.

El fee efectivo de 31% sobre $220.54 bruto es exactamente el gap que el toolkit fue construido para exponer — el seller se lleva $122.94 de cada $220.54, no $220.54. Verlo en el dashboard es justamente el punto.

What this version demonstrates

The browser tool shows JavaScript CSV parsing, in-browser accounting logic, and real-time P&L generation. The Excel build shows a different skill stack — one that AP and accounting hiring managers tend to ask for by name:

Browser toolExcel edition
JavaScript CSV parsingPower Query (M), Power Pivot, DAX
In-memory data modelStar schema / dimensional modeling
Live HTML P&L tableExcel dashboard with CUBEVALUE + slicers
Real-time GL outputNative ETL pipeline
Browser-basedLocal-first, auditable, offline

Same accounting opinion. Different tool. Both shipped.

Qué demuestra esta versión

El browser tool muestra parseo de CSV en JavaScript, lógica contable en el browser y generación de P&L en tiempo real. El build Excel muestra otro stack de skills — uno que los hiring managers de AP y contabilidad piden literalmente por nombre:

Browser toolEdición Excel
Parseo CSV en JavaScriptPower Query (M), Power Pivot, DAX
Modelo de datos en memoriaStar schema / modelado dimensional
Tabla P&L HTML en vivoDashboard Excel con CUBEVALUE + slicers
Salida GL en tiempo realPipeline ETL nativo
Basado en browserLocal-first, auditable, offline

La misma opinión contable. Otra herramienta. Las dos entregadas.

Want to try it on your own statement?

Download the validated workbook, drop your Etsy CSV path into the Source Path cell, hit Data → Refresh All, and the four journal entries plus the dashboard refresh together. Excel 2016+ (Windows) or Microsoft 365 (Mac) for full Power Pivot support.

¿Lo quieres probar con tu propio statement?

Descarga el workbook validado, pega la ruta de tu CSV de Etsy en la celda Source Path, dale a Data → Refresh All, y los cuatro asientos más el dashboard se refrescan juntos. Excel 2016+ (Windows) o Microsoft 365 (Mac) para soporte completo de Power Pivot.