Spreadsheets in Space

Been playing EVE Online since a bit more than a decade and it has been an on-off-relationship. Since over a month we are in the on status 🙂

I always wondered why it is called „spreadsheets in space“, but having taken a serious dip into T2 invention and manufacturing, I understand now. So I did the obvious thing and built a spreadsheet and want to share it here.

T2 invention & manufacturing is only fun if you do the math. Skip it and you’re clicking the same buttons in the same order and calling it a hobby. Sure, if you don´t care about margins and or profitable items, then go ahead and do without, but for me, who works in procurement this is almost a thing of honor. I’ve had some version of this sheet for years; back then I typed every price in by hand before every build, which is exactly as tedious as it sounds. So I rebuilt it a month ago. At its core it stays simple: a macro pulls live market prices and structures them, and you see at a glance what a batch costs to build versus what it sells for. That’s the whole basic layer of the sheet — and in the FAQ below I explain every shortcut and approximation labelled, because I’d rather hand you a number with its caveats than a confident lie.

On top of that sits a second, optional layer: deeper market reading and a running ledger of the operation. The macro doesn’t do any of that thinking itself — it only fetches and structures; the actual analysis happens separately, by handing the thing to an AI. You give it today’s snapshot and ask what’s worth building and how the market behaves today. Which is the half the reason I’m posting this: it’s that I can’t really code, and I built the whole sheet anyway, as a collaboration between me and Claude. If you’re a curious-but-coding-incapable nerd like me, treat it as a small live demonstration of what that collaboration buys you.

One honest heads-up: it’s built for LibreOffice, where the macro runs. I only ever use Libre myself, so it came as a surprise — when I sat down to put this online — that Excel users need a workaround to pull even the basic costs, and that the analysis layer won’t run there at all (Python macros and Excel simply don’t get along). The workaround’s in the FAQ or you may ask an AI how to get it done another way.

It’s free; take it and do what you like with it — still a work in progress, like everything worth doing. The full how-it-works, the install, and how to reach me are in the FAQ below: take a peek before you download and decide if it’s for you.

FAQ / Readme — how the sheet works (click to expand)

TL;DR — a cost/sell-price sheet for EVE T2 manufacturing, fed live market data via ESI, with optional AI-supported market analysis. Needs LibreOffice for full service, Excel allows only basic but okayish functionality.


1. What is this?

A T2 manufacturing cost-and-margin sheet for EVE Online. It pulls live market prices from the Dodixie hub (IX – Moon 20) through a macro and tells you, per item, what a batch costs to build versus what it sells for — and whether each vertical component is cheaper to make or to buy, recomputed every time prices update. The extra price columns (VWAP, z-score, Jita and so on) aren’t needed for costing — they’re there for deeper reading of the market, by you or by an AI assistant (section 5).

2. Install & first run

LibreOffice (the sheet was built here):

  1. Drop the macro file into your LibreOffice Python scripts folder, creating it if it doesn’t exist:
    • Windows: %APPDATA%\LibreOffice\4\user\Scripts\python\
    • macOS: ~/Library/Application Support/LibreOffice/4/user/Scripts/python/
    • Linux: ~/.config/libreoffice/4/user/Scripts/python/
  2. In the macro file please add your in-game Name or mail address so that ESI knows who is knocking. (Friendly move, recommended.) Check the file for details.
  3. Restart LibreOffice and allow macros if prompted (Tools → Options → Security → Macro Security).
  4. Open the sheet, then Tools → Macros → Run Macro, and run RefreshPrices. It fetches Dodixie, Sinq Laison and Jita prices into their columns in the Prices tab.

The macro decides what it pulls (which region, which station). To pull from somewhere else you edit the macro — it can’t be changed from inside the sheet. Check inside the macro for Details or use an AI.

Excel users: the sheet opens, the macro does not — see the Appendix at the end for a minimal working setup.

3. How it works (the basics)

Each item has its own sheet listing the materials and amounts for one batch. The macro pulls live prices from ESI and transfers them into the sheet and the manufacturing cost and sell price can directly be seen.

