ElasticFlow
HubAll SkillsBy DepartmentBy RoleBy ToolBy MetricMCPsPublishers
WebsiteLoginSign Up
ElasticFlow

Transform your business with AI-powered workflow automation. One unified platform for all your enterprise needs.

Follow us

Platform

  • Features
  • Benefits
  • Use Cases
  • Workflow Library

Use Cases

  • Sales
  • Marketing
  • Finance & Legal
  • HR

Catalogue

  • Departments
  • Roles
  • Tools
  • Metrics
  • Platforms

Growth

  • Referral Program
  • Partners

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy
  • Acceptable Use
  • Security
  • SLA

© 2026 ElasticFlow. All rights reserved.

ElasticFlow
HubAll SkillsBy DepartmentBy RoleBy ToolBy MetricMCPsPublishers
WebsiteLoginSign Up
ElasticFlow

Transform your business with AI-powered workflow automation. One unified platform for all your enterprise needs.

Follow us

Platform

  • Features
  • Benefits
  • Use Cases
  • Workflow Library

Use Cases

  • Sales
  • Marketing
  • Finance & Legal
  • HR

Catalogue

  • Departments
  • Roles
  • Tools
  • Metrics
  • Platforms

Growth

  • Referral Program
  • Partners

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy
  • Acceptable Use
  • Security
  • SLA

© 2026 ElasticFlow. All rights reserved.

ElasticFlow
HubAll SkillsBy DepartmentBy RoleBy ToolBy MetricMCPsPublishers
WebsiteLoginSign Up
  1. Hub
  2. All Skills
  3. Metric Reconciliation
AI SkillReconcile metricsOperations

Explain why two reports show different numbers for the same metric. — Claude Skill

A Claude Skill for Claude Code by Nimrod Fisher — run /metric-reconciliation in Claude·Updated Jun 12, 2026·vmain@8849884

Compatible withClaude

Compares definitions, filters, time periods, source systems, and freshness so teams can choose the right number and fix the mismatch.

  • Compares the same metric across dashboards, SQL, Jira, PMO, spreadsheets, or finance reports.
  • Calculates the size of the difference and whether it is inside an agreed tolerance.
  • Checks common causes: definition drift, filters, joins, grain, timezone, null handling, and data freshness.
  • Produces a reconciliation report with root cause, source of truth, and required fix.
YouToday

Teams debate whose dashboard is right without comparing definitions, filters, grain, and freshness side by side.

With /metric-reconciliation

Run /metric-reconciliation to compute the gap, trace both paths, classify the divergence, and document the canonical answer.

1 Define metric2 Pull both values3 Compute gap4 Trace divergence5 Document fix

Who this is for

Analytics Engineer

Resolve metric discrepancies across dashboards, SQL, Jira, PMO, and reporting sources.

See skills for this role
Product Manager

Turn Jira vs PMO or delivery metric gaps into a documented source-of-truth decision.

See skills for this role

What it does

Jira vs PMO mismatch

Explain why delivery or progress numbers differ across status reports.

Dashboard vs warehouse mismatch

Find why a BI dashboard and SQL source disagree.

Source-of-truth decision

Pick the canonical definition and document the change needed.

How it works

1

Name the metric, source A, source B, time period, and expected tolerance.

2

Pull values, definitions, filters, and calculation steps from each source.

3

Calculate the gap and trace where the numbers diverge.

4

Document the root cause, canonical source, owner, and follow-up change.

Input options

Metric and sources

Metric name, values from each source, links, exports, SQL, or report screenshots.

Example

Example input
Metric: May completed delivery items.

Source A: Jira dashboard shows 42 completed tickets.
Source B: PMO report shows 37 completed deliverables.

Deadline: executive status meeting tomorrow.

Known differences:
- Jira includes subtasks.
- PMO excludes reopened items.
- PMO counts only accepted deliverables.

Need: explain the gap and give status-report wording.
What the skill returns
How it reads the request
The skill does not assume one report is wrong. It compares the definitions behind both numbers first.
Gap
Jira shows 42 and PMO shows 37, so the visible gap is 5 items.
Root cause
This is a definition mismatch. Jira counts completed tickets and subtasks. PMO counts accepted deliverables and excludes reopened work.
Which number to use
Use PMO 37 for executive status. Use Jira 42 for engineering throughput only after filtering out subtasks and reopened items.
Status-report wording
“37 accepted deliverables completed in May. Engineering closed 42 Jira items including subtasks. The difference is due to reporting definition, not missing work.”

Metrics this improves

Forecast Accuracy
+10-20%
Operations
Data Quality
+10-20%
Operations
Metric Trust
+25-40%
Operations

Works with

Google Sheets
manual

