Dialed Shot Plan
{{ formatNumber(target_yield_g, 1) }} g out
1:{{ ratioDisplay }}
{{ timeRangeLabel }}
{{ profileLabel }} · Dose {{ formatNumber(dose_g, 1) }} g · {{ waterTempDisplay }}
Flow {{ flowRangeLabel }} Pressure {{ pressureBadge }} Preinfuse {{ formatNumber(preinfusion_s, 0) }} s @ {{ formatNumber(preinfusion_pressure_bar, 1) }} bar Grind {{ grind_setting }}
g
1:
g out
sec
Window: {{ timeRangeLabel }}
{{ time_window_s }}s
{{ ratio_window.toFixed(2) }}
sec @ bar
bar
bar
g/s
Shot log entry
g
g out
sec
{{ logWarning }}
Field Target / Notes Copy
{{ row.field }}
{{ row.value }}
{{ row.hint }}
# Timestamp Dose Yield Time Ratio Notes Copy
Log a shot to start tracking adjustments.
#{{ entry.seq }} {{ entry.timestamp }} {{ entry.doseDisplay }} {{ entry.yieldDisplay }} {{ entry.timeDisplay }}
{{ entry.ratioDisplay }}
{{ entry.deltaRatio }}
{{ entry.notes }}
{{ entry.flowNote }}
{{ entry.taste }}
{{ entry.adjustment }}

          
:

Introduction:

Espresso shots are concentrated coffee drinks made by pushing hot water through a compact puck of ground coffee at high pressure. Tiny changes in dose, yield, time, temperature, and pressure can shift a shot from sweet and lively to sharp or bitter.

A simple espresso shot recipe planner turns those variables into a repeatable target, so you can change one thing at a time and see how grind and workflow affect the cup. It is a practical way to keep experiments comparable when you switch beans, baskets, or pressure profiles.

Choose a style that matches your goal, like a syrupy ristretto or a fast turbo style, and start with the dry coffee weight in the basket. The planner uses that dose and your target beverage weight to express the brew ratio and a time window you can aim to land inside.

As you pull shots, record what actually happened by logging the dose, beverage weight, and total time, plus a short note about flow, pressure, or taste. The log turns each entry into an actual ratio, an average flow rate, and a suggested next adjustment when results drift outside your target window.

A plan that looks perfect on paper can still taste off when puck prep, grind retention, or water temperature changes, so treat targets as guardrails and let taste confirm the final move. Weigh carefully, time consistently, and keep notes short and specific.

If you prefer measuring by volume or relying on automatic programs, a basic shot timer may be enough, but this planner is most useful when you want weight based repeatability and a written trail. After a few entries, watch for shots that miss both time and ratio, then fix flow first and taste again.

Technical Details:

The planner centers on a few measurable quantities: dry coffee mass in the portafilter, beverage mass in the cup, total shot time from pump on to final weight, and optional temperature and pressure targets. Together, these describe how much coffee you extracted and how quickly it moved through the puck.

From those measurements it computes brew ratio as beverage out per unit coffee in, and average flow rate as beverage out per unit time. It also builds a target time window around your chosen time, then translates that window into a flow range you can use as a quick reality check.

Results are interpreted with tolerance bands rather than a single perfect number. Ratio tolerance and time flex define what counts as close enough, and when a logged shot crosses a boundary the planner suggests a small adjustment using the same wording every time.

Comparisons are most meaningful when dose, basket, coffee, and timing method stay consistent. Treat the numbers as a structured way to learn your setup, not as a guarantee of flavor.

Core calculations

R = YD Favg = YT
Tmin = max 1 Ttarget - W Tmax = Ttarget + W Fmin = YTmax Fmax = YTmin

Symbols and units

Symbols used in espresso shot calculations
Symbol Meaning Unit or datatype Source
D Dose, dry coffee mass in the basket g Input
Y Yield, beverage mass in the cup g Input
T Shot time from pump on to final weight s Input
R Brew ratio, yield per unit dose unitless Derived
W Time flex, half width of the target time window s Input
Favg Average flow rate over the whole shot g/s Derived
Fmin, Fmax Flow range implied by the time window g/s Derived
Rtol Ratio tolerance used for target banding and suggestions unitless Input
P Pressure targets during preinfusion, peak, and finish bar Input
TC Water temperature expressed in Celsius °C Derived

