# Financial Health Score for SMEs & Startups (`bloom-consulting/financial-health-score`) Actor

Score a company's financial health 0-100 across 12 CFO-grade KPIs from one set of financial statements. Returns a score card, an HTML/PDF report with diagnosis and prioritised actions, and an Excel workbook. English and Turkish.

- **URL**: https://apify.com/bloom-consulting/financial-health-score.md
- **Developed by:** [Bloom Consulting](https://apify.com/bloom-consulting) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Financial Health Score for SMEs & Startups

Turn one set of financial statements into a **0-100 financial health score**, a diagnosis of what is weak, and a prioritised action list — the kind of read a fractional CFO gives you in a first session.

No API keys, no LLM calls, no data sent anywhere. The scoring is deterministic: the same numbers always produce the same score, and every KPI shows the formula it was computed from.

### What it does

The Actor computes **12 KPIs** from your income statement and balance sheet, scores each one against a rubric chosen for your sector, and rolls them into a single weighted score.

| Category | Weight | KPIs |
| --- | --- | --- |
| Profitability | 25% | Gross margin, EBITDA margin, net margin |
| Liquidity | 25% | Current ratio, acid-test ratio, cash conversion cycle |
| Capital efficiency | 25% | Debt / equity, interest coverage, working capital days |
| Growth | 25% | Monthly revenue growth, customer concentration, churn |

The score lands in one of three bands: **0-40 urgent action needed**, **41-70 improvement areas are clear**, **71-100 healthy, ready to grow**.

A KPI you cannot supply data for is reported as **not measured** — never silently scored as zero. The report states how many of the 12 were actually measured, so you can see how much the score is worth.

Three sector rubrics are available: `general`, `saas` and `retail`. They change the thresholds — a 12% net margin is strong in retail and unremarkable in SaaS.

### What you get

Every run writes these to the run's key-value store:

| File | What it is |
| --- | --- |
| `score-card.md` | One-screen summary: score, band, weakest KPIs, top actions |
| `report.html` | Full report — every KPI with its formula, value, points, diagnosis and action |
| `report.pdf` | The same report, print-ready |
| `table.xlsx` | KPI table, inputs and the scoring rubric, as a spreadsheet |
| `data.json` | Everything above as structured data |
| `input.json` | The exact input the engine used |

The dataset row carries the score, band, category, number of measured KPIs, the diagnosis, the weakest KPIs and the recommended actions — so you can chain this into a sheet, a database or another Actor.

### Input

Tick **Run with sample data** for a full example run before you enter anything.

Otherwise fill **Financial data** with one period of statements. Field names can be English or Turkish. Anything you do not have, leave as `null`.

```json
{
  "company": "Example Technology Inc.",
  "period": "Last 12 months - end of June 2026",
  "currency": "USD",
  "sectorProfile": "saas",
  "incomeStatement": {
    "netSales": 24500000,
    "costOfSales": 13200000,
    "operatingExpenses": 8100000,
    "depreciation": 600000,
    "interestExpense": 900000,
    "netProfit": 1100000
  },
  "balanceSheet": {
    "cashAndEquivalents": 2400000,
    "tradeReceivables": 4900000,
    "inventory": 1800000,
    "totalCurrentAssets": 9800000,
    "currentLiabilities": 7300000,
    "tradePayables": 3100000,
    "totalFinancialDebt": 5200000,
    "equity": 6100000
  },
  "monthlyRevenue": [1650000, 1700000, 1780000, 1820000, 1900000,
                     1950000, 2050000, 2100000, 2200000, 2280000,
                     2350000, 2450000],
  "annualInflationRate": 3,
  "customer": {
    "largestCustomerShare": 22,
    "annualChurnRate": 12,
    "churnNotApplicable": false
  }
}
```

Notes:

- **Amounts** must all be in the same currency. Use plain numbers.
- **`monthlyRevenue`** is the last 12 months, oldest first. It drives the compound monthly growth rate.
- **`annualInflationRate`** is a percentage. Supply it and growth is scored in **real** terms instead of nominal — which changes the answer completely in a high-inflation market.
- **`largestCustomerShare`** and **`annualChurnRate`** are percentages. Set `churnNotApplicable: true` if churn is not a meaningful metric for your model.
- Instead of the JSON field you can pass **Input file URL** — a public link to a JSON or CSV file with the same data.

### Report language

`language: "en"` or `"tr"`. Every output — score card, HTML, PDF, spreadsheet — is produced in the chosen language.

### Typical uses

- **Founders** — a quarterly read on whether the business is actually healthy, in language an investor will recognise.
- **Investors and accelerators** — score a portfolio consistently instead of eyeballing each set of statements.
- **Accountants and advisors** — turn a trial balance you already have into a client-facing report in one run.
- **Lenders** — a repeatable first-pass credit read.

### Cost

The Actor is free to use; you pay only Apify platform usage for the run. A run takes roughly 15-40 seconds, most of it PDF rendering. Turn **Generate PDF** off for the cheapest possible run.

### Limits and honesty

- The score is a **screening tool**, not an audit and not investment advice. It sees the numbers you give it and nothing else.
- Garbage in, garbage out: figures taken from an unreconciled ledger produce a confident-looking score that means nothing.
- The rubric encodes one point of view about what "healthy" means. It is documented in `table.xlsx` so you can disagree with it explicitly.

### About

Built by **Bloom Consulting**, a fractional CFO practice working with startups and SMEs. The [paid desktop edition](https://bloomconsulting.com.tr/paketler?utm_source=apify\&utm_medium=store\&utm_campaign=nabiz\&utm_content=readme-paid#ajanlar) adds period-over-period comparison, your own rubric weights and branded report templates.

- Web: [bloomconsulting.com.tr](https://bloomconsulting.com.tr/?utm_source=apify\&utm_medium=store\&utm_campaign=nabiz\&utm_content=readme-footer)
- Contact: iletisim@bloomconsulting.com.tr

Found a bug or want a KPI added? Open an issue on the Actor page.

# Actor input Schema

## `useSampleData` (type: `boolean`):

Ignore the fields below and run on a built-in example company. Use this first to see what the report looks like. Reports produced this way are stamped DEMO.

## `financials` (type: `object`):

Income statement for the last 12 months and balance sheet at period end, in a single currency. English and Turkish field names are both accepted. sectorProfile: general | saas | retail — it selects the scoring rubric. monthlyRevenue takes the last 12 months, oldest first, and drives the growth and volatility KPIs. Leave a field as null if you do not have it.

## `inputFileUrl` (type: `string`):

Alternative to the field above: a public http(s) URL of a JSON or CSV file holding the same data. Used only when "Financial data" is empty.

## `companyName` (type: `string`):

Overrides the company name inside the data. Leave empty to keep it.

## `language` (type: `string`):

Language of the score card, HTML report, PDF and spreadsheet.

## `generatePdf` (type: `boolean`):

Print the HTML report to PDF with headless Chromium. Turn off for a faster, cheaper run.

## Actor input object example

```json
{
  "useSampleData": false,
  "financials": {
    "company": "Example Technology Inc.",
    "period": "Last 12 months - end of June 2026",
    "currency": "USD",
    "sectorProfile": "saas",
    "incomeStatement": {
      "netSales": 24500000,
      "costOfSales": 13200000,
      "operatingExpenses": 8100000,
      "depreciation": 600000,
      "ebitda": null,
      "interestExpense": 900000,
      "netProfit": 1100000
    },
    "balanceSheet": {
      "cashAndEquivalents": 2400000,
      "tradeReceivables": 4900000,
      "inventory": 1800000,
      "totalCurrentAssets": 9800000,
      "currentLiabilities": 7300000,
      "tradePayables": 3100000,
      "totalFinancialDebt": 5200000,
      "equity": 6100000
    },
    "monthlyRevenue": [
      1650000,
      1700000,
      1780000,
      1820000,
      1900000,
      1950000,
      2050000,
      2100000,
      2200000,
      2280000,
      2350000,
      2450000
    ],
    "annualInflationRate": 3,
    "customer": {
      "largestCustomerShare": 22,
      "annualChurnRate": 12,
      "churnNotApplicable": false
    }
  },
  "language": "en",
  "generatePdf": true
}
```

# Actor output Schema

## `results` (type: `string`):

The score: 0-100 result, band, category scores, how many of the 12 KPIs were measured, the diagnosis, the weakest KPIs and the recommended actions.

## `scoreCard` (type: `string`):

One-screen summary: the score, the band, the weakest KPIs and the top actions.

## `reportHtml` (type: `string`):

The full report, section by section, ready to read in the browser.

## `reportPdf` (type: `string`):

The same report, print-ready.

## `workbook` (type: `string`):

The KPI table, the inputs and the scoring rubric.

## `data` (type: `string`):

Every intermediate figure the report was built from - the audit trail.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "financials": {
        "company": "Example Technology Inc.",
        "period": "Last 12 months - end of June 2026",
        "currency": "USD",
        "sectorProfile": "saas",
        "incomeStatement": {
            "netSales": 24500000,
            "costOfSales": 13200000,
            "operatingExpenses": 8100000,
            "depreciation": 600000,
            "ebitda": null,
            "interestExpense": 900000,
            "netProfit": 1100000
        },
        "balanceSheet": {
            "cashAndEquivalents": 2400000,
            "tradeReceivables": 4900000,
            "inventory": 1800000,
            "totalCurrentAssets": 9800000,
            "currentLiabilities": 7300000,
            "tradePayables": 3100000,
            "totalFinancialDebt": 5200000,
            "equity": 6100000
        },
        "monthlyRevenue": [
            1650000,
            1700000,
            1780000,
            1820000,
            1900000,
            1950000,
            2050000,
            2100000,
            2200000,
            2280000,
            2350000,
            2450000
        ],
        "annualInflationRate": 3,
        "customer": {
            "largestCustomerShare": 22,
            "annualChurnRate": 12,
            "churnNotApplicable": false
        }
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bloom-consulting/financial-health-score").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "financials": {
        "company": "Example Technology Inc.",
        "period": "Last 12 months - end of June 2026",
        "currency": "USD",
        "sectorProfile": "saas",
        "incomeStatement": {
            "netSales": 24500000,
            "costOfSales": 13200000,
            "operatingExpenses": 8100000,
            "depreciation": 600000,
            "ebitda": None,
            "interestExpense": 900000,
            "netProfit": 1100000,
        },
        "balanceSheet": {
            "cashAndEquivalents": 2400000,
            "tradeReceivables": 4900000,
            "inventory": 1800000,
            "totalCurrentAssets": 9800000,
            "currentLiabilities": 7300000,
            "tradePayables": 3100000,
            "totalFinancialDebt": 5200000,
            "equity": 6100000,
        },
        "monthlyRevenue": [
            1650000,
            1700000,
            1780000,
            1820000,
            1900000,
            1950000,
            2050000,
            2100000,
            2200000,
            2280000,
            2350000,
            2450000,
        ],
        "annualInflationRate": 3,
        "customer": {
            "largestCustomerShare": 22,
            "annualChurnRate": 12,
            "churnNotApplicable": False,
        },
    } }

# Run the Actor and wait for it to finish
run = client.actor("bloom-consulting/financial-health-score").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "financials": {
    "company": "Example Technology Inc.",
    "period": "Last 12 months - end of June 2026",
    "currency": "USD",
    "sectorProfile": "saas",
    "incomeStatement": {
      "netSales": 24500000,
      "costOfSales": 13200000,
      "operatingExpenses": 8100000,
      "depreciation": 600000,
      "ebitda": null,
      "interestExpense": 900000,
      "netProfit": 1100000
    },
    "balanceSheet": {
      "cashAndEquivalents": 2400000,
      "tradeReceivables": 4900000,
      "inventory": 1800000,
      "totalCurrentAssets": 9800000,
      "currentLiabilities": 7300000,
      "tradePayables": 3100000,
      "totalFinancialDebt": 5200000,
      "equity": 6100000
    },
    "monthlyRevenue": [
      1650000,
      1700000,
      1780000,
      1820000,
      1900000,
      1950000,
      2050000,
      2100000,
      2200000,
      2280000,
      2350000,
      2450000
    ],
    "annualInflationRate": 3,
    "customer": {
      "largestCustomerShare": 22,
      "annualChurnRate": 12,
      "churnNotApplicable": false
    }
  }
}' |
apify call bloom-consulting/financial-health-score --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bloom-consulting/financial-health-score"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/J6cr4vlUCya8qB65A/builds/KB2VynwvJrxeEv5es/openapi.json