A few conventions/explanations:

  • Which Price is used for calculation? I decided to use the average of the lowest 3 Sell Orders at Dodixie IX-20 with the following reasons: Dodi because I exclusively buy and sell my stuff there and for an Analysis sheet it does not make sense to have prices pulled from whole Sinq because seller can sit somewhere and I don’t want to travel to grab s**t from all over the place. So Dodi Sell Orders only for me. Why the lowest three? Because it happens that the lowest Sell Order is only few pieces someone just wants to get rid of and this skews my buy prices. So I decided to grab the lowest three to heighten the chance to get the amounts I need. This is a conservative choice working in my favor. As mentioned, you may change these settings by editing the macro.
  • Amounts are at ME2 (material efficiency level 2) and per batch, where batch size depends on type: 1 for ships, 10 for modules and drones, 50,000 for ammo. (The 50,000 isn’t a typo: one invention yields a 10-run T2 BPC, and each ammo run makes 5,000 charges — 10 × 5,000.) The Sell figure uses the same batch size, so cost and revenue are always like-for-like.
  • Invention chance is entered by hand — read it off the in-game invention screen for that item and type it into the invention cell.
  • Job cost is fixed at 7% of materials. That’s deliberately too high and my thinking is as follows: what I save in manufacturing Job costs, which is more or less EIV x (System Cost Index + Facility Tax + Surcharge), I spend on broker fees and sales tax. Pro tip: always manufacture in a system with a low manufacturing index (Industry window → Facilities → sort by system cost index). This system tax changes daily and is the single most important factor for Job costs. The inflated job cost and the missing fees roughly cancel each other and the margin you see lands about somewhere close to the truth. Calculating it exactly is beyond me and I live with this approximation. If you have any idea, let me know.
  • Heads-up on datacores: datacores are costed at 0.7× their market price, reflecting that I source them below the asking price — some free from R&D agents, the rest through patient buy orders. If you buy datacores at market, raise that factor toward 1. Since you have to do that in every item sheet, smoke some weed and take your time 🙂 or ask an AI to do it, they are good at this.

Make or buy — the vertical materials.
Some inputs aren’t raw market goods but components you can either manufacture yourself or buy off the shelf — Photon Microprocessors, Tungsten Carbide Armor Plates and the like. These live on the vertical materials tab, which holds their recipes (ME10) and works out what each costs to make; the Overview tab then compares that make-cost against the market buy-price and keeps whichever is cheaper, recomputed live as prices move.
That comparison is why an item sheet’s price cell takes an apparent detour. Rather than going straight to the Prices tab, each material is first looked up in the Overview’s make/buy block: if it’s a vertical component listed there, the cell takes the cheaper of make-or-buy; if it’s an ordinary bought material and isn’t found there, the lookup falls through to the Prices tab as normal. One formula, routing itself.
IMPORTANT — if you can’t make it, remove it from the Overview. The make-or-buy choice only makes sense for components you actually hold the blueprint for. If a vertical material sits in the Overview’s make/buy block but you can’t manufacture it, the sheet may cost your item using a „make“ price you can never realise. The fix is simple: delete that material’s row from the Overview block (you can leave it in the vertical materials tab). With it gone, the lookup falls through to the Prices tab and uses the buy price instead — which is correct, because buying is exactly what you’ll do.
If you want to add one such material put it in the vertical material tab the same way as the others and add it to the Overview the same way as the others.
One last remark/pro-tip: If you seriously want to produce ships, especially larger ones, you’ll have to go this route and also set some materials on Buy Orders to save material input costs. See section 5. on how to identify the relevant money savers.