Worked example

Using the default balanced plan with a dose of 18 g, a target ratio of 1:2.00, a 29 s target time, and 3 s time flex.

Y = D×R Y = 18×2.00 Y = 36.0 g
Tmin = 29-3=26 s Tmax = 29+3=32 s
Favg = 36.0291.24 g/s Fmin = 36.0321.13 g/s Fmax = 36.0261.38 g/s

With a ratio tolerance of 0.20, the target band is 1:1.80 to 1:2.20, and values near the edges may flip the suggested adjustment on repeat shots.

Interpretation and thresholds

How tolerance checks drive adjustment suggestions
Threshold band Lower bound Upper bound Interpretation Action cue
Ratio above target +Rtol More beverage per coffee than planned, often thinner body Tighten grind or lower yield to thicken body.
Ratio within tolerance -Rtol +Rtol Close to target ratio, prioritize taste and repeatability In range; consider small taste-driven tweaks only.
Ratio below target -∞ -Rtol Less beverage per coffee than planned, often heavier body Loosen grind or raise yield to open sweetness.
Time slower than window +W Shot ran longer than expected for the target Speed up: finer puck prep or slightly coarser grind.
Time faster than window -∞ -W Shot finished sooner than expected for the target Slow down: finer grind or longer preinfusion.
Average flow above range Fmax Flow suggests a faster puck than the planned window allows Flow too high: reduce preinfusion pressure or grind finer.
Average flow below range 0 Fmin Flow suggests a slower puck than the planned window allows Flow low: shorten preinfusion or grind coarser.

A single logged shot can trigger multiple cues, and the planner concatenates them in a consistent order: ratio, time, then flow.

Preset targets included

Built-in espresso shot style presets
Preset Target ratio Time range Preinfuse Peak→finish Finish flow Water temp
Balanced double 1:2.00 26–32 s 6 s @ 2.5 bar 9.0→6.0 bar 1.60 g/s 93 °C
Syrupy ristretto 1:1.80 24–30 s 8 s @ 3.0 bar 9.5→7.0 bar 1.40 g/s 94 °C
Turbo shot 1:2.40 18–24 s 4 s @ 2.0 bar 7.5→6.0 bar 2.10 g/s 92 °C
Allongé 1:3.00 30–38 s 5 s @ 2.5 bar 8.5→6.0 bar 2.30 g/s 93 °C
Competition sweet 1:2.20 25–31 s 7 s @ 2.5 bar 9.0→6.5 bar 1.70 g/s 93 °C

Selecting a preset also sets a default target time in the middle of the range, and the time flex is derived as half the range width.

Water temperature conversion

TC = TF - 32 × 59 TF = TC × 95 + 32

The plan displays both Celsius and Fahrenheit, while the exported JSON includes water_temp_c as the normalized value.

Units, precision, and rounding

  • Dose and yield are formatted to 1 decimal place in the plan and log displays.
  • Logged shot time is formatted to 1 decimal place, while the planned time window is shown as whole seconds.
  • Brew ratio is displayed to 2 decimals, and the app keeps ratio and yield synchronized by rounding yield to 2 decimals and ratio to 3 decimals when you edit directly.
  • When a host formatter is available, it formats numbers; otherwise fixed decimal formatting is used.

Validation and bounds from the UI

Input bounds and validation rules
Field Type Min Max Step or pattern Error text Placeholder
Style preset Select Balanced, Syrupy, Turbo, Allongé, Competition
Dose Number 12 0.5
Target ratio Number 1 0.05
Target yield Number 10 0.5
Shot time target Number 10 1
Water temperature Number 80 0.5
Temperature unit Select °C or °F
Grinder note Text Any text e.g., 6.5 on Niche or SSP HU
Time flex Range 1 12 1
Ratio tolerance Range 0.05 0.60 0.05
Preinfusion seconds Number 0 0.5
Preinfusion pressure Number 0 0.1
Peak pressure Number 3 0.5
Finish pressure Number 0 0.5
Finish flow target Number 0.5 0.1
Log dose used Number 10 0.1 Enter dose, yield, and time to log a shot.
Log yield Number 0 0.5 Enter dose, yield, and time to log a shot.
Log time Number 0 0.1 Enter dose, yield, and time to log a shot.
Flow or pressure note Text Any text e.g., 2 s preinfuse, gentle ramp, held 8.5 bar
Taste note Text Any text e.g., sweet, light acidity, slightly hollow finish