Compare spreadsheet exports and reconciliation workbooks against source systems.

Jira
manual

Compare delivery, issue status, and PMO progress metrics sourced from Jira.

SQL
manual

Trace query logic, joins, grain, filters, and time boundaries when metrics disagree.

Confluence
manual

Document reconciliation findings, canonical definitions, and stakeholder decisions.

Similar skills

Auto-suggested by attribute overlap. Side-by-side comparison shows what differs.

Compare all 4 →

Programmatic SEO Page Planner

by Gooseworks
↳text, file-uploadvstext, url(What you provide)·markdown, csvvsmarkdown(Output formats)·review-requiredvsapproval-required(Human review)

Topical Authority Mapper

by Gooseworks
↳text, file-uploadvstext(What you provide)·markdown, csvvsmarkdown(Output formats)·review-requiredvsapproval-required(Human review)

A/B Test Setup

by Corey Haines
↳text, file-uploadvstext, tool-access(What you provide)·markdown, csvvsmarkdown(Output formats)·review-requiredvsapproval-required(Human review)
Sorted by attribute overlap × differentiation. Metric Reconciliation shares 12+ attributes with each.

Want to use Metric Reconciliation?

Choose how to get started.

Run in Claude Code
Free. Open source.

Install and run this skill locally on your computer.

1
Install Claude Code

Open a terminal on your computer and paste this command:

2
Install the skill

This downloads the skill with all its files to your computer:

Add -g at the end to make it available in all your projects.

3
Run it

Start Claude Code, then type the command:

then
View source on GitHub
Use on ElasticFlow
Team and collaboration features

Run skills from your browser. Share results, manage access, collaborate with your team. No terminal needed.

Free 14-day trial. Cancel anytime.

View on GitHub

Metric Reconciliation

When to use

  • Two dashboards or reports show different values for the same KPI
  • A metric changed unexpectedly after a data pipeline update
  • Stakeholders question a number and need an authoritative explanation
  • Preparing to merge or deprecate a legacy reporting source
  • Onboarding analysts to a new data model and validating it against the old one

Process

  1. Define the metric and scope — confirm the exact definition (numerator, denominator, filters, time zone) and the period under investigation. Mismatched definitions are the most common cause of discrepancy.
  2. Pull values from both sources — extract the metric values for the same period from each source. Record absolute values, row counts, and the query or calculation path used.
  3. Compute the gap — calculate the absolute difference and percentage gap. If the gap is within an agreed tolerance (e.g., ±0.1%), document it as accepted and close. See references/reconciliation_patterns.md for tolerance guidelines.
  4. Trace the computation path — walk each source's query or pipeline step by step. Common divergence points: different join types, filter order, null handling, date truncation, or deduplication logic.
  5. Identify the root cause — classify the cause using references/metric_discrepancy_guide.md (definition mismatch, data freshness, aggregation grain, calculation bug). Document the divergence point with a code snippet or query excerpt.
  6. Resolve and document — fix the calculation or accept a canonical source, then complete assets/reconciliation_report_template.md and share with stakeholders.

Inputs the skill needs

  • The metric name and business definition (numerator, denominator, any known variants)
  • Access to both sources (queries, dashboard SQL, or raw data)
  • The time period showing the discrepancy
  • Row counts or record-level data to enable line-by-line comparison if needed
  • Any known recent changes to pipelines, schema, or business rules

Output

  • assets/reconciliation_report_template.md — completed report showing source A vs. source B, the gap, root cause, and resolution status
  • A corrected query or pipeline change (if a bug was found)
  • A documented tolerance agreement (if the gap is acceptable)

Reference documents


name: metric-reconciliation description: Trace and resolve discrepancies when the same metric shows different values in two or more sources. Use before reporting, after pipeline changes, or when stakeholders question a number.

Metric Reconciliation

When to use

  • Two dashboards or reports show different values for the same KPI
  • A metric changed unexpectedly after a data pipeline update
  • Stakeholders question a number and need an authoritative explanation
  • Preparing to merge or deprecate a legacy reporting source
  • Onboarding analysts to a new data model and validating it against the old one

Process

  1. Define the metric and scope — confirm the exact definition (numerator, denominator, filters, time zone) and the period under investigation. Mismatched definitions are the most common cause of discrepancy.
  2. Pull values from both sources — extract the metric values for the same period from each source. Record absolute values, row counts, and the query or calculation path used.
  3. Compute the gap — calculate the absolute difference and percentage gap. If the gap is within an agreed tolerance (e.g., ±0.1%), document it as accepted and close. See references/reconciliation_patterns.md for tolerance guidelines.
  4. Trace the computation path — walk each source's query or pipeline step by step. Common divergence points: different join types, filter order, null handling, date truncation, or deduplication logic.
  5. Identify the root cause — classify the cause using references/metric_discrepancy_guide.md (definition mismatch, data freshness, aggregation grain, calculation bug). Document the divergence point with a code snippet or query excerpt.
  6. Resolve and document — fix the calculation or accept a canonical source, then complete assets/reconciliation_report_template.md and share with stakeholders.

