# TikTok Shop Fee Calculator: Seller Fees, Profit & Margin (`moggedhq/tiktok-shop-fee-calculator`) Actor

Paste TikTok Shop product links or enter price and category to calculate seller fees and profit, e.g. a phone case or serum. About $0.008 per link or $0.002 per manual product. Referral fee, affiliate commission, shipping, profit, margin, ROI and break-even. No login.

- **URL**: https://apify.com/moggedhq/tiktok-shop-fee-calculator.md
- **Developed by:** [mogged](https://apify.com/moggedhq) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.40 / 1,000 product calculations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Shop Fee Calculator: Seller Fees, Profit & Margin

For US TikTok Shop sellers deciding whether a product leaves enough profit after fees, affiliate commission and fulfillment. Paste product links or enter a planned price and category for products you have not listed yet. Independent tool, not affiliated with TikTok.

About **$0.008 per successful product link** or **$0.002 per manual product**, plus a small **$0.00005 Actor start fee**. Checking 20 product links costs about **$0.16**; calculating 50 manual products costs about **$0.10**. Failed lookups, invalid inputs, exact duplicates, summaries and the report have no calculation charge.

### What you get

Every useful row starts with the answer. A cloud-tested manual example is a phone case selling for $19.99, with $6 goods cost, $4 shipping and 15% affiliate commission:

> Profit $5.79 per sale (29% margin) at $19.99: referral $1.20, affiliate 15% $3.00.

The exact margin is 28.96%, and the verified break-even price is $12.66 under those assumptions. A live product-link test on 14 October 2026 returned a $10.99 public price, $0.66 referral fee, $1.10 affiliate commission and $6.23 profit with $2 product cost and $1 shipping. Public prices can change after a run.

| Field | What it means |
| --- | --- |
| `verdict` | Plain-English profit or loss per sale, with rounded margin and key fees |
| `recordType`, `status` | Successful calculation, free note or run summary |
| `productTitle`, `productId`, `productUrl` | Product identity, with URL fields available in link mode |
| `price`, `priceSource`, `originalPrice` | Calculation price, where it came from, and original SKU price when supplied by the page |
| `selectedSkuId`, `selectedVariant`, `priceRange` | The exact public-page variant used and the page's displayed range |
| `category`, `categoryPath`, `categoryMatch` | Fee category and how a manual category was matched |
| `shopName`, `soldCount` | Public shop name and product sold count, when present |
| `referralFeeBase`, `referralRatePercent`, `referralFee` | Referral calculation base, standard or overridden percentage, and dollar charge |
| `referralRateAbove10000Percent` | Upper price-band rate for applicable categories |
| `paymentProcessingFee` | Zero separate processing charge under the standard US model |
| `affiliateCommissionRate`, `affiliateCommissionBase`, `affiliateCommission` | Your entered affiliate percentage, its base and the calculated charge |
| `costPerUnit`, `shippingCostPerUnit`, `fbtCostPerUnit`, `otherCostsPerUnit` | The costs you supplied |
| `revenuePerUnit`, `totalCostsPerUnit`, `netProfit` | Estimated revenue, all modeled costs and remaining profit per sale |
| `marginPercent`, `roiPercent`, `roiCostBasis` | Exact percentages and the disclosed investment basis |
| `breakEvenPrice`, `breakEvenProfit` | Conservative break-even price, checked with cent-rounded fees |
| `saleVolume`, `totalRevenue`, `totalProfit` | Projected totals at your entered sales volume |
| `feePolicyVersion`, `feeSourceUrl`, `feeEffectiveDate` | Versioned fee provenance and verified start date where published |
| `feeTablePublishedDate`, `feeTableVerifiedDate`, `checkedAt` | Table publication, verification and calculation timestamps |
| `notes` | Assumptions, source limitations and promotion warnings |

The default dataset provides **Profit and break-even**, **Every fee line**, and **Product and fee sources** table views. Each run also saves a `SUMMARY` record, a readable `REPORT.html`, and `SUMMARY.categoryRates`, the complete supported category list. These extras are included in the calculation price.

### When to use it

Check supplier offers, compare affiliate rates, model unlisted products and estimate shipping impact before committing inventory. Use a confirmed promotional override to compare a seller offer with the standard category schedule.

### Start in three steps

1. **Choose your products.** Paste full US TikTok Shop product links into `urls`, or put your own products in `items` with price, category and cost.
2. **Enter the costs.** Add your product cost, shipping, affiliate percentage and any FBT or other costs. Replace example values with your actual numbers.
3. **Run and review.** Read the verdict, confirm the selected SKU for product links, and open the fee table or HTML report. Export CSV, Excel or JSON from the dataset.

The prefilled run checks one product link with small example costs. The final 14 October 2026 default cloud run completed in 4.5 seconds. A 32-product manual run took 5.1 seconds. The optimized URL suite returned 30/30 calculations; an earlier fresh test returned 29/30 with one free note. Timing varies with source responses and batch size.

### Input reference

Dollar amounts and percentage rates accept at most two decimals. Enter `15` for a 15% affiliate commission. Negative costs, nonfinite values and unknown categories produce free notes instead of invented calculations.

| Input | Default and use |
| --- | --- |
| `urls` | Full `shop.tiktok.com/us/pdp/.../ID` or `www.tiktok.com/shop/pdp/ID` links |
| `startUrls` | Optional alias accepting strings or objects with a `url` property |
| `items` | Manual objects containing `price`, `category`, and `cost` or `costPerUnit` |
| `costPerUnit` | Shared goods cost; required for URLs unless the map contains the product |
| `costPerUnitByItem` | Map keyed by URL product ID, manual item ID or manual name |
| `shippingCostPerUnit` | Seller's delivery expense; default 0 |
| `affiliateCommissionRate` | Affiliate percentage on buyer-paid product price; default 0 |
| `customerShippingPerUnit` | Buyer-paid shipping revenue; default 0 |
| `platformDiscountPerUnit` | Confirmed platform-funded discount reimbursed to you; default 0 |
| `fbtCostPerUnit` | Your known Fulfilled by TikTok cost; default 0 |
| `otherCostsPerUnit` | Ads, packaging, storage or other per-sale expenses; default 0 |
| `saleVolume` | Positive whole number of projected sales; default 1 |
| `referralFeeRateOverride` | Optional confirmed promotional referral percentage |
| `referralFeeCapPerUnit` | Optional confirmed per-sale cap, requiring a rate override |
| `marketplace` | `US`; other markets are not implemented |

Manual items can override these shared settings. The shorter keys `cost`, `shipping` and `affiliateRate` are accepted inside each item. A global cost map overrides a shared cost; an explicitly entered item cost overrides the map. Give comparison scenarios distinct names or IDs. Exact duplicate manual objects are calculated once; repeated product ID and SKU combinations are fetched and charged once.

A product-page price uses the page's default SKU when available, otherwise its displayed minimum. Add `sku_id=...` to the link to select a listed SKU explicitly. An unavailable requested SKU becomes a free note. A page's original price can be absent, in which case `originalPrice` is null. It is never substituted for the selling price.

#### Manual example

```json
{
  "items": [
    {
      "id": "phone-case",
      "name": "Phone case",
      "price": 19.99,
      "category": "phone case",
      "cost": 6,
      "shipping": 4,
      "affiliateRate": 15,
      "saleVolume": 100
    }
  ]
}
```

This scenario projects $579 profit across 100 sales, charged as one manual calculation.

### Fees, categories and assumptions

The bundled US schedule was verified on **14 October 2026** against TikTok Shop's category table published **8 October 2026**. Most categories use 6%; specified precious-jewelry categories use 5%. Pre-owned goods use 5%, and applicable collectibles and pre-owned categories use 3% on the portion above $10,000. The output records the table version. Rates are not fetched again during every run.

Sources: [official category rates](https://seller-us.tiktok.com/university/essay?knowledge_id=5988482086864682), [referral policy](https://seller-us.tiktok.com/university/essay?knowledge_id=5982454398175018), and [standard affiliate commission](https://seller-us.tiktok.com/university/essay?knowledge_id=6077860360177451).

Plain categories such as `phone case`, `serum`, `gold`, `silver`, `collectibles` and `used watches` are mapped explicitly. Exact published category paths also work. Broad categories with mixed rates, such as jewelry, require a more specific choice. The Actor avoids guessing a cheaper rate from an ambiguous label.

`price` means the buyer-paid product amount after discounts, excluding shipping and tax. Confirmed platform-funded discount reimbursement and buyer-paid shipping are added to revenue and the referral base. Affiliate commission uses the product amount. Seller-funded discounts are already reflected in price. No separate standard US processing fee is added.

Shipping and FBT are entered costs, not estimates from package dimensions. Entering both adds both. New-seller and LIVE auction promotions are not applied automatically: enter a confirmed override only when it applies. A per-sale fee cap is not a weekly GMV limit or a seller-wide campaign savings allowance.

Profit subtracts goods, shipping, FBT, other costs, referral and affiliate charges from modeled revenue. Margin divides profit by that revenue. ROI divides profit by goods, shipping, FBT and other costs, excluding percentage fees; zero invested cost gives a null ROI. Each fee is rounded to cents using half-up rounding.

Break-even holds your other inputs fixed while solving the piecewise fee equation, rounds upward, then verifies the result using cent-rounded fees. It is a conservative checked price, not a promise of the lowest possible cent. If no result is found up to $10 million, it is null with a note. A missing effective date means the rule's start date was not verified, not that the calculation date was its start date.

### Pricing and spending limits

| Example job | Approximate list-price calculation charge |
| --- | ---: |
| 1 product link | $0.008 |
| 20 product links | $0.16 |
| 100 product links | $0.80 |
| 50 manual products | $0.10 |
| 100 manual products | $0.20 |

The $0.00005 minimum start fee is additional. Bronze gets 5% off calculation prices, Silver 10%, and Gold 20%; higher tiers use the Gold discount. Apify platform usage is included for buyers. There are no external API keys to purchase.

Set the maximum charge for the run in Apify. The Actor checks available room before fetching another URL batch and stops when the next calculation cannot fit. A failed URL uses no product-calculation charge. An empty or entirely invalid run can still incur the small platform start fee. Up to 10,000 inputs are accepted per run; split larger inventories into separate runs.

### Use with AI agents (MCP)

Connect your agent to `https://mcp.apify.com` and ask it to find **TikTok Shop Fee Calculator: Seller Fees, Profit & Margin**. Ask it to read the input schema, supply product links plus your costs, and return the verdict, exact margin and break-even fields. For an unlisted product, provide a manual item. Tell the agent your maximum run charge before it starts.

### API and integrations

Use the Actor identifier `moggedhq~tiktok-shop-fee-calculator`. This Python example starts a run and retrieves the complete dataset, including free notes and the summary:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("moggedhq~tiktok-shop-fee-calculator").call(
    run_input={"items": [{"name": "Serum", "price": 30,
                         "category": "serum", "cost": 8,
                         "shipping": 4, "affiliateRate": 10}]},
    max_total_charge_usd=0.10,
)
rows = client.dataset(run["defaultDatasetId"]).list_items().items
calculations = [row for row in rows if row.get("recordType") == "CALCULATION"]
```

JavaScript, using `apify-client` and the same `input` object:

```javascript
const run = await client.actor("moggedhq~tiktok-shop-fee-calculator")
  .call(input, { maxTotalChargeUsd: 0.10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

For HTTP, save your input as `input.json`:

```sh
curl -X POST \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-binary @input.json \
  'https://api.apify.com/v2/acts/moggedhq~tiktok-shop-fee-calculator/runs?maxTotalChargeUsd=0.10'
```

Use schedules to refresh public product-price scenarios, webhooks to collect completed datasets, or Make, Zapier, n8n and Google Sheets to combine results with your inventory. Filter on `recordType` before summing product values; the final summary is not another product.

### Limits and FAQ

**Does it log in or solve CAPTCHA?** No. URL mode reads signed-out public HTML, starts with datacenter access and makes fresh-session retries, including US residential retries. Persistent refusal produces a free note.

**Does every TikTok Shop URL work?** No. Full US product links are supported. Short links, other countries, removed products, unavailable variants and blocked pages can return notes. Checkout prices and logged-in coupons can differ from public prices.

**Can I use it before listing a product?** Yes. Enter a manual item with price, category and cost. No product URL is needed.

**Are all seller expenses included automatically?** Only modeled fees and costs you enter are included. Add your advertising, returns allowance or packaging under other costs. This is not a settlement-statement reconciliation tool.

**Why is ROI blank?** Your entered fixed costs total zero, so the ROI denominator is zero. Profit and margin remain available.

**Can I estimate UK fees?** No. This version supports US categories and USD only.

**How do I model a new-seller offer?** Confirm its terms in Seller Center, then enter the applicable referral override. The Actor cannot verify eligibility, dates or account-wide caps.

**How do I report a source change?** Share the run ID and relevant input through Issues. Never send account cookies or passwords.

# Actor input Schema

## `urls` (type: `array`):

Paste full US TikTok Shop /pdp/ links. $0.008 per successful product. Reads the public default SKU, price, category, sold count and shop. A sku_id query parameter selects a specific SKU. Failures and duplicates are free.

## `items` (type: `array`):

$0.002 per product. Enter objects with name or id, price, category, cost, shipping and affiliateRate, e.g. \[{"name":"Phone case","price":19.99,"category":"phone case","cost":6,"shipping":4,"affiliateRate":15}]. Per-item values override shared inputs. Price excludes buyer shipping and tax. Use saleVolume for projected totals; one row and one charge per scenario, not per unit sold.

## `costPerUnit` (type: `number`):

Required for URL calculations unless costPerUnitByItem has that product ID. Enter 0 only for a deliberately free product. Manual items may use cost or costPerUnit. Cost must match the selected product variant.

## `costPerUnitByItem` (type: `object`):

Optional map overriding the shared cost, e.g. {"1729389546229108745":2,"phone-case":6}. Use the numeric product ID from the URL or an item id/name.

## `shippingCostPerUnit` (type: `number`):

Seller-paid postage and delivery cost. Default 0. This is an expense, separate from customerShippingPerUnit. For FBT use fbtCostPerUnit instead unless these are distinct costs.

## `affiliateCommissionRate` (type: `number`):

Enter 15 for 15%, not 0.15. Default 0. Applied to the buyer-paid product price, excluding shipping, tax and platform-funded discount reimbursement. 0 to 100 with at most two decimals.

## `customerShippingPerUnit` (type: `number`):

Revenue paid by the buyer for shipping. Added to revenue and the referral-fee base. Default 0.

## `platformDiscountPerUnit` (type: `number`):

Add only a confirmed TikTok-funded product discount, where price is the buyer-paid product amount after that discount. Added back to revenue and referral base, not affiliate base. Do not add a seller-funded discount. Default 0.

## `fbtCostPerUnit` (type: `number`):

Your known Fulfilled by TikTok cost per unit. This Actor does not estimate an FBT rate from weight. Default 0; entered in addition to shippingCostPerUnit.

## `otherCostsPerUnit` (type: `number`):

Optional advertising, packaging, storage, expected returns or other per-sale expenses. Default 0.

## `saleVolume` (type: `integer`):

Optional sales volume for projected revenue and profit. Default 1. Does not multiply Actor charges or change the per-sale fee threshold.

## `referralFeeRateOverride` (type: `number`):

Optional. Enter only a confirmed seller-specific/new-seller/LIVE promotional rate. Replaces the standard category schedule and disables its $10,000 tier. Eligibility, campaign dates and seller-wide limits are not inferred.

## `referralFeeCapPerUnit` (type: `number`):

Optional cap on the calculated referral fee for this one sale, only with referralFeeRateOverride. Not a campaign-wide savings cap or weekly GMV limit.

## `marketplace` (type: `string`):

US only; all prices and costs are USD. Other marketplaces produce a free note.

## `startUrls` (type: `array`):

Alternative agent input: \[{"url":"https://shop.tiktok.com/us/pdp/.../product-id"}]. Same behavior as urls.

## Actor input object example

```json
{
  "urls": [
    "https://shop.tiktok.com/us/pdp/niacinamide-serum-10-zinc-1-by-the-ordinary-for-blemish-prone-skin/1729389546229108745"
  ],
  "costPerUnit": 2,
  "shippingCostPerUnit": 1,
  "affiliateCommissionRate": 10,
  "customerShippingPerUnit": 0,
  "platformDiscountPerUnit": 0,
  "fbtCostPerUnit": 0,
  "otherCostsPerUnit": 0,
  "saleVolume": 1,
  "marketplace": "US"
}
```

# Actor output Schema

## `calculations` (type: `string`):

No description

## `fees` (type: `string`):

No description

## `report` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `categoryRates` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://shop.tiktok.com/us/pdp/niacinamide-serum-10-zinc-1-by-the-ordinary-for-blemish-prone-skin/1729389546229108745"
    ],
    "costPerUnit": 2,
    "shippingCostPerUnit": 1,
    "affiliateCommissionRate": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("moggedhq/tiktok-shop-fee-calculator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://shop.tiktok.com/us/pdp/niacinamide-serum-10-zinc-1-by-the-ordinary-for-blemish-prone-skin/1729389546229108745"],
    "costPerUnit": 2,
    "shippingCostPerUnit": 1,
    "affiliateCommissionRate": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("moggedhq/tiktok-shop-fee-calculator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://shop.tiktok.com/us/pdp/niacinamide-serum-10-zinc-1-by-the-ordinary-for-blemish-prone-skin/1729389546229108745"
  ],
  "costPerUnit": 2,
  "shippingCostPerUnit": 1,
  "affiliateCommissionRate": 10
}' |
apify call moggedhq/tiktok-shop-fee-calculator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moggedhq/tiktok-shop-fee-calculator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/49S2fnjGlF6tSG1FZ/builds/aYJtIIDZEjKtuYT7i/openapi.json