The planner also checks that plan values are positive before showing the plan summary, and that log dose, yield, and time are greater than zero before recording a shot.

Outputs and formats

Exports supported by the espresso shot planner
Output What it includes Format Notes
Shot plan table Dose, target yield and ratio, time window, flow range, pressure plan, profile note, temperature CSV, DOCX CSV headers are Field, Target, Notes.
Shot log table Timestamp, dose, yield, time, actual ratio, notes, taste, adjustment suggestions CSV, DOCX Rows are newest first and include a running sequence number.
Trend chart Scatter of ratio versus time with a shaded target band PNG, WebP, JPEG, CSV CSV columns include time, ratio, flow, deltas, and the suggestion text.
Combined state Plan values plus the full log entries, including raw numeric fields JSON Copy and download remove any syntax highlighting markup.

Time, storage, and network behavior

  • Timestamps are generated in local time using the current device locale, down to minutes.
  • Log entries live in memory and are cleared when the page is refreshed.
  • No network requests are made by the provided script, and exports are generated locally.
  • The chart view depends on the charting layer being available in the page environment.

Performance and determinism

  • Planning calculations are constant time, and chart rendering scales linearly with the number of logged shots.
  • Given identical inputs, the plan values and adjustment suggestions are deterministic.
  • An optional audit flag can auto-populate three sample shots to exercise the trend chart.

Assumptions and limitations

  • The brew ratio uses beverage weight, not volume, and assumes you can weigh the cup accurately.
  • Shot time assumes a consistent start point, defined as pump on in the UI text.
  • Average flow is computed over the whole shot, even if the real flow curve changes during extraction.
  • Flow range is derived from the planned yield and time window, not from measured pump flow.
  • Finish flow and pressure fields are advisory reminders and are not used in tolerance checks.
  • Pressure numbers are targets and may not match what a specific machine reports at the puck.
  • Water temperature is treated as puck temperature, which can differ from boiler or group readouts.
  • Adjustment suggestions are heuristic and do not incorporate taste notes into the logic.
  • Heads-up Changing dose, yield, and time together can hide the real cause of a flavor change.
  • Very small time windows make the flow range narrow and can over-trigger suggestions.

Edge cases and error sources

  • Non-numeric inputs are treated as zero for calculations, which can hide a typing mistake until values are corrected.
  • Entering extremely small times can produce very large flow rates and skew the trend chart scale.
  • Floating point rounding can cause tiny oscillations when ratio and yield auto-sync back and forth.
  • Locale formatting can change decimal separators and the way timestamps appear in exports.
  • Copy actions may fail if the clipboard permission is blocked, especially in restrictive contexts.
  • Notes containing commas, quotes, or newlines may require CSV escaping depending on the host CSV writer.
  • Emoji and combining marks in notes can display differently across platforms and fonts.
  • Very long notes can wrap aggressively in tables and reduce readability when copied as a single row.
  • Shutting the page or refreshing clears the in-memory log unless you have exported it.
  • Chart downloads depend on image encoding support for the chosen format in the page environment.
  • Minute-level timestamps can collide if you record multiple shots very quickly, so rely on the sequence number for ordering.

Security considerations

  • Notes are treated as plain text, but copied CSV can be opened by spreadsheet apps, so avoid leading = if sharing widely.
  • Clipboard actions rely on the surrounding page permissions and may be blocked in restricted environments.
  • JSON copying strips any markup used for syntax highlighting before placing text on the clipboard.

Scientific and practical references

To validate your targets, cross-check them against your espresso machine manufacturer guidance, your coffee roaster brew recipes, and your own logged tasting notes. Consistency across these sources is often more useful than chasing a single perfect number.

Privacy and compliance

Shot data and notes can be personal preference data; avoid entering sensitive personal information. The provided code performs calculations locally and does not transmit your entries to a server.

Step-by-Step Guide:

