# Crypto treasury dashboard your finance team opens daily

> See what your crypto treasury is actually worth every morning, with live prices, gains and losses, allocation drift, and a one-click Slack snapshot.

- Workflow type: app
- Services: CoinGecko, Google Sheets, Slack Bot
- Categories: Finance, Operations
- Published: 2026-08-16

## What it does

- Reads your holdings straight from the Google Sheet your team already maintains, then prices every position live so the numbers are current the moment you open it.
- Shows current value, gain or loss against what you paid, 24 hour and 7 day movement, and each position's share of the total treasury.
- Keeps stablecoins in their own group, since those are operating runway rather than upside, and flags any asset that has drifted more than 5 points from its target allocation.
- Charts total treasury value over the last 90 days, lets you edit quantities inline and save them back to the sheet, and posts a formatted snapshot to your finance channel in one click.

## What you'll need

- A Google Sheet with a tab listing your holdings: coin, quantity, purchase date, cost basis, and target allocation percent
- A CoinGecko account, where the free plan is enough for a treasury of this size
- A Slack workspace and the channel where your finance team wants snapshots posted
- Edit access to the sheet, so quantity changes you make in the app can be saved back

## Prompt

Build me an app my finance team opens every morning to see what our crypto treasury is actually worth. Our holdings live in a Google Sheets tab, and that sheet stays the source of truth: the app should read from it on load and write edits back to it, never keep its own separate copy of the holdings.

Holdings sheet. Read the holdings tab with the Google Sheets Get Values operation. Each row is one position with these columns: coin (a CoinGecko coin id such as bitcoin or ethereum, or a ticker I can map to one), quantity, purchase date, cost basis, and target allocation percent. Let me configure the spreadsheet id and the tab range once in a settings area and remember it, so I am not pasting it in every visit. Handle a sheet where some rows are blank or partially filled without breaking the whole page.

Positions view (the main screen). Price every position live. Use the CoinGecko Coins Markets operation with all of my coin ids in a single request, since that returns current price plus 24 hour and 7 day price change percentages in one call and keeps us inside the free plan rate limit. Use Simple Price as the lightweight fallback when I only need a refreshed price and nothing else. For each position show: current value (quantity times current price), unrealized gain or loss against cost basis in both absolute and percentage terms, 24 hour movement, 7 day movement, and that position's share of the total treasury as a percent. Color gains and losses so the table is scannable, and show the treasury total prominently at the top with its own 24 hour change.

Group stablecoins separately from volatile assets. Stablecoins are runway, not upside, so they belong in their own section with their own subtotal, and the volatile assets get a separate subtotal above the combined treasury total. Ship with a sensible default list of stablecoins (USDT, USDC, DAI and similar) and let me edit which coins are treated as stable, so a newer stablecoin can be reclassified without a code change.

Inline editing. Let me edit a position's quantity directly in the table. On save, write the new value back to the correct cell in the sheet using the Google Sheets Update Values operation, then recalculate the totals and allocation shares. Show a clear saving and saved state, and if the write fails, say so plainly and keep my typed value on screen rather than silently reverting it.

Performance view (second screen). Chart total treasury value over the last 90 days. Call the CoinGecko Market Chart operation for each holding, multiply each coin's daily price series by the quantity we hold, and sum across holdings into one total treasury line. Let me optionally break the chart out by asset, and separate the stablecoin portion from the volatile portion so I can see whether real value moved or just the mix. Fetch these serially or in small batches rather than all at once so we do not trip the CoinGecko rate limit, and show a loading state while it builds.

Allocation drift. On the performance view, compare each asset's current share of the treasury against its target allocation percent from the sheet, and flag anything that has drifted more than 5 points away from target in either direction. Show the target, the actual, and the gap in points, and state the direction plainly (overweight or underweight). Make the 5 point threshold a setting I can change.

Cost basis backfill. When a row has a purchase date but no cost basis figure, use the CoinGecko Coin History operation for that coin on that date to fetch the historical price, multiply by quantity, and use that as the cost basis. Mark those values in the UI as estimated from the purchase date so nobody mistakes them for a recorded cost, and offer to write the estimate back to the sheet with Update Values rather than doing it automatically.

Currency switch. Let me flip the whole app between USD and EUR with one control. This should change the currency the prices are requested in (CoinGecko takes a target currency parameter on Coins Markets, Simple Price, Market Chart and Coin History) rather than converting after the fact, and it should apply to the positions table, the totals, the 90 day chart, and the shared snapshot. Remember my choice between visits.

Share snapshot. Add a Share snapshot button that posts a formatted summary into our finance channel using the Slack Bot Send a Message operation. The message should lead with total treasury value and its 24 hour change, then list the volatile positions with value and gain or loss, then the stablecoin subtotal framed as runway, then call out any assets breaching the drift threshold. Format it for Slack readability with clear sections rather than dumping a wide table, and let me pick the destination channel and preview the message before it sends.

General notes. This is a read-heavy dashboard that people open daily, so make the first paint fast and let prices refresh on demand with a visible last updated timestamp. Be resilient when a coin id in the sheet does not resolve: show that row with a clear unrecognized coin warning and keep the rest of the treasury calculating correctly.

## How to customize

- Change the drift threshold from 5 points to whatever your treasury policy actually uses
- Switch the performance chart from 90 days to 30 days, 6 months, or a full year
- Adjust which coins are treated as stablecoins, so a newer stable gets grouped as runway instead of upside
- Set the default display currency and choose which channel the shared snapshot lands in

## FAQ

### Do I have to move our holdings out of the spreadsheet?

No. The sheet stays the source of truth. The app reads your holdings from it every time it loads, and when you edit a quantity in the app it writes that change straight back to the same row. Anyone who prefers working in the spreadsheet can keep doing that.

### Does this work on the free CoinGecko plan?

Yes. The free plan covers live prices, 24 hour and 7 day movement, and 90 days of history. The app looks up all your coins together in a single request rather than one at a time, which keeps it comfortably inside the free plan's limits for a normal treasury.

### Can we see everything in euros instead of dollars?

Yes. There is a currency switch at the top of the dashboard, and it changes every number on the page, including the historical chart and the snapshot posted to Slack. Prices are pulled fresh in the currency you pick rather than converted after the fact.

### What exactly counts as allocation drift?

Drift is the gap in percentage points between what an asset is supposed to be and what it actually is. If a coin has a target of 40 percent of the treasury and it is now sitting at 46 percent, that is 6 points of drift and it gets flagged. The default threshold is 5 points and you can change it.

### Why are stablecoins shown separately?

Because they answer a different question. Stablecoins are operating runway, so what matters is how many months of expenses they cover, while volatile assets are the part of the treasury that can gain or lose value. Mixing them into one total hides both answers, so the dashboard totals them apart and then together.

Use this prompt in General Input: https://www.generalinput.com/prompts/crypto-treasury-dashboard-your-finance-team-opens-daily