To build a crypto portfolio tracker in Google Sheets, make a copy of the free template below, type your coins, quantities and average costs, and let =COINTABLE(B2) fill in the current price. Value, P&L, 24h change and allocation calculate from there, and a second tab tracks dollar-cost averaging with your running average cost. The prices come through CoinTable, a Google Sheets add-on for crypto prices that needs no API key to paste and no signup.
If you only need a price in a cell and not a whole tracker, start with how to get crypto prices in Google Sheets, which compares every method, free ones included. This post is for the next step: a spreadsheet that tells you whether you're up.
Get the free template
Make a copy of the Crypto Portfolio Tracker template
Google asks "Copy document?" and puts the copy in your own Drive. It's yours from that point: private, editable, and nobody else sees what you type into it. Until CoinTable is installed, the price columns show an unknown-function error. Installing takes about 30 seconds.
The template has two tabs:
| Tab | What it answers | CoinTable formulas used |
|---|---|---|
| Portfolio | What is everything worth, am I up, and how is it split? | COINTABLE with price and "changepct" |
| DCA | What's my average cost after a year of monthly buys? | COINTABLE (one cell) |
Delete the sample rows, add your own, done. If you'd rather know what every cell does, the next two sections describe the template column by column, and the build guide after that recreates it from a blank sheet.
The Portfolio tab, column by column
Row 1 holds headers. One coin per row from row 2 down. The template ships with five sample holdings (BTC, ETH, SOL, LINK, ADA) so you can see it working before you type anything.
| Col | Header | Type | Format |
|---|---|---|---|
| A | Coin | You type it: Bitcoin | Plain text |
| B | Ticker | You type it: BTC | Plain text |
| C | Quantity | You type it: 0.25 | Number, up to 8 decimals |
| D | Avg cost | You type it: 62000 | Currency |
| E | Price | Formula | Currency |
| F | Value | Formula | Currency |
| G | P&L | Formula | Currency |
| H | P&L % | Formula | Percent |
| I | 24h change | Formula | Custom 0.00"%" |
| J | Allocation % | Formula | Percent |
The formulas for row 2. Fill them down for every row that has a ticker:
E2 Price =COINTABLE(B2)
F2 Value =C2*E2
G2 P&L =F2-C2*D2
H2 P&L % =IF(C2*D2=0,"",G2/(C2*D2))
I2 24h change =COINTABLE(B2, "changepct")
J2 Allocation % =F2/SUM(F$2:F$51)