Inputs the skill needs

  • The metric name and business definition (numerator, denominator, any known variants)
  • Access to both sources (queries, dashboard SQL, or raw data)
  • The time period showing the discrepancy
  • Row counts or record-level data to enable line-by-line comparison if needed
  • Any known recent changes to pipelines, schema, or business rules

Output

  • assets/reconciliation_report_template.md — completed report showing source A vs. source B, the gap, root cause, and resolution status
  • A corrected query or pipeline change (if a bug was found)
  • A documented tolerance agreement (if the gap is acceptable)

Metric Reconciliation Patterns

Why metrics diverge

1. Filter differences

The most common cause. Two queries pulling from the same table but with different WHERE clauses produce different numbers. Check: status filters, date truncation (>= vs BETWEEN), NULL handling, deleted record exclusion.

2. Join type mismatches

LEFT JOIN vs INNER JOIN silently adds or drops rows. A revenue figure joined LEFT to a customer table will count orders with no matching customer; INNER will drop them.

3. Grain mismatch

One query aggregates at order level; another at order-line level. Duplicate rows in one source inflates the total.

4. Time zone handling

UTC vs local time causes rows to land in different periods depending on the system. Common in global dashboards.

5. Definition drift

The business definition changed (e.g., "active user" now requires two sessions, not one) but not all pipelines were updated simultaneously.

6. Refresh lag

One source reflects yesterday's snapshot; another is near-real-time. Comparing them during an intra-day reconciliation produces a spurious gap.


Reconciliation investigation sequence

  1. Confirm the numbers — pull both values from authoritative sources, not cached dashboards.
  2. Check the grain — what does one row represent in each source?
  3. Align the period — are both using the same start/end boundary and time zone?
  4. Compare filters — list all WHERE conditions side by side.
  5. Compare joins — trace every JOIN and its type.
  6. Sample-level check — pull 20 rows present in A but not B, and vice versa.
  7. Document the root cause — record in assets/reconciliation_report_template.md.

Tolerance thresholds by metric type

Metric typeAcceptable gapNotes
Financial totals (reported)0%Must match exactly for audit
Financial totals (operational)< 0.1%Rounding from currency conversion
Marketing metrics< 1%Attribution window differences
Product engagement< 2%Session vs event counting differences
ML training labels< 0.5%Label leakage risk if higher

Documentation checklist after resolution

  • Root cause identified (one sentence)
  • Which source is designated as the single source of truth
  • Whether a pipeline fix is needed, or a definition clarification
  • Date the discrepancy was observed and resolved
  • Whether downstream consumers need recalculation

Metric Reconciliation Report

Metric: [metric name] Period: [date or date range] Analyst: [name] Date: [YYYY-MM-DD]


Values compared

SourceValueQuery / Pipeline
Source A[value][link or description]
Source B[value][link or description]

Absolute difference: [Source A − Source B] Percentage difference: [(A − B) / A × 100]% Within tolerance: Yes / No (tolerance: [threshold])


Root cause

Status: Confirmed / Under investigation / No issue

Cause category: Filter difference / Join type / Grain mismatch / Definition drift / Refresh lag / Other

Description: [One paragraph: what specific difference in the queries or pipelines explains the gap]


Evidence

Steps taken to identify the cause:

  1. [Step 1 — e.g., compared WHERE clauses]
  2. [Step 2 — e.g., checked JOIN types]
  3. [Step 3 — e.g., pulled row-level sample]

Key finding: [The specific line of query or pipeline behaviour that explains the discrepancy]


Resolution

Designated source of truth: [Source A / Source B / Neither — needs alignment]

Action required:

  • Pipeline fix needed (owner: [name], by: [date])
  • Query correction needed (owner: [name], by: [date])
  • Definition clarification needed (owner: [name], by: [date])
  • Downstream consumers need recalculation (list: [])
  • No action — gap is within tolerance

Preventive measure

[How will we catch this earlier in future? e.g., automated reconciliation check, CI test, data quality alert]


Template: reconciliation_report_template.md

""" Metric Reconciliation Helper

Compare a metric value from two sources for the same period and identify where the computation paths diverge.

Usage: python reconcile_metrics.py --source-a source_a.csv --source-b source_b.csv
--metric revenue --date 2025-01-01 python reconcile_metrics.py --values 125000 118500 --metric revenue --tolerance 0.02 """

