
Financial Analytics Dashboard
- 138 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Implement an ecommerce financial analytics dashboard showing revenue, margins, refunds, and cash-flow KPIs with filters, charts, and exportable reports for finance and ops teams.
About
financial-analytics-dashboard skill from finsilabs/awesome-ecommerce-skills guides building a merchant finance dashboard: revenue, COGS, margins, refunds, payment fees, period comparisons, and drill-down views wired to ecommerce transactional data.
- Revenue and margin KPIs
- Refund and fee tracking
- Chart and filter UX
- Finance-friendly exports
- Ecommerce ledger views
Financial Analytics Dashboard by the numbers
- 138 all-time installs (skills.sh)
- Ranked #753 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill financial-analytics-dashboardAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 138 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Implement an ecommerce financial analytics dashboard showing revenue, margins, refunds, and cash-flow KPIs with filters, charts, and exportable reports for finance and ops teams.
Files
Financial Analytics Dashboard
Overview
A financial analytics dashboard gives operators near-real-time visibility into the KPIs that matter most — revenue, gross margin, CAC, return rate — with drill-down, comparison baselines, and automated alerts when metrics breach thresholds. Unlike a static financial report, an analytics dashboard is designed for daily operational use: the finance team monitors it each morning, the marketing team checks ROAS after a campaign launch, and the CEO reviews the weekly summary before a board call.
This skill guides you through building a financial analytics dashboard using your platform's built-in tools, BI apps, and accounting integrations — without writing code.
When to Use This Skill
- When the finance team needs a daily operational dashboard showing current-month tracking
- When you want automated Slack or email alerts when KPIs breach thresholds
- When replacing manual weekly reporting emails with a live dashboard link
- When you need a self-service tool where non-finance stakeholders can explore metrics
- When building a board reporting dashboard that auto-refreshes with latest data
- When monitoring multiple revenue streams (DTC, marketplace, wholesale) on one screen
Core Instructions
Step 1: Choose your dashboard tool by platform
| Platform | Recommended Tool | Why |
|---|---|---|
| Shopify | Shopify Analytics + Polar Analytics or Triple Whale | Shopify's built-in analytics covers revenue, orders, and AOV; Polar/Triple Whale add profit margin, CAC, and multi-channel KPIs |
| Shopify (advanced) | Glew.io or Daasity | Pre-built ecommerce KPI dashboards with alerting and board-ready reporting |
| WooCommerce | Metorik + GA4 | Metorik provides operational KPI dashboards; GA4 provides conversion funnel and traffic metrics |
| BigCommerce | Glew.io | Pre-built BigCommerce analytics with cohort analysis, margin tracking, and channel drill-down |
| All platforms | Google Looker Studio (free) connected to your data | Free; connects to Google Analytics, Google Sheets, BigQuery, and 1,000+ data sources; fully customizable |
| All platforms (BI teams) | Metabase (self-hosted, free) or Tableau | SQL-based; best when you have a data warehouse and a technical analyst |
Step 2: Define your core KPI set
Keep the headline view to 8–10 metrics maximum. Dashboard fatigue is real — surfaces with 40+ metrics are ignored.
Recommended core KPIs for ecommerce operators:
| KPI | Good Benchmark | Alert Threshold |
|---|---|---|
| Gross Revenue (MTD vs. prior month) | Varies by business | Alert if >20% below plan |
| Net Revenue (after discounts + refunds) | Gross revenue × 85–92% | Alert if discount rate > 15% |
| Gross Margin % | 40–65% for branded DTC | Alert if drops >3pp below target |
| Orders (daily/weekly trend) | Varies | Alert if >20% below 7-day average |
| AOV (Average Order Value) | Varies | Alert if >10% below 30-day average |
| Customer Acquisition Cost (CAC) | Varies by channel | Alert if >20% above target CAC |
| Return/Refund Rate | <8% for most categories | Alert if >10% or trending up |
| Blended ROAS (total revenue / total ad spend) | 3–6x for DTC | Alert if below break-even ROAS |
Step 3: Set up the dashboard on your platform
---
Shopify
Shopify's built-in Analytics (no setup needed): 1. Go to Analytics → Overview — shows today's sales, sessions, conversion rate, and AOV with comparison to prior period 2. Go to Analytics → Dashboards — Shopify provides a customizable dashboard where you can add report tiles for revenue, traffic, products, customers 3. Go to Analytics → Reports for deeper drill-downs: sales by channel, by product, by location 4. Limitation: Shopify's built-in analytics does not include profit margin (unless cost per item is entered per product), ad spend, or CAC
Polar Analytics (recommended for financial KPI dashboards on Shopify): 1. Install Polar Analytics from the Shopify App Store 2. Connect your ad accounts (Meta, Google, TikTok) under Integrations 3. Go to Polar → Dashboard — pre-built KPI tiles for revenue, ROAS, CAC, MER (marketing efficiency ratio), and gross profit 4. Set up Alerts under Polar → Notifications: configure threshold alerts for CAC, ROAS, and revenue that send to email or Slack 5. Go to Polar → Reports for daily summary emails that can replace manual reporting
Triple Whale (Shopify DTC brands with $1M+ revenue): 1. Install Triple Whale from the Shopify App Store 2. Triple Whale's Summary Dashboard shows daily revenue, profit, ROAS, new customer CAC, and blended MER in a single view 3. Enable Daily Digest emails — sends a morning summary of yesterday's performance to the team 4. Set up Alerts in Triple Whale for threshold breaches (e.g., ROAS drops below 2.0x)
---
WooCommerce
Metorik (operational KPI dashboard): 1. Sign up at metorik.com and connect to your WooCommerce store 2. Metorik's Dashboard shows real-time revenue, orders, AOV, refund rate, and customer count with period comparisons 3. Go to Metorik → Reports → Summary for a daily/weekly KPI summary 4. Enable Metorik Digest emails — sends automated daily or weekly KPI summary emails to stakeholders 5. Use Metorik Alerts to receive email notifications when revenue, orders, or refunds breach thresholds
Google Looker Studio (free, flexible): 1. Go to lookerstudio.google.com 2. Add data sources: Google Analytics 4 (for traffic/conversion data) + Google Sheets (for manual P&L imports from WooCommerce) 3. Build a dashboard with KPI scorecards, trend lines, and channel comparison tables 4. Share the dashboard URL with stakeholders — auto-refreshes with latest data
---
BigCommerce
1. BigCommerce Analytics (built-in): Go to Analytics → Store Overview for revenue, orders, conversion rate, and customer metrics; available on all plans 2. Glew.io (BigCommerce App Marketplace): Install for advanced financial KPI dashboards with cohort analysis, margin tracking by product/channel, and automated weekly executive digest emails 3. Google Looker Studio: Connect BigCommerce to Looker Studio via Stitch (data pipeline) → BigQuery → Looker Studio for a fully custom financial analytics dashboard
---
Step 4: Configure variance explanations and drill-down
A dashboard that shows numbers without context is just wallpaper. Set up these comparison views:
Period-over-period comparisons:
- Every KPI tile should show the current value AND the % change vs. prior period (prior week, prior month, prior year same period)
- Configure this in Polar Analytics or Triple Whale under Dashboard Settings → Comparison period
Channel drill-down:
- In Shopify Analytics: Go to Reports → Sales by traffic source — shows revenue by UTM channel
- In Metorik: Go to Reports → UTM — shows orders and revenue by UTM source/medium
- In Polar Analytics: Go to Channel Mix — shows revenue, orders, and ROAS by acquisition channel with trend
Root cause workflow: When a metric drops significantly, follow this investigation chain: 1. Is total revenue down or is one channel down? → Check channel drill-down 2. Is order volume down or AOV down? → Check Orders vs. AOV trend 3. Is it a traffic problem or a conversion problem? → Check sessions vs. CVR in GA4 4. Is it affecting all products or specific SKUs? → Check product-level reports
Step 5: Set up automated alerts
Automated alerts ensure you find out about problems before customers do.
Shopify + Polar Analytics: 1. Go to Polar → Alerts → Create Alert 2. Set thresholds: e.g., "Alert me when ROAS drops below 1.5" or "Alert me when daily revenue is 30% below 7-day average" 3. Choose delivery: email, Slack, or in-app notification
Shopify + Triple Whale: 1. Go to Triple Whale → Alerts 2. Create alert rules for key metrics with absolute or percentage thresholds 3. Triple Whale's Moby AI can also proactively flag anomalies and explain them in natural language
Any platform using Google Looker Studio:
- Connect Looker Studio to Google Sheets with a trigger that runs a daily data pull
- Use Google Apps Script with
sendEmail()to send alerts when cells exceed thresholds - Alternatively, set up Data Studio alerts (Looker Studio has a basic alert feature)
For Slack-based alerting (all platforms):
- Connect your platform to Slack via Zapier — create a Zap that runs daily and sends a Slack message to #analytics with key metric values
Best Practices
- Keep the top-level view to 8 metrics or fewer — the headline view should surface only the most important metrics; depth should be accessible via drill-down, not displayed all at once
- Show both absolute and percentage changes — a 5% improvement from $1M to $1.05M matters more than a 5% improvement from $1K to $1.05K; show both
- Build a mobile-first KPI summary — DTC founders check key metrics from their phone every morning; ensure your dashboard is readable on mobile or use Triple Whale/Polar Analytics which are mobile-optimized
- Log all alert history — keep a record of every alert that fired with the metric value and timestamp; this audit trail is valuable for post-mortems
- Build a commentary layer — when a metric moves significantly, require the responsible team to add a one-line explanation in a shared Notion page or Slack channel; creates institutional memory of business events
- Calibrate alert thresholds based on historical volatility — for a metric that normally fluctuates ±8%, a warning threshold of ±5% generates noise; start with ±20% for warning and ±35% for critical
Common Pitfalls
| Problem | Solution |
|---|---|
| Too many metrics at launch | Start with 8–10 core KPIs; expand only after the team trusts and uses the initial set |
| Different dashboards show different revenue numbers | Establish one tool as the single source of truth for each metric; document which tool to use for which question |
| Alert fatigue from too many notifications | Calibrate thresholds based on normal volatility; if alerts fire more than 3x per week, widen the thresholds |
| Missing data freshness indicator | Always show the "last updated" timestamp on dashboards; stale data mistaken for current data leads to wrong decisions |
| Dashboard loads too slowly | Pre-aggregate daily snapshot tables in your data warehouse; serve dashboards from snapshots, not live transaction queries |
Related Skills
- @financial-reporting-dashboard
- @sales-reporting-dashboard
- @marketing-spend-analysis
- @ecommerce-budgeting-forecasting
- @profit-margin-analysis
{
"context": "Tests whether the agent builds a KPI registry with the correct structure and an alerting system that follows the prescribed severity/action model, threshold naming conventions, and sorting behavior.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Central KPI registry",
"max_score": 8,
"description": "Defines a single central KPI_REGISTRY dict (or equivalent named structure) rather than scattering metric definitions across the code"
},
{
"name": "Registry fields present",
"max_score": 8,
"description": "Each KPI entry in the registry includes at minimum: display_name, description, unit, category, thresholds, visualization, and granularity fields"
},
{
"name": "Threshold key naming",
"max_score": 8,
"description": "Threshold configs use the keys critical_low, warning_low, warning_high, and/or critical_high (not 'red'/'amber' or other custom names)"
},
{
"name": "Percentage thresholds as decimals",
"max_score": 8,
"description": "Percentage-based threshold values are expressed as decimal fractions (e.g. -0.20 for -20%), not as whole numbers (e.g. -20)"
},
{
"name": "Alert dataclass fields",
"max_score": 8,
"description": "Alert objects include all of: kpi_name, display_name, current_value, threshold_value, severity, message, action, and timestamp"
},
{
"name": "AlertSeverity enum",
"max_score": 8,
"description": "Uses an enum (or equivalent) with at least CRITICAL and WARNING severity levels, not plain strings"
},
{
"name": "Critical action message",
"max_score": 8,
"description": "CRITICAL alerts include an action field that instructs immediate escalation to leadership (not just 'monitor')"
},
{
"name": "Warning action messages",
"max_score": 8,
"description": "WARNING alerts include an action field that prescribes root-cause documentation or monitoring — not escalation"
},
{
"name": "Alerts sorted by severity",
"max_score": 10,
"description": "The evaluate_kpi_thresholds function (or equivalent) returns alerts sorted by severity"
},
{
"name": "Threshold calibration guidance",
"max_score": 10,
"description": "Threshold values are set relative to historical volatility, not arbitrarily tight (e.g. for a metric with ±8% normal volatility, warning >= ±15% and critical >= ±25%)"
},
{
"name": "Alert history logging",
"max_score": 8,
"description": "Code or schema includes logging/storing of alert history with at minimum: metric value, threshold, and timestamp fields"
},
{
"name": "Versioned thresholds",
"max_score": 8,
"description": "Threshold configurations are stored with effective dates (in a DB table, file, or data structure) rather than hardcoded constants"
}
]
}
E-Commerce KPI Alert System
Problem/Feature Description
A fast-growing direct-to-consumer brand has outgrown its weekly finance review meetings. The CFO wants a proactive alerting system that monitors key financial KPIs in real time and notifies the team when something unexpected happens — before it shows up in the weekly report. The business tracks several metrics across revenue, profitability, and unit economics, each of which behaves differently and has its own acceptable range based on historical norms.
The team has been burned before by alert systems that either fire constantly (generating noise everyone ignores) or never fire until a crisis is already visible. The new system needs to correctly classify severity — distinguishing situations that require immediate leadership escalation from those that just need monitoring — and it should produce structured alert records that can be stored and reviewed for post-mortems. The thresholds themselves need to be maintainable over time as the business scales, since a $75 customer acquisition cost target today may be very different from next year's target.
Output Specification
Produce a Python module (e.g. kpi_alerts.py) containing:
1. A KPI registry data structure with at least 4 KPIs from the e-commerce domain (e.g. gross revenue, gross margin %, customer acquisition cost, return rate). Each KPI definition should include the metadata needed to display and monitor it. 2. An alert data structure (dataclass or equivalent) representing a single fired alert, with all fields needed to understand what happened and what to do. 3. A function that takes a dict of {kpi_name: current_value} and returns a list of alerts for any KPIs breaching their thresholds, sorted appropriately. 4. A brief design_notes.md explaining your threshold calibration approach — how you set threshold values relative to normal metric volatility to avoid alert fatigue.
The module should be runnable (or have a if __name__ == '__main__' demo block) that exercises the alerting logic with some example values. The output does not need a real database connection — use hardcoded or generated sample data for the demo.
{
"context": "Tests whether the agent builds a FinancialMetricsEngine class following the prescribed interface, with correct period comparison logic, time-series SQL patterns, data freshness handling, and daily snapshot architecture.",
"type": "weighted_checklist",
"checklist": [
{
"name": "FinancialMetricsEngine class",
"max_score": 8,
"description": "Defines a class named FinancialMetricsEngine (not a standalone function or differently named class) that accepts db_connection in __init__"
},
{
"name": "compute_kpi signature",
"max_score": 8,
"description": "compute_kpi() accepts at minimum: kpi_name, start_date, end_date, dimensions (optional), and granularity parameters"
},
{
"name": "compute_period_comparison method",
"max_score": 8,
"description": "FinancialMetricsEngine exposes a compute_period_comparison() method (not a standalone function)"
},
{
"name": "DATE_TRUNC for time grouping",
"max_score": 10,
"description": "Time-series aggregation uses DATE_TRUNC with the granularity parameter (e.g. DATE_TRUNC('day', order_date)) rather than strftime or manual date truncation"
},
{
"name": "prior_period calculation",
"max_score": 10,
"description": "For compare_to='prior_period': prior period end is the day before current start, and prior period is of equal length to the current period"
},
{
"name": "prior_year calculation",
"max_score": 8,
"description": "For compare_to='prior_year': both prior start and end dates are offset by exactly 365 days (not calendar year subtraction)"
},
{
"name": "Variance output fields",
"max_score": 8,
"description": "compute_period_comparison() returns a dict with at minimum: kpi, current_value, prior_value, variance_absolute, and variance_pct"
},
{
"name": "NULLIF for pct calculation",
"max_score": 8,
"description": "Percentage variance calculation handles zero prior value using NULLIF or equivalent null-safe division"
},
{
"name": "Daily snapshot recommendation",
"max_score": 10,
"description": "Design notes or architecture doc mentions using daily snapshot tables rather than live transaction queries for dashboard loads"
},
{
"name": "Data freshness indicator",
"max_score": 10,
"description": "Code or design includes a data freshness check or indicator showing when data was last updated, rather than silently returning stale data"
},
{
"name": "Both absolute and pct variance",
"max_score": 8,
"description": "Period comparison output includes both absolute variance and percentage variance values (not just one)"
},
{
"name": "Raises on unknown compare_to",
"max_score": 4,
"description": "compute_period_comparison() raises a ValueError (or equivalent) for unrecognised compare_to values, not silently returning empty/wrong data"
}
]
}
Financial Metrics Computation Engine
Problem/Feature Description
A Series B e-commerce company has a growing analytics team that needs a shared Python library for computing financial KPIs consistently across multiple dashboards and reports. Right now, each analyst writes their own version of the revenue query with slightly different date logic, leading to conflicting numbers in different reports. The VP of Analytics wants to establish a single, reusable metrics engine that handles all date arithmetic, time-series granularity, and period-over-period comparisons — so every dashboard and report pulls from the same logic.
The engine should be able to serve a live operations dashboard (checking how this month is trending vs. last month), a board pack (comparing this quarter to the same quarter last year), and ad hoc analysis (any custom date range). The team also wants the system designed so it can eventually serve data from pre-aggregated snapshot tables rather than live transaction queries — since the dashboards are slow to load when they hit the raw fact table directly.
Output Specification
Produce a Python module metrics_engine.py containing:
1. A KPI registry with at least 3 KPI definitions (e.g. gross_revenue, gross_margin_pct, customer_acquisition_cost). 2. A FinancialMetricsEngine class with the following methods:
- One method for computing a single KPI over a date range, supporting time-series output at configurable time granularity and optional dimension filtering.
- One method for computing period-over-period comparisons, supporting at least two comparison modes (current period vs. equivalent prior period, and vs. same period one year ago).
3. A design_notes.md explaining the data architecture choices — specifically how the engine is designed for a snapshot-based data layer, and how the system would surface data freshness information to dashboard users when the underlying data is stale or unavailable.
Also include a demo.py that can be run directly (using SQLite in-memory or pandas) to demonstrate that both methods work correctly with sample data, and prints the results to stdout.
{
"context": "Tests whether the agent implements revenue variance decomposition using the volume-effect/price-effect methodology, with correct filtering thresholds, SQL safety patterns, and result ordering.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Volume effect formula",
"max_score": 12,
"description": "Volume effect is calculated as (current_units - prior_units) × prior_ASP — not current ASP or average ASP"
},
{
"name": "Price effect formula",
"max_score": 12,
"description": "Price effect is calculated as prior_units × (current_ASP - prior_ASP) — not current units"
},
{
"name": "Variance minimum filter",
"max_score": 8,
"description": "Rows with total_variance absolute value below $1,000 are excluded from the output"
},
{
"name": "Effect minimum threshold",
"max_score": 8,
"description": "Volume and price effects are only reported in explanations when their absolute value exceeds $500"
},
{
"name": "NULLIF for division",
"max_score": 8,
"description": "Any SQL expressions dividing revenue by unit counts use NULLIF to avoid division-by-zero errors"
},
{
"name": "Order by absolute variance",
"max_score": 8,
"description": "Results are ordered by absolute variance descending (largest movers first)"
},
{
"name": "Result count limit",
"max_score": 8,
"description": "Output is limited to at most 20 channel/category combinations"
},
{
"name": "Channel and category breakdown",
"max_score": 8,
"description": "Variance is broken down by both channel and category dimensions (not just one dimension)"
},
{
"name": "Both absolute and pct shown",
"max_score": 8,
"description": "Output or explanation includes both absolute dollar variance and percentage variance — not just one"
},
{
"name": "Human-readable explanation",
"max_score": 10,
"description": "Output includes a plain-language explanation string per row (e.g. 'DTC / Apparel decreased by $12,400. Drivers: 230 lower units...')"
},
{
"name": "COALESCE for new segments",
"max_score": 10,
"description": "Query handles new channel/category combinations (present in current period but not prior) using COALESCE or LEFT JOIN to avoid null comparisons"
}
]
}
Revenue Variance Root-Cause Analysis Tool
Problem/Feature Description
The finance team at a multi-channel e-commerce company is spending several hours each week manually digging into why their revenue numbers changed. After a month where gross revenue dropped 12% versus the prior month, the CFO asked the analytics team to automate the explanation: rather than just knowing that revenue fell, the business needs to understand whether it was because fewer customers bought (volume), or because they paid less (price), and which specific channels and product categories were responsible.
The team works with a SQL database containing order facts broken down by channel (e.g. DTC website, Amazon marketplace, wholesale) and product category (e.g. apparel, accessories, homeware). They want a reusable analysis script that can compare any two periods, identify the largest movers, and generate a plain-language explanation for each — so the finance team can paste the output directly into their weekly business review.
Output Specification
Produce a Python script variance_analysis.py that:
1. Accepts two period identifiers as inputs (current and prior, e.g. '2024-03' and '2024-02') and a database connection (or equivalent mock). 2. Queries or processes order data broken down by channel and category for both periods. 3. Decomposes the revenue variance for each channel/category combination into its component drivers. 4. Filters and ranks results to surface only the most meaningful movers. 5. Returns or prints a structured list of explanation dicts with all fields needed to understand what happened.
Also produce a sample_run.py that demonstrates the analysis using an in-memory dataset (e.g. using pandas DataFrames or SQLite in-memory database) with at least 3 channels × 3 categories across 2 periods. The sample output should be visible when python sample_run.py is run.
Input Files
No external files are needed. Generate sample data inline in sample_run.py.
{
"name": "finsi/financial-analytics-dashboard",
"version": "0.1.0",
"summary": "Build interactive financial KPI dashboards with customizable metrics, drill-down analysis, variance explanations, and automated threshold-based alerting",
"skills": {
"financial-analytics-dashboard": {
"path": "SKILL.md"
}
}
}