A few of those deserve a sentence.
Value multiplies by the Price column instead of calling COINTABLE again. One price per coin keeps the sheet easy to read and fix.
P&L % divides by your cost basis, quantity times average cost. The IF guard is there for airdrops and staking rewards you got for free: a cost of zero would otherwise show #DIV/0!.
24h change looks wrong if you format it as Percent. "changepct" returns a plain number where 2.4 means +2.4%, so Percent format shows 240%. The custom format 0.00"%" adds the sign without multiplying. The COINTABLE page also covers 1-hour, 7-day, 30-day and 1-year periods, if 24 hours is too twitchy for you; periods other than 24h may need Plus.
Allocation % uses F$2:F$51, so it works for up to 50 coins. The dollar signs lock the range when you fill down. More than 50 coins? Change 51 to something bigger, in every row.
To the right, cells L1:M4 hold a summary:
L1 Total value M1 =SUM(F2:F51)
L2 Total cost M2 =SUMPRODUCT(C2:C51,D2:D51)
L3 Total P&L M3 =M1-M2
L4 P&L % M4 =IF(M2=0,"",M3/M2)
Here's one row worked through. Say you bought 0.25 BTC at an average of $62,000, so your cost basis is $15,500. If COINTABLE returns 100,000 (example value, October 2026), Value is $25,000, P&L is $9,500 and P&L % is 61.3%. Same math on every row, and the summary adds them up.
The template prices everything in US dollars. If you think in euros, use =COINTABLE(B2&"/EUR") and =COINTABLE(B2&"/EUR", "changepct") and enter your average cost in euros too. Mixing a dollar cost with a euro price gives you a P&L that's off by the exchange rate, and it won't look obviously wrong. CoinTable takes 63 currencies, BTC and ETH among them, in case you'd rather measure everything in bitcoin.
The DCA tab: dollar-cost averaging in Google Sheets
Dollar-cost averaging means buying a fixed amount on a schedule, say $200 of BTC on the 1st of every month, whatever the price. The question it raises is always the same: what did I actually pay per coin? An exchange app will tell you, sort of, if you only ever bought on that one exchange. The DCA tab tells you exactly.
One coin per DCA tab. Duplicate the tab (right-click the tab name, then Duplicate) for each coin you stack.
| Col | Header | Type |
|---|---|---|
| A | Date | You type it |
| B | Amount spent | You type it, fees included |
| C | Price paid | You type it, from your exchange receipt |
| D | Coins bought | Formula |
| E | Running coins | Formula |
| F | Running cost | Formula |
| G | Avg cost | Formula |
Row 2 formulas, filled down to row 500 so a new purchase calculates as soon as you type it:
D2 Coins bought =IF(C2="","",B2/C2)
E2 Running coins =IF(D2="","",SUM(D$2:D2))
F2 Running cost =IF(D2="","",SUM(B$2:B2))
G2 Avg cost =IF(D2="","",F2/E2)
And a summary block in I1:J8. You type the ticker in J1; everything else is a formula:
I1 Ticker J1 BTC
I2 Current price J2 =COINTABLE(J1)
I3 Coins held J3 =SUM(D2:D500)
I4 Total spent J4 =SUM(B2:B500)
I5 Avg cost J5 =IF(J3=0,"",J4/J3)
I6 Value now J6 =J2*J3
I7 P&L J7 =J6-J4
I8 P&L % J8 =IF(J4=0,"",J7/J4)
Here's what three monthly buys look like (example purchases, not real quotes):
| Date | Spent | Price paid | Coins bought | Running coins | Running cost | Avg cost |
|---|---|---|---|---|---|---|
| 2026-08-01 | $200 | $100,000 | 0.0020 | 0.0020 | $200 | $100,000 |
| 2026-09-01 | $200 | $80,000 | 0.0025 | 0.0045 | $400 | $88,889 |
| 2026-10-01 | $200 | $125,000 | 0.0016 | 0.0061 | $600 | $98,361 |