import argparse import csv import io import sys

def compare_values(value_a: float, value_b: float, tolerance: float = 0.001) -> dict: """ Compare two metric values and return reconciliation stats.

Args:
    value_a: Value from source A
    value_b: Value from source B
    tolerance: Fractional tolerance below which gap is accepted (default 0.1%)

Returns:
    dict with absolute_diff, pct_diff, within_tolerance, status
"""
absolute_diff = value_a - value_b
pct_diff = absolute_diff / value_a if value_a != 0 else float("inf")
within_tolerance = abs(pct_diff) <= tolerance

return {
    "value_a": value_a,
    "value_b": value_b,
    "absolute_diff": absolute_diff,
    "pct_diff": pct_diff,
    "within_tolerance": within_tolerance,
    "status": "ACCEPTED" if within_tolerance else "INVESTIGATE",
}

def load_metric_from_csv(filepath: str, metric_col: str, date_col: str = None, date: str = None) -> float: """ Load a single metric value from a CSV file.

Sums metric_col for all rows matching date (if provided).
"""
total = 0.0
matched = 0

with open(filepath, newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        if date_col and date and row.get(date_col) != date:
            continue
        total += float(row[metric_col])
        matched += 1

if matched == 0:
    raise ValueError(f"No rows found in {filepath}" + (f" for date {date}" if date else ""))

return total

def reconciliation_report(result: dict, source_a_label: str, source_b_label: str) -> str: """Produce a human-readable reconciliation summary.""" lines = [ "=" * 60, "METRIC RECONCILIATION REPORT", "=" * 60, f" {source_a_label}: {result['value_a']:,.2f}", f" {source_b_label}: {result['value_b']:,.2f}", f" Absolute difference: {result['absolute_diff']:+,.2f}", f" Percentage difference: {result['pct_diff']:+.4%}", "", f" STATUS: {result['status']}", ]

if result["within_tolerance"]:
    lines.append("  Gap is within tolerance — no further action required.")
else:
    lines += [
        "",
        "  NEXT STEPS:",
        "  1. Compare query/pipeline definition for each source side-by-side.",
        "  2. Check: filter conditions, join types, null handling, date truncation.",
        "  3. Pull row-level data to find the first divergence point.",
        "  4. Document the root cause in assets/reconciliation_report_template.md.",
    ]

lines.append("=" * 60)
return "\n".join(lines)

def main(): parser = argparse.ArgumentParser(description="Reconcile a metric between two sources.") parser.add_argument("--source-a", help="Path to CSV for source A") parser.add_argument("--source-b", help="Path to CSV for source B") parser.add_argument("--values", nargs=2, type=float, metavar=("A", "B"), help="Direct values: --values 125000 118500") parser.add_argument("--metric", required=False, default="value", help="Column name for the metric") parser.add_argument("--date-col", default=None, help="Date column name for filtering") parser.add_argument("--date", default=None, help="Date to filter on (e.g. 2025-01-01)") parser.add_argument("--tolerance", type=float, default=0.001, help="Accepted gap fraction (default 0.001 = 0.1%%)") parser.add_argument("--label-a", default="Source A") parser.add_argument("--label-b", default="Source B") args = parser.parse_args()

if args.values:
    value_a, value_b = args.values
elif args.source_a and args.source_b:
    value_a = load_metric_from_csv(args.source_a, args.metric, args.date_col, args.date)
    value_b = load_metric_from_csv(args.source_b, args.metric, args.date_col, args.date)
else:
    parser.error("Provide --values or both --source-a and --source-b")

result = compare_values(value_a, value_b, args.tolerance)
print(reconciliation_report(result, args.label_a, args.label_b))

sys.exit(0 if result["within_tolerance"] else 1)

if name == "main": # Demo: two values with a 5.5% gap — should trigger INVESTIGATE demo_a = 125_000.0 demo_b = 118_120.0 result = compare_values(demo_a, demo_b, tolerance=0.001) print(reconciliation_report(result, "Dashboard (Source A)", "Finance Report (Source B)")) print() print("Demo exited with status:", "ACCEPTED" if result["within_tolerance"] else "INVESTIGATE")

ElasticFlow

Transform your business with AI-powered workflow automation. One unified platform for all your enterprise needs.

Follow us

Platform

  • Features
  • Benefits
  • Use Cases
  • Workflow Library

Use Cases

  • Sales
  • Marketing
  • Finance & Legal
  • HR

Catalogue

  • Departments
  • Roles
  • Tools
  • Metrics
  • Platforms

Growth

  • Referral Program
  • Partners

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy
  • Acceptable Use
  • Security
  • SLA

© 2026 ElasticFlow. All rights reserved.