Plan an espresso recipe by setting targets you can measure, then log real pulls to see how close you land and what to change next.

  1. Pick a Style preset that matches your goal, or start from a balanced profile.
  2. Set your Dose and keep it steady for a few shots.
  3. Choose a Target ratio or adjust target yield and let the planner sync the other value.
  4. Set a Shot time target, then widen or tighten Time flex based on how consistent your setup is.
  5. If you use pressure profiling, add preinfusion, peak, and finish targets as reminders.
  6. Pull a shot and log the actual dose, yield, and time, then add a short taste note.
  7. Read the suggested adjustment, change one variable, and log the next shot for comparison.

Quick example

Set 18 g dose, target ratio 1:2.00, and a 29 s target time with 3 s flex. Pull a 36 g shot in 27 s, log it, then follow the suggestion and repeat.

When your points cluster inside the shaded band on the trend chart, your process is getting more repeatable.

  • If the shot tastes harsh, try lowering the finish pressure before changing ratio.
  • If shots vary a lot day to day, increase time flex temporarily and tighten it as consistency improves.
  • Write notes in a consistent format so copying rows stays readable.

Pro tip: Stop the shot by weight, not by time, and use the time and flow readings as feedback instead of a hard stop.

FAQ:

Is my data stored?

In the provided code, plan settings and log entries live in memory while the page is open, and exports are created when you copy or download. Refreshing clears the log.

How accurate are the numbers?

The calculations are simple ratios and divisions, so accuracy mainly depends on your scale, timing consistency, and whether you measure from pump on to final weight. Expect small variation shot to shot.

Taste can change even when the numbers match due to puck prep and grinder drift.
What units are supported?

Dose and yield are in grams, time is in seconds, and pressure targets are in bar. Water temperature can be entered as Celsius or Fahrenheit and is displayed in both.

Can I use it offline?

Planning and logging work once the page assets are loaded. If the charting component is available in your environment, the trend view and chart downloads work without additional requests.

If the chart view is blank, try reloading with a network connection so required assets can load.
Is there a cost or license?

This package contains no account system, payments, or licensing text. If you need usage rights or attribution requirements, follow the host site guidance.

Dial in a turbo shot?

Pick the Turbo preset, pull a few shots without changing dose, and log each result. If shots land outside the ratio tolerance or time window, apply one small change and re-log to see if points move toward the shaded band.

What does borderline mean?

Borderline means the logged shot landed close to your tolerance edges for ratio or time. Small measurement noise or puck variation can flip the suggestion, so repeat the shot and confirm with taste before making a big change.

Troubleshooting:

  • The plan summary does not appear. Check that dose, target ratio, target yield, and target time are all greater than zero.
  • I cannot record a shot. Enter a positive dose, yield, and time for the log entry, then try again.
  • Yield changes when I edit ratio. Ratio and yield are linked when a dose is set, so editing one updates the other.
  • The trend chart is blank. Record at least one shot, open the trend view, and make sure the charting component is loaded.
  • Copy buttons do nothing. Clipboard access may be blocked, so use download instead.
  • My CSV looks messy. Keep notes short and avoid line breaks if you want each row to stay one line.

Blocking issue: If the trend chart stays empty even with logged shots, reload the page with a network connection so required chart assets can load, then try again.

Advanced Tips:

  • Tip Keep dose fixed and adjust grind or yield first for clearer learning.
  • Tip Use time flex to match your setup, then tighten it as you get consistent.
  • Tip Treat average flow as feedback, and use finish flow targets as a reminder for the last third.
  • Tip If you change coffee, reset expectations and log a new baseline before chasing old numbers.
  • Tip When a shot is both fast and high ratio, fix flow first, then re-check ratio.
  • Tip Export the log after a session so you can compare beans and grinder settings over time.

Glossary:

Dose
Dry coffee mass loaded into the basket.
Yield
Beverage mass collected in the cup.
Brew ratio
Yield divided by dose, shown as one to N.
Shot time
Seconds from pump on to final weight.
Time flex
Half width of the acceptable time window.
Ratio tolerance
Acceptable deviation around the target ratio.
Average flow
Yield divided by time, in grams per second.
Preinfusion
A gentle soak phase before peak pressure.