The average of the three prices is $101,667, but your average cost is $98,361. That gap is the whole point of DCA: the same $200 bought more coins in the cheap month. The tab makes it visible instead of something you take on faith.
Two pieces of friction. First, Coins bought assumes the fee came out of the amount you spent. If your exchange took its fee in coins instead, type the coins you actually received over the formula in column D; the running totals pick it up either way. Second, the tab is buy-only. Selling part of a stack changes your average cost in ways that depend on the accounting method, so keep sells out of this tab and in your exchange records.
Want the Portfolio tab to follow your DCA stack automatically? On BTC's Portfolio row, set Quantity to =DCA!J3 and Avg cost to =DCA!J5. Swap DCA for whatever you named the tab.
Build it yourself from a blank sheet
Some people don't copy templates from strangers. Fair. Here's the same tracker from scratch, in about 10 minutes.
- Install CoinTable. Open the CoinTable listing on Google Workspace Marketplace, click Install and pick your Google account. About 30 seconds, assuming the permissions window doesn't open behind your browser (it sometimes does).
- Create a new sheet and rename the first tab to
Portfolio. - Type the headers in A1:J1: Coin, Ticker, Quantity, Avg cost, Price, Value, P&L, P&L %, 24h change, Allocation %.
- Enter your holdings in columns A to D, one coin per row. Use the ticker your exchange shows: BTC, ETH, SOL. CoinTable covers 10,000+ coins. When two coins share a ticker it picks the larger one, so sanity-check the price of anything obscure.
- Add the price formulas. In E2 type
=COINTABLE(B2)and in I2=COINTABLE(B2, "changepct"). A refresh updates every CoinTable formula, including ones wrapped inIFERRORor multiplied, like=C2*COINTABLE(B2). - Add the math columns F2, G2, H2 and J2 from the Portfolio formulas above.
- Fill down. Select E2:J2 and drag the small square at the corner down to your last coin. Only fill rows that have a ticker.
- Add the summary in L1:M4.
- Format the columns. Currency for D through G, Percent for H and J. For column I, go to Format → Number → Custom number format and enter
0.00"%". - Color the gains. Select G2:G51 and I2:I51, then Format → Conditional formatting: one rule "Greater than 0" with green text, one "Less than 0" with red. Google's conditional formatting help covers the other rule types.
- Add the DCA tab with the
+at the bottom left, name itDCA, and copy in the headers and formulas from the DCA section. - Freeze row 1 on both tabs (View → Freeze → 1 row) so headers stay put while you scroll.
Every COINTABLE attribute, with arguments and edge cases, is in the COINTABLE reference.
Refreshing prices, and what it costs
You can update prices any time with Refresh data from the CoinTable menu under Extensions. On Plus, CoinTable also refreshes them when you open the spreadsheet (at most once every 5 minutes, up to 200 cells).
An update is one coin in one currency. Every field of that coin in that currency counts once, and the same coin again within 6 hours is free. The template's five sample coins with price and 24h change come to 5 updates per refresh, and the DCA tab's BTC price rides along with the BTC row. A 10-coin portfolio uses 10.
The Free plan gives you 300 updates a month, reset on the 1st (UTC). That covers one refresh a day of a 10-coin tracker for a month, and a second refresh within 6 hours is free. Fine for a morning check. Tight if you check it morning and night. Plus has unlimited updates for normal use, and the limits page spells out what counts. Errors use no updates.
Tracking stocks and crypto in the same sheet
Easy, and you don't need a second add-on. Use Google's built-in GOOGLEFINANCE for stocks and ETFs and COINTABLE for crypto, in the same Price column:
E2 =COINTABLE(B2) (BTC row)
E7 =GOOGLEFINANCE("NASDAQ:AAPL") (Apple row)
E8 =GOOGLEFINANCE("NYSEARCA:VOO") (S&P 500 ETF row)
Keep the stock rows on GOOGLEFINANCE. COINTABLE reads every ticker as a coin, and some stock and index tickers are also coins: TSLA, META, SPX and GOLD.
Everything to the right (Value, P&L, Allocation) works the same, because it only reads column E. Google says its quotes may be delayed up to 20 minutes, which is fine for a portfolio sheet.
Why not use GOOGLEFINANCE for the crypto rows too? We tested it on October 15, 2026: =GOOGLEFINANCE("CURRENCY:<ticker>USD") returned a price for 17 of the top 30 coins and #N/A for the other 13, including DOGE, LINK, AVAX and USDT. The full results are in why GOOGLEFINANCE crypto formulas fail. If your old tracker was built on the retired CRYPTOFINANCE add-on, the CRYPTOFINANCE to CoinTable migration guide maps each formula.
Exporting your sheet for a tax tool
Most crypto tax tools import a CSV transaction log. To get one out of the template, open the DCA tab and choose File → Download → Comma-separated values (.csv). Google downloads only the tab you're on, so repeat it per tab (Google's download help).
Three things to know before you upload it anywhere:
- The tax tool wants transactions (date, asset, amount, price, fee), and that's close to what the DCA tab holds. The Portfolio tab is a snapshot of today and is mostly useless to it.
- Price paid has to come from your exchange receipts. On Plus,
=COINTABLE(J1, "price", A2)shows the closing price on the date in A2, within the last year, which is close to what you paid but not the same. - Your exchange's own CSV export is usually the more complete record, sells included. Use the sheet to check it, not to replace it.
What you owe, and which cost-basis method applies to you, is a question for your tax software or an accountant. The sheet doesn't apply any method. It adds and divides.
Tweaks worth adding
A watchlist tab. For coins you're watching but don't own, put a ticker in column A and these across the row: =COINTABLE(A2, "marketcap"), =COINTABLE(A2, "volume"), =COINTABLE(A2, "rank"), =COINTABLE(A2, "ath") and =COINTABLE(A2, "athchangepct"), the last showing how far the coin sits below its all-time high. All five columns of a coin share one update, so add the ones you'd actually look at.
A second currency. Add a column next to Price with =COINTABLE(B2&"/EUR") if you report in euros but think in dollars. Each coin in euros is one more update.
A value log. Make a tab called Log. Once a week, copy M1 (total value) and Paste special → Values only into a new row next to the date. After a few months you can chart it. Sheets won't keep past values for you.
Staking. Put rewards in a Staked column (K) and change Value to =(C2+K2)*E2. P&L still subtracts only C2*D2, so rewards count at zero cost, which is what you paid for them.
Lump sum vs DCA. On the DCA tab, =IF(J4=0,"",J4/C2*J2) shows what your total spend would be worth had you bought everything on day one at row 2's price. In a market that only went up, lump sum wins. Most markets don't only go up.
Spreadsheet or portfolio app?
| Google Sheets + CoinTable | Typical portfolio app | |
|---|---|---|
| Setup | Copy the template, type holdings | Connect exchanges or type holdings |
| Where your holdings live | Your Google Drive | The app's servers |
| What leaves your sheet | Each formula's ticker, currency, field and period or date | Your full holdings |
| Custom columns and math | Anything Sheets can do | Whatever the app offers |
| Price updates | Use updates: 300 a month on Free, unlimited on Plus for normal use | Automatic |
| On a phone | Google Sheets app, clunky | Built for it |
The honest answer: an app looks nicer on a phone and syncs exchanges for you. A spreadsheet wins when you want your own math, your own columns, and holdings that stay in your Google account. If you've read this far, you probably already know which camp you're in.
Frequently asked questions
Is the template free?
Yes. Making a copy of the template costs nothing and the copy lives in your own Google Drive. The price cells use CoinTable, a Google Sheets add-on whose Free plan includes 300 updates a month (reset on the 1st, UTC) with no signup, no API key to paste and no credit card. A 10-coin tracker uses 10 updates per refresh, however many fields it shows, so Free covers one refresh a day for a month.
Can I track stocks and crypto in the same sheet?
Yes. Use Google's built-in GOOGLEFINANCE for stocks and ETFs, for example =GOOGLEFINANCE("NASDAQ:AAPL"), and =COINTABLE("BTC") for crypto, in the same Price column. Value, P&L and allocation formulas work the same for both. GOOGLEFINANCE is weak for crypto: tested on October 15, 2026, it returned #N/A for 13 of the top 30 coins, including DOGE, LINK and AVAX.
How do I calculate average buy price?
Divide the total amount you spent by the total coins you bought: =SUM(B2:B500)/SUM(D2:D500), where column B holds the amount spent per purchase (fees included) and column D the coins bought. Three $200 buys at $100,000, $80,000 and $125,000 give an average cost of about $98,361, below the $101,667 average of the three prices, because the cheap month bought more coins.
Can I export it for taxes?
You can download any tab as a CSV with File > Download > Comma-separated values (.csv); Google exports only the tab you're on. Crypto tax tools usually import transaction logs (date, asset, amount, price, fee), which is close to the DCA tab's layout. The price you paid has to come from your exchange records; CoinTable's price on a past date (Plus) is the day's closing price, not your fill. The sheet doesn't apply any cost-basis method; what you owe is a question for your tax software or an accountant.
Do I need an API key to use the tracker?
No. CoinTable needs no API key to paste and no signup; the add-on creates an anonymous account by itself when you first use it. Install it from Google Workspace Marketplace and =COINTABLE(B2) returns the current price of the ticker in B2.
Can the tracker show prices in euros or another currency?
Yes. Write the currency after a slash, for example =COINTABLE(B2&"/EUR") and =COINTABLE(B2&"/EUR", "changepct"). CoinTable supports 63 currencies, including BTC and ETH. Enter your average cost in the same currency, or your P&L will be off by the exchange rate.