4. How to add an item

  1. Copy a similar existing item sheet — same category if you can (ship, module, drone, ammo), so the formulas and layout come with it.
  2. Replace the input materials and datacores with the new item’s, and their amounts for one batch, read straight from the in-game Industry window. Use the exact in-game names — this is the single most common cause of breakage.
  3. Fix the Sell cell: replace the item name inside its VLOOKUP, and set the multiplier to the batch size (1 / 10 / 50,000).
  4. Add any new material or item names to column A of the Prices tab Again: use the exact in-game name. (Datacore – xx caused me the most headache.. Is it – (next to ShiftR) or – (Minus on the NumBlock)? )
  5. Run RefreshID to fetch their type-IDs into column B (you can also paste IDs in by hand).
  6. Run RefreshPrices Done — it should compute.

When it doesn’t, it’s almost always a name mismatch: a misspelled datacore, or a missing/extra „I“ or „II“ on a T1-vs-T2 item. Lookups match on exact text. But good news: If you are wrong the sheet doesn’t silently continue but instead the cost cell reads #N/A and you know something is wrong. (One caution from experience: when you copy a sheet, glance at any hard-coded references — like the Sell lookup — to be sure they point where you intend and didn’t quietly keep pointing back at the sheet you copied from.)

5. The advanced layer: analysis, tracking, and AI (will only work with LibreOffice because of Python incompatibility with Excel, see Appendix below)

Everything up to here is the whole tool: fetch live prices, see what a batch costs and whether it sells for more. What follows is an advanced layer bolted onto that simple core — optional, ignorable, and meant to be AI-driven.

Short excursion, because it’s half the point why I publish this: this complete layer, and much of the whole sheet (I set this sheet up some years ago editing everything by hand..), was built collaboratively with Claude, and it’s built to be used the same way — not pored over by you alone, but handed to a model that helps you read it. For me this is the part that matters most, even though it’s technically bolted onto a plain fetch-the-prices tool. So this whole thing here is also a small showcase, a small, live demonstration of what an AI collaborator can actually be used for and the possibilities that open up for interested but coding-incapable nerds like me 🙂 OK, let’s continue.

The tracking tabs. Two sheets — Pipeline & Stock and Production & Sale — are kept by hand. (You may fill this with live data from EVE API from your chars but I haven’t dabbled in this.) Nothing fetches or fills them; you update them yourself, and they exist purely for analysis: what’s in the build queue, what’s in the hangar, what’s gone to market and at what price. They turn the sheet from a pricing calculator into a running ledger of the operation — and, more to the point, into something an AI can read and reason about.

The analysis columns in the Prices tab. Costing needs only column C (the lowest sell). Everything to its right reads the market rather than pricing a build, and nothing downstream depends on it — ignore it freely. But there’s a lot to learn in there (not just about EVE market-PvP, but in general about market economics):

  • VWAP (volume-weighted average price) — the average price weighted by how much actually changed hands at each level, so a 10,000-unit sale counts for more than one lonely 5-unit order. It tells you where the market genuinely cleared, not where a single optimist parked an ask. The 7- and 30-day pair separates a one-day blip from a real shift: ask far above VWAP means you’re being overcharged today; below means a window to top up cheaply.
  • z-score — how many standard deviations today’s price sits from its 30-day mean. (It is about standard deviation — precisely, it’s the count of them.) Zero is dead average; +2 is „unusually high, two deviations up“; a fat positive z on an input is the classic thin-book spike you don’t chase, a negative z a dip worth buying.
  • CoV (coefficient of variation) — standard deviation as a fraction of the mean, I.e. volatility in percentage terms. It puts a 90-ISK mineral and a 90,000-ISK component on the same scale, so you can ask whether a thing is calm or jumpy by nature and know how far to trust any single reading.
  • standing sells, buy orders, volume — the depth of the book. They tell „expensive because scarce“ apart from „expensive because one seller is fishing,“ and reveal whether a famine is real: an empty shelf with healthy weekly volume is undersupply you can exploit, not a dead market.
  • Jita columns — half a sanity-check on local prices, half a „whale detector“: when Dodixie is bare of something and Jita is swimming in it, odds are a freighter-flying whale soon hauls a load over and refills the shelf — so maybe you wait a day instead of overpaying, or maybe you beat them to it. Speculative, occasionally right. Also, you may calculate if a day trip may make sense to grab some Dodi-famined or Dodi-high-priced or desperately needed materials from there. Also II: I was shortly thinking about setting up a side-trade-business when adding this and got it analyzed, but stuck to manufacturing. But the sheet sure has the potential to be also a tool for traders.

