
Documentation
A WordPress plugin to track, visualize, and share your cryptocurrency portfolio — directly from your website.
👋 Introduction
Sakurato Crypto Portfolio Tracker lets you record your crypto investments, track performance over time, and embed live portfolio data anywhere on your WordPress site using shortcodes.
It is designed for long-term investors, content creators, and bloggers who want to share their portfolio with an audience — not for day trading or real-time exchange data. Prices are refreshed every 5 minutes via the CoinGecko API.
- Record buy, sell, withdraw & transfer transactions
- Calculate P&L, ROI, and cost basis automatically
- Display charts and tables on any page via shortcodes
- Save historical snapshots for performance charts
- Share portfolio screenshots on social media
- Import & export data in JSON and CSV formats
- Real-time tick-by-tick price data
- Direct exchange / broker integration
- Automated trading or alerts
- Tax reporting (use CSV export for that)
- Derivatives, futures, or margin tracking
All portfolio data (transactions, snapshots, settings) is stored exclusively in your own WordPress database. Nothing is sent to Sakurato servers. The only external connection is to CoinGecko for live prices — only coin identifiers are transmitted, never any personal data.
The free plugin supports 1 portfolio and includes a Reports summary (period metrics). The optional Sakurato CPT Pro add-on (installed separately, available at sakurato.tech) unlocks unlimited portfolios and full Reports tables (Buy, Sell, Withdrawal, Tax Summary) with CSV export.
⚙️ Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| WordPress | 5.8 | 6.4 or later |
| PHP | 7.4 | 8.1 or later |
| MySQL / MariaDB | MySQL 5.6 | MySQL 8.0 / MariaDB 10.4+ |
| Browser (admin) | Any modern browser | Chrome, Firefox, Edge (latest) |
| Internet access | Required — the plugin fetches live prices from CoinGecko | |
PHP 7.4 reached end-of-life in November 2022 and no longer receives security updates. We strongly recommend upgrading to PHP 8.1 or later.
📦 Installation
Method A — Install from WordPress.org (recommended)
In your WordPress admin, go to Plugins → Add New Plugin.
Type "Crypto Portfolio Tracker" or "Sakurato" in the search box.
Click Install Now, then click Activate once the installation completes.
The plugin creates its database tables automatically. You will see a new Crypto Portfolio menu item in the left sidebar.
Method B — Manual upload
Download crypto-portfolio-tracker.zip from the plugin's WordPress.org page.
Go to Plugins → Add New Plugin → Upload Plugin, choose the ZIP file, and click Install Now.
Click Activate Plugin on the confirmation screen.
The plugin works without a key, but the anonymous public endpoint is capped at just 5–15 calls/min. A free Demo key (no credit card) raises this to a stable 30 calls/min. See API Settings for setup instructions.
🚀 First Steps
After activating the plugin, follow these steps to get up and running:
Go to Crypto Portfolio → Portfolios. A default portfolio is created automatically on activation — rename it (e.g., "Main Holdings") and choose a color.
Go to Crypto Portfolio → Transactions. Add each buy or sell with the coin name, amount, date, and price paid. The plugin calculates your cost basis and current P&L automatically.
Go to Crypto Portfolio → Snapshots and click Save Snapshot Now. Snapshots power all historical charts. After the first manual one, the plugin saves them automatically every hour.
Create or edit a page, paste a shortcode such as crypto_portfolio, and publish. Your live portfolio data will appear on the frontend — visible only to users you choose.
The plugin saves snapshots every hour in the background — no action needed. The longer the plugin runs, the more data your charts will have.
🖥️ Dashboard
The main dashboard (Crypto Portfolio → Dashboard) gives you a real-time overview of your portfolio. It is divided into these areas, top to bottom: the command bar, four metric cards, a two-column chart grid, a Portfolio Health row, and then the collapsible sections — Performance Chart, Portfolio Holdings, and Share Portfolio.
Command Bar
| Element | Description |
|---|---|
| Portfolio selector | Shows the active portfolio name. If you have more than one portfolio (requires Sakurato CPT Pro), a dropdown lets you switch between them instantly. |
| Cache badge | A coloured dot with the label Live prices and the age of the price cache in minutes. Green dot = fresh; grey = stale (older than 5 minutes). |
| Refresh button | Fetches the latest prices from CoinGecko immediately and reloads the page with updated values. |
| Buy / Sell / Withdraw | Open the corresponding transaction modal without leaving the dashboard. |
| Share | Scrolls the page to the Share Portfolio section at the bottom so you can generate and share a portfolio image. |
| Theme toggle (🌙) | Switches between light and dark mode. |
Metric Cards
Four cards below the command bar summarise your portfolio's financial performance.
Current market value of all holdings combined. The sub-rows show Total Invested (real FIAT deposits only) and Cost Basis (total acquisition cost of coins you still hold).
Your overall profit or loss compared to the money you actually deposited (Invested Capital). Shown as an absolute amount and a percentage. Green = profit, red = loss.
Paper profit or loss on coins you still hold. Calculated as current market value minus cost basis of current holdings. Changes whenever prices refresh.
Locked-in profit or loss from coins you have already sold. Calculated using FIFO cost basis. Shows "No sales yet" until you record your first sell transaction.
Each P/L card has a small ? badge. Hover it to see a plain-language explanation of exactly what that number represents.
Portfolio ROI Performance chart
Below the metric cards, the left column shows the Portfolio ROI Performance chart. Three summary figures appear above it:
- Current ROI — your return on investment right now, as a percentage
- Peak ROI — the highest ROI reached in the selected time range, with the date
- Lowest ROI — the lowest (worst) ROI in the selected time range, with the date
Use the time-range buttons (24H · 7D · 1M · 3M · 1Y · ALL) to zoom in or out.
Holdings Distribution
A donut chart that visualises how your portfolio is split across coins by current market value. The centre shows total value and number of assets.
Portfolio Health
The coin in your portfolio with the highest price gain over the last 7 days.
The coin with the largest price drop over the last 7 days.
A composite 0–100 score: Poor, Fair, Good, or Excellent. Reflects diversification and profitability.
Performance Periods (collapsible)
Seven period cards — 24H · 7D · 1M · 3M · 180D · 1Y · ALL — each showing the P/L change for that period in both % and USD. Toggle individual periods on or off; your preference is saved per user. The period P/L is isolated from deposits and withdrawals so it reflects pure market movement.
Performance Chart (collapsible)
Shows your total portfolio value in USD over time as an area chart, with a second line for Invested Capital. Toggle Compare with BTC to overlay Bitcoin's performance.
Portfolio Holdings (collapsible)
A detailed table of every coin you currently hold. Columns include: current price, average buy price, 24 h / 7 d / 360-day price change, a 7-day sparkline, 24 h volume, market cap, total holdings value, and individual P/L.
Share Portfolio (collapsible)
Lets you generate a portfolio screenshot and share it on social media. Reach it quickly via the 🔗 Share button in the command bar.
If no transactions exist yet, the dashboard shows a prompt with Add Transaction and Switch Portfolio buttons instead of the metric cards and charts.
📁 Portfolios
A portfolio is an independent collection of transactions with its own performance metrics, charts, and shortcode display.
The free plugin supports 1 portfolio. Installing the optional Sakurato CPT Pro add-on removes this limit and allows unlimited portfolios.
Your portfolio (free plugin)
The free plugin includes one portfolio created automatically on activation. Go to Crypto Portfolio → Portfolios to rename it, change the description, or update the color. You can add unlimited transactions to it.
Creating additional portfolios Pro
Click the Add New Portfolio button (visible after installing the Sakurato CPT Pro add-on).
Name — required, up to 100 characters. Description — optional. Color — hex color used in the UI (default: #3b82f6).
The portfolio is created instantly. You can now add transactions to it.
Managing portfolios
- Edit — rename, change description, or change the color at any time
- Delete — permanently removes the portfolio and all its transactions and snapshots. This cannot be undone.
- Switch active portfolio — the currently selected portfolio determines which data is shown
Using multiple portfolios Pro
Each portfolio gets its own portfolio_id, which you pass to any shortcode to display that portfolio on a specific page.
crypto_portfolio portfolio_id="2"
crypto_portfolio_chart portfolio_id="2"
crypto_portfolio_pie portfolio_id="2"All transactions, snapshots, and metrics are deleted from the database. Use Import & Export → Export JSON before deleting if you want to keep a backup.
💱 Transactions
Transactions are the source of truth for all calculations. Every buy, sell, or withdrawal you record updates your holdings, cost basis, and profit/loss figures in real time.
Transaction types
You acquired cryptocurrency — either with new fiat money, or by converting a stablecoin (USDT/USDC). Increases your holdings and cost basis.
You disposed of cryptocurrency for fiat or a stablecoin. Reduces holdings and triggers a realized P&L calculation.
You moved cryptocurrency to an external wallet, exchange, or bank. Reduces holdings but is tracked separately from a sale.
Form fields
| Field | Type | Description |
|---|---|---|
| Coin | Autocomplete text | Start typing the coin name or ticker. The plugin searches the CoinGecko database (20,000+ coins). |
| Quantity | Number | How many units you bought, sold, or withdrew. Supports up to 8 decimal places (e.g., 0.00250000 BTC). |
| Price (USD) | Number | The price per unit at the time of the transaction, in USD. |
| Date | Date & time | When the transaction occurred. |
| Payment source | Dropdown | Buy only. New funds = fresh fiat (counted in invested capital). USDT / USDC = converted from a stablecoin (not counted as new capital). |
| Destination | Dropdown | Withdraw only. Where the coins went: External wallet, Bank account, Exchange, or Other. |
| Notes | Text (optional) | Any personal note — exported with the transaction in both JSON and CSV formats. |
How P&L is calculated
Invested capital
Only BUY transactions with Payment source = New funds count toward invested capital.
Unrealized P&L
The paper profit or loss on coins you still hold. Changes every time prices refresh (every 5 minutes by default).
Realized P&L
The locked-in profit or loss from coins you have already sold. Calculated using FIFO (first-in, first-out) cost basis.
Total P&L
You can backfill your entire transaction history. Enter each trade with its original date and price paid. The plugin will reconstruct your cost basis correctly.
Less common coins may not appear in the top-500 preloaded list. Try typing the full coin name or its CoinGecko ID.
📸 Snapshots
A snapshot is a point-in-time record of your portfolio's value. Snapshots are the data source for all historical charts.
- Total invested capital at that moment
- Total portfolio value (market prices)
- Profit / loss in USD
- Profit / loss %
- Total withdrawn cost & value
- Date & time of the snapshot
Once saved, a snapshot cannot be edited — only deleted. This preserves the integrity of your historical data.
If you saved a snapshot with wrong data, delete the snapshot, fix the transaction, then save a new one.
Manual snapshots
Go to Crypto Portfolio → Snapshots and click Save Snapshot Now. A snapshot is created immediately. Manual snapshots bypass all automatic safety checks.
Automatic snapshots (cron)
The plugin registers a WordPress cron job that runs every hour and automatically records a snapshot for each of your portfolios.
| Cron job | Frequency | What it does |
|---|---|---|
| Auto snapshot | Every 1 hour | Records portfolio value for all portfolios (subject to safety checks) |
| Background price refresh | On demand (async) | Stale prices (older than 5 minutes) are refreshed in the background — the page never blocks waiting for CoinGecko |
| Top coins preload | Every 24 hours | Pre-fetches the top 250 / 500 coin list from CoinGecko for instant price autocomplete |
Automatic safety checks
- 80%+ value drop — if the current portfolio value is less than 20% of invested capital and total invested is over $100, the snapshot is skipped.
- Cron lock active — if a previous cron run is still executing, the new run waits up to 2 minutes before giving up.
WordPress cron runs on page load, not on a real system timer. On low-traffic sites, the hourly job may fire less frequently. Consider setting up a real server-side cron to trigger wp-cron.php.
🎯 Target Price & Portfolio Goal
Set price targets for your investments and track progress toward them in real time. Targets are set on the Crypto Portfolio Dashboard and visible only to the portfolio owner — they are not shown in front-end shortcodes.
In the dashboard Holdings table, the Target column lets you set a price goal for each coin individually.
- The input field itself doubles as a progress bar that fills as the current price approaches the target
- Color states: purple (far from target) → amber (close) → green (goal reached)
- Hint below shows "+X% needed" (the actual price gain required to hit the target) or "goal reached"
- Stablecoins are automatically excluded from targets
Above the holdings table, the Portfolio Goal widget shows progress toward a total portfolio target value.
- Set a total target (e.g. $100,000) for the whole portfolio
- Progress bar shows current value vs. target
- Hint shows "+X% needed" and the dollar amount still to go
- Switches to a "goal reached" state when current value meets or exceeds the target
How "+X% needed" is calculated
The hint shows the price gain required from the current price to reach the target — not a progress ratio. For example, if a coin trades at $20 and your target is $90, the hint reads "+350% needed", because the price has to rise 350% from $20 to reach $90.
Target prices and the Portfolio Goal are admin-only features. They appear on the dashboard for the portfolio owner and are never exposed through front-end shortcodes or public charts.
Full dark / light mode
The Target column and Portfolio Goal widget adapt to your WordPress admin color scheme — progress bars, hints, and labels all support dark and light modes.
📊 Reports
The Reports tab gives you a structured summary of all your transactions for any year, month, and portfolio. It is located at Crypto Portfolio → Reports.
The free plugin shows period summary metrics — total invested, transactions count, net capital flow, and more — for any selected year/month. The optional Sakurato CPT Pro add-on adds full Buy, Sell, Withdrawal, and Tax Summary tables with column sorting, pagination, charts, and CSV export.
- Year — select any year with recorded transactions
- Month — narrow down to a specific month, or view the full year
- Portfolio — filter by a single portfolio or view all combined
- Total Invested — sum of all buy transaction values
- Total Sold — sum of actual asset sales (excl. internal swaps)
- Withdrawals — total value of outgoing transfers
- Net Capital Flow — new funds minus withdrawals
- Avg Buy / Sell Price — average cost and proceeds per transaction
Buy Transactions
All purchases grouped by coin. Shows transaction count, total quantity, total value in USD, and a breakdown between From New Funds (fresh capital) and From Crypto/Stablecoin (funded from existing holdings). Includes a funding-source donut chart.
Sell Transactions
Actual asset sales — coins converted to stablecoins or fiat. Internal portfolio swaps (e.g. USDT spent to fund another purchase) are automatically excluded so only real sales appear. Includes a monthly sales bar chart.
Withdrawals
Outgoing transfers — coins sent to external wallets, exchanges, or marked as spent. Grouped by coin and destination. Includes a destination donut chart.
Tax Summary
An overview per coin showing total cost basis (buys), total proceeds (sells), and total withdrawn value for the selected period. Useful as a starting point for tax reporting.
The Tax Summary shows raw transaction data only. No tax rules, rates, or country-specific calculations are applied. Always consult a qualified tax professional for official reporting.
Table features
Every table in Reports supports column sorting (click any header), pagination (10 rows per page), and CSV export — download the section data as a spreadsheet-ready file.
🧮 Calculators
Six handy crypto tools in one tab — quick math without leaving WordPress. Find them at Crypto Portfolio → Calculators. Most run instantly in your browser; only the Converter fetches live prices from CoinGecko.
See your gain or loss, ROI %, and fees for a single trade. Enter buy price, sell price, quantity, and optional fees — the result includes both the absolute P/L and the percentage return.
Find the exact sell price needed to get your money back after fees, plus the price required to hit a target profit. Useful for planning exits in advance.
Enter your past buys to find your real average cost per coin and unrealized profit / loss at the current market price. Great for reviewing a position you have built up over time.
Project how a recurring investment (with an optional starting amount) grows over years with compounding. Adjust the monthly contribution, time horizon, and assumed annual return to see the projected portfolio value.
Enter your current holdings and target weights — the calculator tells you exactly how much to buy or sell to rebalance to your goal allocation.
Convert between any cryptocurrency and USD / EUR / PLN at live market prices. The only calculator that fetches data from CoinGecko.
Calculator inputs are not stored — each calculator is a stateless tool. Refresh the page and the inputs reset. Nothing you type here affects your portfolio data.
With Sakurato CPT Pro installed, the Portfolio Allocation calculator gains a "Load from portfolio" button — one click fills the rows with your current holdings at live market value, so you only need to set the target weights.
🔗 Shortcodes
Shortcodes let you embed live portfolio data anywhere on your WordPress site. All shortcodes accept a portfolio_id parameter.
Go to Crypto Portfolio → Portfolios. The ID is shown next to each portfolio name, or visible in the URL when you open the portfolio.
Full interactive portfolio table with all holdings, current prices, cost basis, and P&L.
crypto_portfolio theme="dark" show_metrics="true" show_logos="true" sort_by="value" sort_order="desc" portfolio_id=""| Parameter | Default | Accepted values |
|---|---|---|
| theme | "dark" | "dark" | "light" |
| show_metrics | "true" | "true" | "false" — show summary bar above the table |
| show_logos | "true" | "true" | "false" — show coin logo images |
| show_zero | "false" | "true" | "false" — include coins with zero balance |
| sort_by | "value" | "value" | "name" | "change" | "percent" |
| sort_order | "desc" | "desc" | "asc" |
| portfolio_id | "" | numeric ID, or empty for the default portfolio |
Historical snapshots table — shows each saved snapshot date with total invested, portfolio value, and P&L.
crypto_portfolio_snapshots limit="50" theme="dark" portfolio_id=""| Parameter | Default | Accepted values |
|---|---|---|
| limit | 50 | any positive integer — max number of rows to display |
| theme | "dark" | "dark" | "light" |
| portfolio_id | "" | numeric ID, or empty for the default portfolio |
Line chart comparing invested capital vs current portfolio value over time. Includes interactive time-range buttons.
crypto_portfolio_chart height="400" theme="dark" show_controls="true" time_range="all" portfolio_id=""| Parameter | Default | Accepted values |
|---|---|---|
| height | "400" | numeric pixels (e.g., "300", "500") |
| theme | "dark" | "dark" | "light" |
| show_controls | "true" | "true" | "false" — show time-range buttons |
| time_range | "all" | "24h" | "7d" | "1m" | "3m" | "1y" | "all" |
| portfolio_id | "" | numeric ID, or empty for the default portfolio |
ROI percentage chart over time — color-coded green/red. Optionally overlays a Bitcoin ROI comparison line.
crypto_portfolio_roi height="400" theme="dark" show_controls="true" time_range="all" chart_type="line" show_btc="false" portfolio_id=""| Parameter | Default | Accepted values |
|---|---|---|
| height | "400" | numeric pixels |
| theme | "dark" | "dark" | "light" |
| show_controls | "true" | "true" | "false" |
| time_range | "all" | "24h" | "7d" | "1m" | "3m" | "1y" | "all" |
| chart_type | "line" | "line" | "area" |
| show_btc | "false" | "true" | "false" — overlay Bitcoin ROI |
| portfolio_id | "" | numeric ID, or empty for the default portfolio |
Donut / pie chart showing how your portfolio is distributed across assets by current market value.
crypto_portfolio_pie theme="dark" height="320" title="" layout="vertical" max_items="7" portfolio_id=""| Parameter | Default | Accepted values |
|---|---|---|
| theme | "dark" | "dark" | "light" |
| height | "320" | numeric pixels |
| title | "" | any string — displayed as chart heading |
| layout | "vertical" | "vertical" | "horizontal" — legend position |
| max_items | 7 | positive integer — coins beyond this are grouped as "Other" |
| portfolio_id | "" | numeric ID, or empty for the default portfolio |
7 period cards showing P/L change for each time period — % change, $ change, and a sparkline SVG. Periods: 24H · 7D · 1M · 3M · 180D · 1Y · ALL.
crypto_portfolio_performance theme="dark" periods="24h,7d,1m,3m,180d,1y,all" show_values="true" show_current_value="true" portfolio_id=""| Parameter | Default | Accepted values |
|---|---|---|
| theme | "dark" | "dark" | "light" |
| periods | "24h,7d,1m,3m,180d,1y,all" | comma-separated list of periods to display |
| show_values | "true" | "true" | "false" — hide $ amounts (useful for public embedding) |
| show_current_value | "true" | "true" | "false" — show current portfolio value in card header |
| portfolio_id | "" | numeric ID, or empty for the default portfolio |
These shortcodes output a single formatted number — useful for embedding live values directly inside paragraphs or headings.
Example: "As of today my portfolio is worth crypto_portfolio_total_current."
| Shortcode | Output |
|---|---|
crypto_portfolio_total_purchase | Total cost basis — sum of all purchase costs |
crypto_portfolio_total_current | Current market value of all holdings |
crypto_portfolio_invested_capital | Total new funds invested (excludes stablecoin conversions) |
crypto_portfolio_profit | Total P&L in USD — color-coded green (profit) or red (loss) |
crypto_portfolio_real_profit | Realized P&L in USD from sold assets |
crypto_portfolio_real_profit_percent | Realized P&L as a percentage |
All inline shortcodes accept a portfolio_id parameter:
crypto_portfolio_profit portfolio_id="2"
Use theme="light" on light-colored sites and theme="dark" on dark themes.
Embed crypto_portfolio_roi show_btc="true" to let readers see how your portfolio compares to simply holding Bitcoin.
Use crypto_portfolio_pie layout="horizontal" in narrow columns or sidebars.
📤 Social Share
The Social Share widget lets you generate a snapshot image of your portfolio and share it directly to X/Twitter, Discord, Telegram, or copy it as text. Find it on the main Crypto Portfolio → Dashboard page.
Generating the image
The plugin renders a snapshot of your current portfolio as an SVG image directly in the browser. No external service is used.
The generated image appears in the preview panel on the left side of the widget.
Use the toolbar buttons below the preview to save or share the image.
Toolbar buttons
| Button | What it does |
|---|---|
| Download SVG | Saves the generated image as an .svg file to your computer. SVG is a vector format — it stays sharp at any size. |
| Copy Image URL | Copies a direct URL to the SVG file hosted on your WordPress site. |
Share buttons
Opens a pre-filled tweet in a new tab with your portfolio summary and a link.
Copies a Discord-formatted embed code to your clipboard.
Opens a pre-filled Telegram share link.
Copies a plain-text portfolio summary to the clipboard.
Some platforms (including X/Twitter) do not support direct SVG uploads. Use Copy Image URL to share a link instead, or take a screenshot for a PNG version you can upload directly.
💾 Import & Export
Go to Crypto Portfolio → Import & Export to back up your data, move it between sites, or analyze it in a spreadsheet.
Exporting data
| Format | Contains | Best for |
|---|---|---|
| JSON | Transactions, snapshots, portfolio settings, notes | Full backups & migrating between WordPress sites |
| CSV | Transactions and notes only (no snapshots) | Spreadsheet analysis, tax calculations, Excel / Google Sheets |
Only JSON export includes your historical snapshots. Use JSON for backups you intend to restore from.
CSV column format
Date, Type, Coin ID, Coin Symbol, Amount, Price USD, Fee, NotesDownload a blank template from the Import & Export page (Download Template button).
Importing data
Click Choose File and select a .json or .csv file. Maximum file size: 10 MB.
The plugin validates the file and shows a preview: format, date range, number of transactions, and unique coins.
Creates a brand-new portfolio from the file. Existing portfolios are untouched.
Adds the imported transactions to an existing portfolio. Duplicate detection prevents adding the same transaction twice.
Deletes all existing transactions in the target portfolio, then imports the file. Use this to fully restore from a backup.
Click Import. The plugin processes the file and reports how many transactions were added, skipped (duplicates), or failed.
Recommended backup schedule
- Monthly JSON backup — full restore capability including snapshots
- After major changes — export before bulk-editing or deleting transactions
- Before plugin updates — always good practice
Replace mode deletes all existing transactions in the target portfolio before importing. Export a JSON backup first.
🔑 API Settings
The plugin fetches cryptocurrency prices from CoinGecko. Go to Crypto Portfolio → API Settings to configure your API key.
Free (Demo) vs Pro API
- API key Required (free account)
- Rate limit 30 calls / minute
- Monthly cap 10,000 calls
- Coin cache Top 250 coins
- Endpoint api.coingecko.com
- Cost Free, no credit card
- API key Required
- Rate limit 500–1,000 calls / minute
- Monthly cap 500,000 calls
- Coin cache Top 500 coins
- Endpoint pro-api.coingecko.com
- Cost From $129 / month
Without any API key the plugin uses the anonymous public endpoint, capped at just 5–15 calls/minute shared across all users. Registering a free Demo key raises this to a stable 30 calls/minute — it takes 2 minutes and requires no payment.
Register at coingecko.com, open the Developer Dashboard, and click Add New Key. No credit card required.
Configuring an API key
Register at coingecko.com/en/developers/dashboard and create a Demo API key. It looks like: CG-xxxxxxxxxxxxxxxxxxxxxxxx
Set the dropdown to Demo (Free) or Pro to match your CoinGecko plan.
Paste your key into the API Key field and click Save Settings.
Troubleshooting 429 errors
HTTP 429 means "Too Many Requests" — CoinGecko has temporarily rate-limited your IP or API key.
- Wait 15–20 minutes. CoinGecko rate limits reset automatically.
- Do not spam the Refresh Cache button. Clicking it repeatedly while rate-limited will extend the lockout.
- Add a Demo API key if you are using the plugin without one.
- Upgrade to a Pro key if 429 errors happen regularly.
The plugin caches the last successful price fetch. Even during a 429 lockout, your portfolio will display the most recently cached prices.
❓ FAQ
No. The plugin works out of the box using the public CoinGecko endpoint — no account or API key required. Adding a free Demo API key is recommended because it gives you a stable rate limit (30 req/min) and enables the top-250 coin price cache.
You can get a free Demo key at coingecko.com/en/developers/dashboard.
Charts require snapshot data. Fix it in two steps:
- Go to Crypto Portfolio → Snapshots and click Save Snapshot Now.
- The hourly cron will add more snapshots automatically going forward.
The performance chart needs at least two snapshots at different points in time to draw a line.
- Type the full coin name instead of the ticker symbol.
- Try the coin's CoinGecko ID (e.g.,
bitcoin,ethereum,uniswap). - Go to API Settings and click Refresh Cache Now.
- Add a Demo API key — it expands the cache from 250 to 500 coins.
Prices are cached locally and refreshed approximately every 5 minutes. This plugin is designed for long-term portfolio tracking, not real-time trading.
Yes — with the optional Sakurato CPT Pro add-on. The free plugin supports one portfolio. With CPT Pro installed you can create unlimited portfolios, each with its own transaction history, charts, and shortcodes.
crypto_portfolio portfolio_id="2"
crypto_portfolio_chart portfolio_id="3"Total purchase cost is the sum of all buy transactions — every USD spent acquiring coins, regardless of payment source.
Invested capital counts only the real new money you brought into the system. Buys funded from USDT or USDC you already held are excluded.
Example: you deposit $1,000 → buy USDT → buy BTC with that USDT. Invested capital = $1,000, total purchase cost = $2,000.
There is no direct exchange integration. However, most exchanges let you export your trade history as a CSV. Reformat that CSV to match the plugin's column format:
Date, Type, Coin ID, Coin Symbol, Amount, Price USD, Fee, NotesThe Coin ID column must contain the CoinGecko ID (e.g., bitcoin, not BTC).
All data is stored exclusively in your own WordPress database — on your server, under your control. Sakurato never receives, accesses, or stores any of your portfolio data.
The only external connection the plugin makes is to CoinGecko for live cryptocurrency prices. Only coin identifiers (e.g., bitcoin, ethereum) are sent — no personal data, no transaction amounts, no portfolio values.
Shortcodes embedded on public pages do display portfolio data to anyone who visits that page. If you want to keep your portfolio private, place shortcodes on password-protected pages or member-only content.
When you delete the plugin through the WordPress admin, the uninstall routine permanently removes all plugin data from your database: portfolios, transactions, snapshots, settings, and scheduled cron jobs.
Simply deactivating (without deleting) does not remove any data. Always export a JSON backup before uninstalling.
🔧 Troubleshooting
Common issues and how to resolve them.
Cause: No snapshots have been saved for this portfolio.
- Go to Crypto Portfolio → Snapshots and click Save Snapshot Now.
- The performance chart needs at least two snapshots at different times to draw a line.
- Verify you are using the correct
portfolio_idin the shortcode.
Cause: Prices have not been fetched yet, or a 429 rate-limit error occurred.
- Go to API Settings and check the cache status. If it shows an error, click Refresh Cache Now.
- If you see a 429 error, wait 15–20 minutes and try again — do not click Refresh repeatedly.
Cause: The shortcode is placed in a context where it is not rendered, or the portfolio has no transactions.
- Make sure you are logged in as the portfolio owner — shortcodes display the current user's data.
- Add at least one transaction to the portfolio before embedding shortcodes.
- In Elementor, use a Shortcode widget or HTML block rather than pasting into a text field.
Cause: WordPress cron depends on site traffic. On low-traffic sites, the hourly job may not fire on schedule.
- Verify the cron is registered: install WP Crontrol and check for the
cpt_record_snapshotevent. - If the event is missing, deactivate and reactivate Crypto Portfolio Tracker.
- For reliable scheduling, set up a real server cron to call
wp-cron.phpevery hour.
Cause: The file does not match the expected format, or exceeds the 10 MB size limit.
- For JSON: the file must contain an
export_versionfield and atransactionsarray. - For CSV: the header row must match exactly:
Date, Type, Coin ID, Coin Symbol, Amount, Price USD, Fee, Notes. - Make sure
Coin IDcontains the CoinGecko ID (e.g.,bitcoin), not the ticker (BTC).
Cause: The free plugin supports one portfolio only.
- You can continue using the existing portfolio — all free features remain fully available.
- To create additional portfolios, install the Sakurato CPT Pro add-on available at sakurato.tech.
Cause: Full transaction tables (Buy, Sell, Withdrawal, Tax Summary) are part of the Sakurato CPT Pro add-on. The free plugin shows period summary metrics only.
- This is expected behaviour — not a bug.
- Install Sakurato CPT Pro (available at sakurato.tech) to unlock full Buy/Sell/Withdrawal/Tax tables, charts, and CSV export per section.
Cause: Metrics are recalculated on page load, but a cached value may be stale.
- Reload the admin page after saving a transaction edit.
- Verify the transaction type and payment source are set correctly.
- Check for duplicate transactions: two identical buys will double the cost basis.
Cause: A previous cache refresh is still running, or the request timed out.
- Wait 30 seconds and reload the API Settings page.
- Check your server's PHP execution time limit (
max_execution_time). A limit below 30 seconds may cause the request to time out.
The free version tracks one portfolio and covers all the basics.
Premium removes every limit — manage multiple portfolios, get advanced analytics, and stay ahead of the market with the full feature set.
One-time purchase per site · 14 -day money-back guarantee

