Effective field goal % calculator
Ten makes, four of them threes, on twenty attempts is an eFG% of 60 against a raw 50: each made three counts as an extra half make, so shooting nights are compared fairly. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Fgm
- 10
- Three pointers made
- 4
- Fga
- 20
- Efg percent
- 60
- Efg
- 0.6
- Field goal percent
- 50
- Two pointers made
- 6
Effective field goal percentage, abbreviated eFG%, is the basketball shooting rate that gives extra weight to made three-pointers so a three-heavy night is not scored the same as a mid-range night with the same raw field-goal percentage. This calculator accepts field goals made, three-pointers made, and field-goal attempts, then returns the percentage using the standard identity (FGM + 0.5 × 3PM) divided by FGA. Zero attempts are rejected because the rate is undefined when nobody shot; negative counts are rejected because a box score cannot go below zero.
What effective field goal percentage measures and why FG% is not enough
Effective field goal percentage, often written eFG% on box scores and scouting reports, answers a question that raw field-goal percentage cannot: how efficient was this shooter once extra credit for three-pointers is included? A player who goes four-for-ten from the field with four made threes produced twelve points from those ten attempts; a teammate who goes four-for-ten with zero threes produced eight points. Both have a forty percent field-goal rate, yet the first night is clearly better.
The standard identity, popularized in Dean Oliver's Four Factors of basketball success, is eFG% equals field goals made plus one-half of three-pointers made, all divided by field-goal attempts. Multiplying by one hundred publishes a percentage that sits next to FG% on the same scale. Two-pointers still count as one make; each made three adds an extra half make so the extra point is not ignored.
This calculator implements that identity exactly: it does not estimate free-throw skill (that is true shooting percentage), does not require minutes or possessions, and does not scrape a league feed. You already have FGM, 3PM, and FGA from the box score; you get a deterministic percentage you can recompute by hand. Treat the number as a transparent shooting-efficiency figure, not as a player ranking, defensive context, or shot-quality model such as expected effective field-goal percentage from tracking cameras.
Practical tips, limits, and when to use this calculator
Copy FGM, 3PM, and FGA from the same split: a player game, a team half, a season, or a play-type slice all work as long as the three counts describe the same sample. Do not mix a player's makes with a team's attempts. Count only field goals; free throws belong in true shooting percentage, not here, and offensive rebounds or turnovers belong in other Four Factors.
A night of only threes can push eFG% above one hundred percent: ten-for-ten from three is one hundred fifty percent effective, which is correct, not a bug. Stay inside the published limits of one million on each count, which covers a career or a league-wide rollup without inviting unbounded integers. Prefer this capability when you already have the three box-score counts and only need the Oliver identity.
Round-trip checks are easy: ten makes, four threes, twenty attempts should return sixty percent, and doubling attempts at the same makes should halve the rate.
What you can do with it
Scouting and box-score conversion
Analysts paste FGM, 3PM, and FGA from a game or stretch and publish eFG% next to raw FG% without a spreadsheet formula drifting between files.
Classroom Four Factors drills
Coaches and teachers generate answer keys that apply (FGM + 0.5 × 3PM) / FGA so students see why two identical FG% nights are not equally efficient.
FAQ
How is effective field goal percentage calculated?
eFG% = (FGM + 0.5 × 3PM) / FGA × 100. Field goals made plus half of three-pointers made, divided by field-goal attempts, then scaled to a percentage.
Why can eFG% be higher than 100%?
Each made three is worth one and a half two-point makes in this identity. A perfect night of only threes yields 150%. That is the theoretical maximum, not an overflow.
Is the eFG calculator free?
The browser tool is free and runs locally.
What is the difference between eFG% and FG%?
FG% treats every make the same; eFG% adds half a make for each three. A player who goes four-for-ten with four threes scores twelve points, a teammate four-for-ten with no threes scores eight: both shoot forty percent, but eFG% shows the gap.
Can made threes be more than field goals made?
No. Every made three is also a made field goal, so a three-point count above the field goals made is rejected, as are makes above attempts. Copy all three counts from the same game, half or season.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/sports/efg \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"fgm":10,"three_pointers_made":4,"fga":20}'const res = await fetch("https://api.kit.forhosting.com/sports/efg", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"fgm": 10,
"three_pointers_made": 4,
"fga": 20
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/sports/efg",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"fgm": 10,
"three_pointers_made": 4,
"fga": 20
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/sports/efg", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"fgm":10,"three_pointers_made":4,"fga":20}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"fgm":10,"three_pointers_made":4,"fga":20}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/sports/efg", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"fgm": 10,
"three_pointers_made": 4,
"fga": 20
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "sports.efg",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_fgm | 1000000 |
max_three_pointers_made | 1000000 |
max_fga | 1000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
How to call the API, which fields it needs, and how errors are raised
Makes that exceed attempts are rejected rather than silently clipped. Wire the free browser form for scouting and homework, then call the identical contract from scripts when you need bulk box-score conversion. Send a JSON body with three required integer fields. The field fgm is field goals made, a non-negative integer from zero through one million, with aliases field_goals_made and fg_made. The field three_pointers_made is made three-pointers, a non-negative integer in the same range, with aliases tpm, threes_made, and three_pm; it cannot exceed fgm because every made three is also a made field goal. The field fga is field-goal attempts, a non-negative integer with aliases field_goal_attempts, fg_attempts, and attempts. When fga is zero the task fails with invalid_input, because eFG% is a ratio and division by zero is undefined. Negative counts fail with invalid_input as well, naming the field that went below zero. On success the body returns efg_percent as the primary percentage, efg as the same rate on a zero-to-one-and-a-half scale, field_goal_percent as the raw make rate for comparison, the echoed counts plus derived two_pointers_made, the formula string, method oliver_efg, a short message, and an ordered steps array you can show next to the answer. A classic check is ten field goals made, four threes, and twenty attempts: weighted makes equal twelve, eFG% equals sixty, raw FG% equals fifty. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Practical tips, limits, and when to use this calculator
Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you deliberately send zero attempts to test client validation. This page targets people searching for an eFG calculator, effective field goal percentage calculator, or eFG% from FGM 3PM FGA; it is not a true-shooting tool, not a points-per-possession model, and not a tracking expected-eFG estimator. API pricing remains $0.002 per successful request with unit item.
Integration use cases
Season logs and app shooting columns
Stat apps store the three counts per game, then call this tool once to fill an eFG% column that matches the free browser widget byte for byte.
Technical questions
What happens if field-goal attempts is zero?
The API returns invalid_input. eFG% is undefined when nobody attempted a field goal, so a zero FGA is rejected rather than returning infinity or a fake zero.
Can three-pointers made exceed field goals made?
No. Every made three is also a made field goal, so three_pointers_made cannot exceed fgm. Makes also cannot exceed attempts. Those cases fail with invalid_input.