Working with an AI. Two further macros make the sheet easier and more token-efficient to use within a Claude Project (this is my go-to, but it may also work with a Gemini Gem or CustomGPT or Copilot Agent), because handing an AI the whole workbook every time you want an opinion burns tokens fast — worse if you’re comparing two days.

  • CreateRecipeFile — exports a stripped file: only the item sheets, only material names and amounts, no prices and no formulas, and nothing below the END marker in each sheet (that marker exists precisely so the macro knows where to stop). It’s the durable skeleton of the operation, minimised. You load it once as standing knowledge into a Claude Project, a Gemini Gem, or a Custom GPT, so the assistant always knows your recipes without being re-told.
  • CreateSnapshotFile — exports a four-tab file (Overview, Prices, Production & Sale, Pipeline & Stock): one day’s volatile state, the two hand-kept tracking tabs included. You drop it into a conversation for analysis, or two of them to compare one day against another.

The split is the whole point: the schema rarely changes and lives as standing knowledge; the daily state travels light. Together they let an assistant reason about your whole operation on a few thousand tokens instead of a few hundred thousand. Token efficiency was actually the whole point of these two macros.

6. Disclaimer

You may use, expand, delete, refine, print, paint pink this sheet and its macros as you wish, no strings attached. Only two things I’d be glad about: Add your ingame name or mail address into the Macro so that ESI knows who is knocking at their door and who they can refer to if the macro causes trouble – this is supposed to be the polite way of using the ESI. The other thing: if you found this sheet, you can find me — I’m Phil Thuclhu in-game. Say hello, ask a question, tell me what you built with it, or send expansion ideas. If you spot a column I’m missing, a sharper way to read these signals, or any way to extend the thing, I’d genuinely love to hear it.


Appendix — Excel: a minimal working setup

Important note: Since I don’t use Excel at home I have no idea how to get Macros or Queries running there and it seems you cannot just take the Python macro and turn on the lights. So you have to use a workaround. The following instruction is written by Claude and I don’t have much idea what it is talking about, but from my experience I can tell with a high confidence that what he/she/it proposes will work 🙂 So here you go:

You can get the sheet costing functionality in Excel without the macro, losing only the market-reading columns. The idea: have Power Query fill Prices column C in the Prices tab with the current lowest sell price for each item at your chosen station.

Finding the IDs:

  • Region and station IDs — look them up on Fuzzwork (fuzzwork.co.uk) or via ESI’s universe endpoints. Dodixie’s hub station is 60011866, in Sinq Laison (region 10000032); Jita is 60003760 in The Forge (region 10000002).
  • Item (type) IDs — the same Fuzzwork lookup, or bulk via ESI.

The query, per item type:

  1. Call the region market-orders endpoint:
    https://esi.evetech.net/latest/markets/{region_id}/orders/?type_id={type_id}&order_type=sell
  2. Filter the returned orders to your station (location_id = your station ID).
  3. Take the minimum price — that’s the item’s effective cost.
  4. Load those values into Prices column C. The rest of the sheet computes from there.

You’ll have a working cost/margin sheet — enough to judge make-or-buy and margins — just without VWAP, z-scores or the Jita comparison.

This is fiddly M-code (JSON expansion, a loop over type-IDs), which is exactly the sort of thing an AI assistant writes in a few minutes. Describe what you want — lowest sell per type at one station, into a column — and let it build the query. Which is, after all, the whole spirit of this project.

Overview: cost vs. sell across every T2 item, with the make-or-buy decision per component.
An item sheet: the full bill of materials for one hull.
The Prices tab: the live market data the macro pulls, and the analysis columns to its right.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert