Custom Tokens
Accept any ERC-20 token as payment by adding it to your custom token list.
Overview
By default, MakaPay supports a set of built-in tokens (USDT, USDC, etc.) on each network. Custom tokens let you go beyond that list and accept any ERC-20 token that has a valid contract on a supported network.
Supported Networks
Custom tokens are available on the following networks:
Ethereum
Yes
Only if Alchemy has no price
Polygon
Yes
Only if Alchemy has no price
BSC
Yes
Only if Alchemy has no price
Base
Yes
Only if Alchemy has no price
MakaChain
No
Always (use TrustedOracle or manual price)
Why not MakaChain? MakaPay uses the Alchemy Prices API to automatically fetch real-time USD prices for tokens. Alchemy does not support MakaChain, so tokens on MakaChain must rely on the TrustedOracle or a manually provided custom price.
Adding a Custom Token
Step 1: Open the Payment Link Form
Go to Dashboard > Payments
Click Create Payment to open the payment link creation form
Step 2: Select a Network
Choose the network where your custom token is deployed (Ethereum, Polygon, BSC, or Base).
Step 3: Open the Add Custom Token Modal
Click the Token dropdown
Scroll to the bottom of the token list
Click "+ Add Custom Token"
A dialog titled "Add Custom Token" will appear.
Step 4: Enter the Token Contract Address
Paste the ERC-20 contract address into the Token Contract Address field (starts with
0x...)Click the Lookup button
The system will:
Validate that the address is a valid Ethereum address
Query the contract on-chain for its name, symbol, and decimals
Check the Alchemy Prices API for an available USD price
Display a token metadata card showing the token's logo, name, symbol, and decimal count
Step 5: Review Token Metadata
After lookup, you will see a card displaying:
Token logo (if available) or a colored placeholder circle
Symbol and Name (e.g., "PEPE PepeCoin")
Decimals (e.g., 18 decimals)
Price status: Either "Current price: $X.XX (auto-updated)" in green, or a warning that no automatic price is available
Step 6: Provide a Custom Price (If Required)
If the token has no Alchemy price, you will see an amber warning:
"No automatic price available for this token. You must provide a USD price for accurate fee calculation. Update this price if the token value changes."
Enter the current USD price per token in the Price (USD) field (e.g., 0.00001234). This value must be a positive number.
If the token does have an Alchemy price, the price field is not shown -- the system will use the auto-updated price.
Step 7: Save
Click "Add [TOKEN_SYMBOL]" to save the token. It will now appear in your token dropdown under a "Custom Tokens" section with a "Custom" badge.
Price Resolution
When you create a payment with a custom token, MakaPay resolves its USD price using a three-step waterfall:
1. Alchemy Prices API (Automatic)
For Ethereum, Polygon, BSC, and Base, MakaPay queries the Alchemy Prices API using the token's contract address and chain. If Alchemy returns a valid, non-zero price, it is used automatically. No action is required from you.
2. TrustedOracle (Automatic)
If Alchemy has no price, MakaPay checks the TrustedOracle smart contract on MakaChain. The oracle stores prices by token symbol. If a matching symbol is found with a non-zero price, it is used.
3. Custom Price USD (Manual Fallback)
If neither Alchemy nor the TrustedOracle returns a price, MakaPay uses the customPriceUsd value you provided when adding the token (or when creating the payment via API). If no custom price exists either, the payment creation will fail.
Price Source in Payment Records
Every payment stores its priceSource field, which can be one of:
alchemy
Price from Alchemy Prices API
trusted_oracle
Price from TrustedOracle on MakaChain
custom
Price provided manually by the merchant
stablecoin
Token is a known stablecoin; assumed $1.00
Custom Price USD
When Is It Needed?
You must provide a custom USD price when:
The token is not listed on Alchemy's pricing index (most small-cap or newly deployed tokens)
The TrustedOracle does not have a price entry for the token's symbol
You are using a token on MakaChain, which is not covered by Alchemy
How to Set It
In the dashboard: Enter the price in the "Price (USD)" field when adding a custom token, or in the "Token Price (USD)" field that appears on the payment form when a custom token without automatic pricing is selected.
Via API: Include the customPriceUsd field in the payment creation request body (see API Reference below).
Updating the Price
If the token's market value changes significantly, update the stored price:
Remove the existing custom token from your list
Re-add it with the updated price
Alternatively, provide an updated customPriceUsd directly in each API payment request -- this overrides the stored value.
Volatility Warning
Custom prices are static snapshots. They do not update automatically. If you accept a volatile token, the price you set when creating the payment may be outdated by the time the customer pays.
Recommendation: For volatile custom tokens, use a 1-hour expiration on payment links. This limits the window during which the token's price could drift significantly from the value used to calculate fees and amounts.
Fee Calculation for Custom Tokens
Custom tokens use the same fee structure as all other tokens (platform fee, processing fee, gas fee). The difference is in how the non-percentage fees are converted to token units.
How It Works
For stablecoins (USDT, USDC, etc.), the system assumes 1 token = $1 USD, so a $0.10 processing fee equals 0.10 tokens.
For custom tokens, the system converts USD fees to token units using the resolved token price:
Example: Token Worth $0.05 Each
Platform Fee (1%)
1% of amount
1% of amount (same)
Processing Fee
$0.10
2.00 tokens
Gas Fee (est.)
$0.03
0.60 tokens
Platform fee is always a percentage of the requested amount, so it works identically regardless of token price.
Processing fee and gas fee are fixed USD amounts that must be converted using the token's price. If the token is worth $0.05, then $0.10 = 2.00 tokens.
Fee Modes
All three fee modes (Gas Tank, Gasless, Payer Covers Fee) work with custom tokens:
Gas Tank
Fees deducted from your Gas Tank in USDT. Token price is used to calculate the USDT equivalent.
Gasless
Fees deducted on-chain from the payment amount in the custom token. Token price converts USD fees to token units.
Payer Covers Fee
Fees added on top of the payment. Customer sends extra tokens to cover fees.
Gasless Restriction
Gasless mode requires the system to know the token's USD price so it can calculate how many tokens to deduct as fees. If a custom token has no price available (no Alchemy price, no oracle price, and no custom price), MakaPay automatically disables gasless mode and switches to Gas Tank mode.
Expiration Recommendations
Stablecoins (USDT, USDC)
24 hours or no expiration
Major tokens with Alchemy price (WETH, WBTC)
24 hours
Volatile custom tokens (meme coins, new tokens)
1 hour
Tokens with a custom price (no auto-update)
1 hour
For tokens with a manually set custom price, the price does not update between payment creation and settlement. A shorter expiration window reduces the risk of a significant price change making the fee calculation inaccurate.
POS Custom Tokens
Custom tokens are fully supported in the Point of Sale (POS) flow.
How It Works
When you open the POS and select a network, the POS loads both built-in tokens and your custom tokens for that network
Custom tokens appear alongside built-in tokens in the token selection grid
Each custom token displays a "Custom" badge to distinguish it from built-in tokens
When you select a custom token, the POS fetches its current price to calculate the equivalent token amount for the USD payment
Price Calculation in POS
For non-stablecoin custom tokens, the POS:
First tries the oracle price API (
/api/oracle/price)Falls back to the token metadata API (
/api/tokens/metadata) which queries Alchemy for the current priceDisplays the amount as "Approx" rather than "Equals" since the price may fluctuate
If no price can be resolved, the POS shows an error and does not allow continuing to payment.
Troubleshooting
"Invalid contract address"
Cause: The address you entered is not a valid Ethereum address format.
Fix: Ensure the address starts with 0x and is exactly 42 characters long (including the 0x prefix). Copy the address directly from a block explorer (Etherscan, Polygonscan, BscScan, or Basescan).
"Cannot read token contract"
Cause: The address does not point to a valid ERC-20 contract on the selected network, or the contract does not implement the standard decimals() function.
Fix:
Verify the contract address is correct
Confirm you selected the correct network (e.g., if the token is on Polygon, do not try to add it on Ethereum)
Check that the contract is a standard ERC-20 token by viewing it on a block explorer
"No automatic price available for this token"
Cause: Alchemy does not have pricing data for this token. This is common for small-cap tokens, newly deployed contracts, or tokens on MakaChain.
Fix: Enter a USD price manually in the "Price (USD)" field. You can find the token's current market price on CoinGecko, CoinMarketCap, or a DEX aggregator.
"This token is already in your custom tokens list"
Cause: You already added this exact token (same contract address, same chain).
Fix: The token is already available in your token dropdown. Look for it in the "Custom Tokens" section.
"Price is required for this token"
Cause: You tried to save a custom token that has no automatic price without entering a custom USD price.
Fix: Enter the token's current USD price in the "Price (USD)" field before saving.
Wrong Decimal Display
Cause: The token's decimals() function returns a non-standard value.
Fix: MakaPay reads decimals directly from the smart contract. If the displayed decimal count looks wrong, the contract itself may have a non-standard implementation. Verify on a block explorer that the token uses standard ERC-20 decimals.
Fees Exceed Payment Amount
Cause: For very low-value tokens, the converted fee amounts (in token units) can exceed the payment amount itself, especially in gasless mode.
Fix: Either increase the payment amount or enable "Payer Covers Fee" so fees are added on top rather than deducted from the payment.
API Reference
Creating a Payment with a Custom Token
Use the standard POST /payments endpoint. For custom tokens, include the customPriceUsd field:
customPriceUsd Field
customPriceUsd FieldcustomPriceUsd
string
No
USD price per token (e.g., "0.00001234"). Used as a fallback if Alchemy and TrustedOracle have no price. Required for tokens with no automatic price source.
Behavior
If the token has an Alchemy price,
customPriceUsdis ignored (Alchemy takes priority)If the token has a TrustedOracle price but no Alchemy price, the oracle price is used and
customPriceUsdis ignoredIf neither automatic source has a price,
customPriceUsdis usedIf no price is available from any source and the token is not a stablecoin, gasless mode is automatically disabled (falls back to Gas Tank mode)
Response
The response is the same as any other payment creation -- a url field with the payment page link:
Contact
Questions about custom tokens?
Email: [email protected]
Dashboard: Use the support chat
Last updated
