Support & Help
Quick Start β Option A (easiest)
- Click Make a Copy β the Sheet and script wrapper come with it
- Refresh the sheet β the β‘ Balances menu appears
- Run β‘ Balances β Setup / Create Dashboard once
- Run β‘ Balances β Add chain sheet β give it a name like Ethereum, then paste an RPC URL when prompted
- Replace the sample rows in column B with your real wallet addresses
- Click β‘ Balances β Fetch this sheet
Quick Start β Option B (add to existing sheet)
- Open your Google Sheet β Extensions β Apps Script
- Left sidebar β Libraries + β paste Script ID:
1yM1l94RPOknc3QMz7l4eRnNRHRFR0vow0sIEmYBh22nZ_kUBbfreBee1 - Click Look up β set Identifier to exactly
WalletTrackerβ click Add - Replace everything in Code.gs with this block (use the Copy button β don't retype it):
function onOpen() { WalletTracker.registerMenu(); } function onInstall() { WalletTracker.registerMenu(); } function wt_fetchCurrentSheet() { WalletTracker.fetchCurrentSheetAllChains(); } function wt_fetchAllSheets() { WalletTracker.fetchAllSheetsAllChains(); } function wt_fetchOneChain() { WalletTracker.promptFetchOneChain(); } function wt_startAutoFetch() { WalletTracker.startAutoFetch(); } function wt_stopAutoFetch() { WalletTracker.stopAutoFetch(); } function wt_triggerFetch() { WalletTracker.triggerFetch(); } function wt_setupDashboard() { WalletTracker.setupDashboard(); } function wt_addWalletSheet() { WalletTracker.addWalletSheet(); } function wt_addTokenColumn() { WalletTracker.addTokenColumn(); } function wt_setFallbackRpc() { WalletTracker.setFallbackRpc(); } function wt_refreshPortfolio() { WalletTracker.refreshDashboardSummary(); } function wt_clearDecimalsCache() { WalletTracker.clearDecimalsCache(); } function wt_setDustThreshold() { WalletTracker.setDustThreshold(); } function wt_clearSheetBatch() { WalletTracker.clearSheetBatch(); } function wt_clearAllCache() { WalletTracker.clearAllCache(); } function wt_help() { WalletTracker.showHelp(); } - Press Ctrl+S β close the tab β refresh your sheet β β‘ Balances menu appears
WalletTracker exactly β wrong capitalisation causes a ReferenceError.
wt_triggerFetch is not in the menu but must exist in Code.gs β it is the background auto-fetch trigger target. Without it, auto-fetch installs but silently does nothing.
Sheet layout (v9)
- B2 β RPC URL for this chain (e.g.
https://eth.llamarpc.com) - Row 1 col C+ β column header: coin or token name (e.g.
ETH,USDC) - Row 2 col C β leave blank β fetches native coin balance
- Row 2 col D+ β paste a contract address β fetches ERC-20 token balance
- Col A row 3+ β Sr No, auto-filled after each fetch β leave it alone
- Col B row 3+ β wallet addresses (0xβ¦, exactly 42 characters)
- Cell A2 β optional minimum balance filter (see below)
To add a token column: β‘ Balances β Add ERC-20 token β enter the ticker and contract address. If the contract has an on-chain name that differs from what you typed, you'll be asked whether to use the contract's official name instead.
Duplicate & invalid addresses
The tracker checks column B every time you fetch:
- Duplicate addresses β if the same address appears more than once on a sheet, every copy is still fetched (so nothing goes unfetched), but you'll get a toast listing the row numbers. Duplicates are counted once per occurrence in your chain sheet totals and in Portfolio, so remove them if you want accurate totals.
- Invalid addresses β anything that starts with
0xbut isn't exactly 42 valid hex characters gets marked INVALID in amber and is skipped during fetch. Plain text that doesn't start with0x(like blank rows or notes) is ignored silently β it's never flagged.
Minimum balance filter (dust filter)
If you're tracking hundreds of wallets and only care about ones holding a meaningful balance, set a floor:
- Run β‘ Balances β Set min balance filter
- Enter a number β e.g.
0.01β or leave it blank to turn the filter off - Rows with a native balance below your threshold are dimmed (not deleted, not hidden) so they're easy to visually skip
The current setting is shown in cell A2 of the chain sheet. Clearing the filter un-dims everything immediately.
ERC-20 token tracking
- Go to the chain sheet where you want the token
- Run β‘ Balances β Add ERC-20 token
- Enter the token ticker (e.g.
USDC) - Paste the contract address for that token on that chain
- Run β‘ Balances β Fetch this sheet
Where to find contract addresses: Etherscan (search the token name β copy the Contract field) or CoinGecko (token page β Contract tab).
Portfolio summary
Run β‘ Balances β Refresh Portfolio to create a PORTFOLIO sheet with live totals across all your chain sheets and token columns. It also rebuilds automatically the moment a full fetch completes on any chain sheet β no manual refresh needed in normal use.
The Wallets column counts only addresses that exactly match the 42-character format the tracker actually fetches β it does not count malformed or placeholder text, so the number always reconciles with what's really being queried on-chain.
Balance change tracking
After each fetch, hover any balance cell to see a tooltip showing the change since the last run β for example β +1.234500 (prev: 0.000000).
Fallback RPC
Run β‘ Balances β Set fallback RPC and paste a second RPC URL. When more than half a batch returns errors from the primary RPC, failed wallets are automatically retried against the fallback.
Large wallet lists β batch mode
Google Apps Script has a 6-minute execution limit. The tracker handles this automatically by batching, with batch sizes tuned differently for native coin balances versus ERC-20 tokens (native balances can be checked in much larger batches per run than tokens):
- Cells that haven't been fetched yet show
βso you can see what's pending - Re-run Fetch this sheet to continue β it always picks up from where it stopped
- A single bad network response no longer discards an entire batch's worth of already-fetched results β only the wallets actually affected are retried
Auto-fetch (large lists)
- Set up your chain sheet with RPC URL and wallet addresses
- Run β‘ Balances β Start auto-fetch
- Google will ask for permission to run background triggers β click Allow
- The tracker fetches batches every minute in the background and stops itself automatically when done
- To stop early: β‘ Balances β Stop auto-fetch
Resetting a stuck sheet
If one sheet's batch progress looks stuck or wrong, you don't need to reset everything:
- β‘ Balances β Clear stuck batch β resets only the active sheet's saved batch position, without touching decimals cache, fallback RPC, or any other sheet
- β‘ Balances β Clear ALL cache β full reset across every sheet; use this only if the targeted reset above doesn't help
Getting updates
The library is versioned. How you receive updates depends on how you installed it.
If you used Option A (copied the Sheet)
Your copy has a fixed library version from the day you made the copy. To update manually:
- Open your Sheet β Extensions β Apps Script
- Left sidebar β Libraries β click WalletTracker
- Change the Version dropdown to the highest available number
- Click Save β close the tab β refresh your Sheet
- Replace Code.gs with the current wrapper block (see Option B setup above)
If you used Option B (added the library manually)
Same steps as above. Alternatively, set Version to HEAD (development mode) to always receive the latest deploy automatically.
How to know a new version is available
Open the Version dropdown in Apps Script β if a higher number exists than what you have selected, an update is available. Release notes are posted on GitHub Releases.
Common Issues
β ReferenceError: WalletTracker is not defined
- The library isn't linked β go to Libraries + and add it first
- The identifier must be exactly
WalletTracker(case-sensitive)
β "RPC error" in cells
- Check the URL in B2 is correct and starts with
https:// - The RPC provider may be rate-limiting you β try a private key from Alchemy or Infura
- Make sure the RPC matches the chain β an Ethereum RPC won't work for Polygon
- Set a fallback RPC: β‘ Balances β Set fallback RPC
β Wrong token balance / wrong decimal places
- Run β‘ Balances β Clear decimals cache then re-fetch
- Verify the contract address in row 2 matches the correct chain
β A row shows "INVALID" and I didn't type anything wrong
- Check for extra spaces, a missing character, or a wrong length in that address β anything starting with
0xthat isn't exactly 42 characters gets flagged - Placeholder text that doesn't start with
0xis never flagged, so this only appears on genuine near-miss addresses
β Portfolio numbers look off
- Duplicate wallet addresses on the same sheet are fetched and counted per occurrence β remove duplicates if you want a strict unique count
- The Wallets column only counts exact 42-character addresses, so malformed or placeholder rows are correctly excluded
β Auto-fetch installed but nothing happens
- Check Code.gs has the
wt_triggerFetchwrapper β it is required - In Apps Script β Triggers β verify a trigger for
wt_triggerFetchexists
β Tracker seems stuck or looping
- Try β‘ Balances β Clear stuck batch first β it only resets the active sheet
- If that doesn't help, β‘ Balances β Clear ALL cache then re-run Fetch or Start auto-fetch
β No "β‘ Balances" menu
- Refresh the sheet β the menu only appears after a full page reload
- Check Code.gs has all 18 wrapper functions
- Run
onOpenmanually from the Apps Script editor once
FAQ
Is my data stored on your servers?
No. Everything stays in your Google Sheet and your Google account's Apps Script properties. We operate no servers that receive or log your wallet data.
Which blockchains are supported?
Any EVM-compatible chain with a public RPC β Ethereum, Polygon, BSC, Arbitrum, Optimism, Avalanche, Base, and hundreds more.
Which tokens are supported?
Any ERC-20 token on any EVM chain, given its contract address on that specific chain.
Can I ignore wallets with tiny/dust balances?
Yes β β‘ Balances β Set min balance filter dims any wallet below a threshold you choose.
Do I need a paid RPC?
No. Free public RPCs work for personal use. For 100+ wallets, ERC-20 tokens, or frequent refreshes, a free Alchemy or Infura account gives you higher rate limits and better reliability.
Is this free?
Yes, completely free. No subscription, no paywalls, no hidden costs.
Free RPC URLs
Paste any of these into cell B2 of a chain sheet:
- Ethereum:
https://eth.llamarpc.com - Ethereum:
https://eth.drpc.org - Polygon:
https://polygon-rpc.com - BSC:
https://bsc-dataseed.binance.org - Arbitrum:
https://arb1.arbitrum.io/rpc - Optimism:
https://mainnet.optimism.io - Base:
https://mainnet.base.org - Avalanche:
https://api.avax.network/ext/bc/C/rpc - Sepolia testnet:
https://rpc.sepolia.org
More chains: chainlist.org β search any chain and copy the RPC URL directly.
Get Help
Blockchain Explorers
- Etherscan β Ethereum
- Polygonscan β Polygon
- BscScan β BSC
- Arbiscan β Arbitrum
- Optimism Explorer
- Basescan β Base
Removing the library
- Open your Google Sheet β Extensions β Apps Script
- Left sidebar β Libraries β click WalletTracker
- Click Remove
- Delete all 18 wrapper functions from your Code.gs
- Save β the β‘ Balances menu disappears on next reload