Expenses is the ledger for the costs no order pays for — mailers, software, the table at a sourcing trip. Nothing here comes from TikTok; every row is one somebody entered or filed from a receipt. It has two tabs: the Ledger, where the money is recorded, and Receipts, where documents arrive and are turned into rows. This walks through both — about fifteen minutes.
One question per tab, and one destination for the total:
Everything recorded here becomes the Operating expenses line on Finance — Part 3 is the boundary between the two screens, and the one part worth reading even if you never open this tab yourself.
Finance juggles three dates because TikTok's money arrives on three different clocks. An expense has only one: the date you put on it — the day the money left. That is deliberate. August's receipts get entered in September, and every window filter in this feature uses the spent date, never the date the row was created.
It is a calendar day, not a moment. An expense dated the 1st belongs to the 1st for everyone looking at it, wherever they are.
Filters, a total, and one table that both shows your expenses and takes new ones. There is no "add expense" dialog anywhere on this screen, and that is on purpose.
Above the cards: a from and to date, a category, a show picker, and a search box. Both dates include the day you name — an expense dated on your To date is in. The show picker starts on All shows and takes as many as you like. Search matches the vendor name, the description, and the internal notes field on the record.
These filter the Ledger tab only. They do not follow you to Receipts, and they do not change anything on Finance.
The Totals card shows one figure — everything matching the current filter — and under it the same money split by category, largest first. It is the same arithmetic Finance uses for its operating-expenses breakdown, done the same way, so the two screens can be compared line by line rather than approximately.
The empty row at the bottom of All expenses is the entry form. Fill it and press Enter — from the date, the amount or the description — and the row is written and the form clears. Only the date carries over: a batch of receipts entered in one sitting is nearly always for the same day, and retyping it every time is the friction this row exists to remove. Focus jumps back to Vendor, the next field after the date that stayed put, so a second expense is a straight run of keystrokes.
Date and amount are the only required fields. An amount must be more than $0.00 and have at most two decimal places; anything else is refused with a sentence rather than a code.
Edit turns that row's cells into inputs in place — no dialog, same as adding. Enter or Save commits it; Cancel abandons it. Delete asks for a confirm on the row itself before anything happens. Only one row is ever in a special state: starting an edit clears a pending delete elsewhere, and starting a delete closes an open edit.
A row with filed receipts shows 📎 and a count. That is the at-a-glance answer to "which of these can I substantiate". Clicking it opens that expense's most recently received receipt. The count is the number filed against that one expense; an expense can hold up to ten.
There is no way to attach a document from this side — receipts are filed from the Receipts tab, which is where the document is on screen while you decide.
Both are optional, both are yours, and neither is ever deleted once it has been used.
Category is deliberately not required. Forcing one at the moment of entry makes people invent a category to get past the field, and an invented category is worse than none. A blank one appears in the breakdown as Uncategorised — visible on this screen and on Finance, which is the honest prompt to come back and fix it.
Manage categories at the foot of the table opens it; so does + New category… at the bottom of any category picker — and a category you create that way lands selected on the very row you were filling in, so you do not have to pick it twice.
Inside there is a starter set of chips for a live-selling operation. They are offered, never created for you: a workspace that sprouts ten categories nobody asked for then needs nine of them archived. A chip you already have is shown ticked and disabled, matched loosely enough that "packaging" blocks the "Packaging" chip — two spellings of one category would split a line of your P&L in two.
Categories can be renamed and archived, never deleted. A category in use is tagged in use, and that tag is the reason there is no delete: those rows still label spending history. An archived category disappears from the pickers for new work but stays on every expense it already labels — and an expense being edited still shows its own archived category, marked as such, so saving cannot silently strip it.
The Vendor field is a picker with an escape hatch, not a required record. A name that was typed before vendors existed, or read off a receipt, stays selectable as itself and is labelled not saved as a vendor. Nothing is auto-promoted: a name that matches no managed vendor is left as free text, because auto-creating on first sight would turn every typo and every one-off corner shop into a permanent picker entry.
+ New vendor… in the picker (or Add a vendor at the foot of the table) opens a small form: name, contact, website, a default category, and notes. Three things follow from having one:
Vendors archive rather than delete, on the same reasoning as categories, and an archived vendor's name still matches when a receipt arrives under it — the spend is still that vendor's, and refusing the link would detach it from its own history.
This ledger is the only source of Finance's operating costs. The boundary is worth knowing in both directions.
On Finance, the stage below merchandise is Operating, net. Open it and you get two lines: Operating expenses — this ledger, broken down by your own categories, largest first — and Platform adjustments, which is TikTok money belonging to no order. Only the first comes from this screen.
The stage is named net because adjustments can be an inflow. A period where TikTok paid back more than you recorded in expenses reads as Operating, net gain — that is the platform's doing, not a negative expense.
Every expense can be tagged to a show, and No show is the deliberate default — most operating costs are not show-specific. Tag the ring light you bought for one broadcast; do not tag the software subscription.
One other thing writes into this ledger: a stock write-off on Inventory. Adjusting a bin down for damage, loss or a sample, with the booking box ticked, creates an expense here for what those units cost — described as Shrinkage — bin label — reason, with no vendor.
A miscount books nothing, and that is not a choice you can override: the money you paid did not change, so no loss occurred — the bin simply holds fewer units than recorded, which is a costing problem rather than an expense. Nothing is booked for a bin with no cost on it either, and finding extra units never books a gain.
One quirk to know: a row you type is dated to a plain calendar day, while a shrinkage row carries the exact moment the adjustment was made. On a date filter that can put it just outside a range ending on its own date.
Two ways: forward them, or put them in by hand. Both land in the same queue.
Each workspace has its own private address of the form
receipts+<your token>@…. Anything forwarded to it becomes a receipt in the
queue below — attachments if there are any, otherwise the email body itself, which is what
most vendor receipts actually are.
The strip is honest about whether that works yet, because two independent things have to be in place and neither implies the other: an MX record on the receipts domain decides whether mail can be delivered at all, and a webhook signing secret on the server decides whether we accept the delivery. While either is outstanding the strip reads Inactive, opens a numbered checklist naming exactly what is missing, and disables the Copy button. That is deliberate: handing out an address that silently swallows every receipt sent to it is worse than showing none — you would forward a month of them and find out at tax time.
Rotate…, in the strip's ⋯ menu, issues a new token and address. It asks for a confirm because the old address stops accepting mail immediately — anything already forwarded to it, or any vendor you set up to send there, will need updating. Use it if the address has leaked somewhere you would rather it had not.
Add receipts… takes PNG, JPEG, WEBP and PDF, up to 10 MB each. You can drop files anywhere on the page, choose a whole folder at once, or paste a screenshot straight onto the screen — all three are how receipts actually reach a computer. Drag a file over the window and the whole page becomes the target; there is no box to aim at, except on an empty inbox, where an idle screen can afford one. Each file is handled on its own, so one bad file in a batch of twenty does not abandon the other nineteen; it tells you which one and why.
The queue, the document and the form are on screen at once and never go away. A sitting is a run of keystrokes, not a sequence of dialogs.
Every unfiled receipt, newest first, each showing what we know: vendor, date, amount, how it arrived, and how well it was read — a coloured dot with the word beside it (Confident, Partly read, Reading, Can't read), so the colour never carries the meaning alone and you do not have to hover a row to find the ones that need you. The two chips above the list filter on exactly that: Ready is the confident set, Needs you is everything else.
The document fills the middle of the screen; the filing form sits to its right, opened on whatever was read. Two marks appear next to field labels:
The mark clears the moment you type in the field — including retyping the same value. What a model guessed and what you confirmed must never blur together on a screen whose output is your books.
Description and Show are never prefilled. No show is the default here for the same reason it is on the ledger.
Whichever applies, in the receipt's own words:
File & next creates the expense, attaches this receipt to it, and moves you to the receipt that will be next once this one leaves the queue — so you land on real work rather than bouncing back to the top of the list. The button stays greyed until both a date and an amount are present.
Attach opens a search over your whole ledger — not just the recent window the automatic match looks at — for when the expense exists but was not close enough to be spotted. Archive takes a receipt out of the queue without filing it: a duplicate, a delivery note, something that is not a receipt at all.
The point of the workbench is clearing a backlog without the mouse. Enter files the current receipt and moves on — it works from inside the fields too. J/K or the arrow keys move up and down the queue, A opens attach, X starts an archive, and Escape backs out of either.
Enter deliberately does not file while you are typing in the attach panel: someone searching there is looking for the expense this receipt belongs to, and filing on Enter would create the exact duplicate they opened the panel to avoid.
When more than one receipt was read confidently, the rail offers to file them all. It never does so blind: a sheet lists every one with the amount that will hit the ledger and a category you can still change, and anything you would rather look at yourself can be unticked. They are written one at a time, so a failure part-way is reportable as "six filed, one didn't" rather than an indeterminate pile.
A receipt is read by a model. Nothing it reads becomes money on its own.
The model is asked for four things — vendor, the grand total actually charged, the transaction date, and the currency — and told in as many words never to guess: anything it cannot read comes back empty. An empty field is always safer than an invented one, because the only cost of an empty field is that you type it, while the cost of an invented amount is a wrong number in your books.
Read confidently requires both an amount and a date. A reading that claims confidence but is missing either is downgraded to partly read — the half you have to supply is what decides, not the model's own opinion of itself.
Reading is queued rather than done on arrival, so an email is never held open waiting for a model. The queue is drained about once a minute, a few receipts at a time. While the tab is open it re-asks every five seconds for about a minute and then stops rather than hammering the server forever — so a large batch can outlast the asking. If a dot is still amber after a couple of minutes, reload the page.
Check three things, in order: the date window (Finance's timeframe against your from/to), the show filter — a show-filtered report drops every untagged expense — and whether Finance's stage is showing net of platform adjustments, which are TikTok's money and never come from this ledger.
The page stops asking after about a minute; reload it. If it is still reading after that, the queue is genuinely stuck — and you can file the receipt by hand in the meantime, which is exactly what the banner invites you to do.
Look at the address strip at the top of the Receipts tab first. If it says Inactive, nothing you forward will ever arrive and the checklist names the missing step. If it says Receiving, open the ⋯ menu: a "DNS couldn't be checked" note there means delivery is plausible but unproven — that is the case where forwarding one receipt is the test.
Almost always because the expense was deleted and re-entered. The receipt stayed attached to the row that no longer exists, and there is no view that lists it again. Edit rather than delete-and-retype when a receipt is attached.
The starter categories, what came from a model versus from you, the states a receipt can be in, the hard limits, and what this screen genuinely cannot do.
These ten are offered as chips in the category drawer — chosen for a live-selling operation rather than as a general chart of accounts. The app does not define them; the name is the definition, and you can rename or ignore any of them. The right-hand column is the plain reading, not a rule the software enforces.
| Chip | What people usually put in it |
|---|---|
| Shipping supplies | Boxes, mailers, tape, labels, dunnage — the consumables that leave with a parcel. |
| Packaging | What the buyer sees: branded boxes, tissue, inserts, thank-you cards. |
| Software & subscriptions | Recurring tools — this app, design software, scheduling, storage. |
| Marketing & ads | Paid promotion and anything bought to bring an audience in. |
| Equipment | Lights, cameras, phones, rails, scales, printers. |
| Sourcing travel | Getting to and from where you buy: mileage, fuel, tolls, a room, a table fee. |
| Contractors & help | People paid for a job rather than a wage — a packer for a busy week, an editor, a VA. |
| Bank & payment fees | Card fees, transfer fees, currency conversion. Not TikTok's own fees — those never touch this ledger. |
| Office & admin | The unglamorous running costs: printing, filing, accountancy, licences. |
| Samples & giveaways | Stock given away rather than sold — often written here by an Inventory adjustment rather than typed. |
| Field | Where it comes from | How it is marked |
|---|---|---|
| Date | Read off the document. Falls back to today when nothing was read. | AI only when it was genuinely read — never on the fallback. |
| Amount | Read off the document — the grand total actually charged, not a subtotal, a line item or a balance forward. | AI. Blank rather than guessed when unreadable. |
| Vendor | Read off the document, as a short merchant name. | AI. |
| Category | Not read. It is the category this vendor's most recent categorised expense used. | LAST. Absent for a vendor with no categorised history — never a guess. |
| Description | Always yours. Never prefilled. | — |
| Show | Always yours. Defaults to No show. | — |
| Currency | Read off the document and stored, but not shown on the form and not used anywhere. Every figure on this screen is treated as dollars. | — |
| Confidence | Derived, not taken on trust: read confidently requires both an amount and a date to have been read. Anything else is only partly read. | The dot in the queue. |
Any mark clears as soon as you type in that field, including retyping the same value — a field you have looked at is your word, not the model's.
| State | Means | Where you see it |
|---|---|---|
| Inbox | Arrived, not yet attached to an expense. | The queue on the Receipts tab. This is the only list the app shows. |
| Filed | Attached to an expense — either one it created, or one you attached it to. | The 📎 count on that expense's ledger row. |
| Archived | Taken out of the queue without filing. Kept, but not listed anywhere in the app. | Nowhere. |
| Not read (grey) | No reading exists for it. Every hand-uploaded file is in this state today. | The dot in the queue. |
| Still reading | Queued or in progress. You can file it anyway. | The dot, plus a banner. |
| Couldn't read | The attempt ran and found nothing legible. | The dot, plus a banner. |
| Only partly read | Something was read, but the date or the amount was not. | The dot, a banner naming the gap, and a marked field. |
| Read confidently | Both amount and date were read. These are the ones bulk filing offers. | The dot, and the count in the rail header. |
| Rule | Value |
|---|---|
| File types you can upload | PNG, JPEG, WEBP, PDF. HTML is accepted only when it arrives as a forwarded email body — never as an upload. |
| Maximum file size | 10 MB each. An oversized phone photo is refused with that reason, not a generic error. |
| Receipts per expense | 10. |
| Duplicates | Detected on the file's contents. The same invoice forwarded twice is one receipt. |
| Amount | Greater than $0.00, at most two decimal places, below 999,999,999,999.99. A value that would round to zero is refused too. |
| Required to save an expense | A date and an amount. Everything else is optional. |
| Category and vendor names | Unique within your workspace, exactly as typed. |
| Email safety | A forwarded email body is displayed in a locked-down frame with no access to your session. SPF and DKIM results are recorded against the receipt, but the private address is what decides whether mail is accepted. |
Stated plainly so you do not go looking. None of these is an error message you will find in the app; they are simply absent.
| Not here | What that means for you |
|---|---|
| Reading an uploaded file | Only emailed receipts are queued for reading. Uploads are stored and filed by hand. |
| Any list of archived receipts | Archive is out of sight for good, from the app's point of view. The document is kept, but nothing shows it to you. |
| Editing or archiving a vendor | You can add a vendor and pick one, but the shipped screen has no way back into an existing vendor's record — including its total spent and last paid. |
| A notes field on an expense | Search matches an expense's notes, and one can exist on the record, but this screen offers nowhere to type it. Use Description. |
| Attaching a receipt from the ledger | Filing happens on the Receipts tab, where the document is in front of you. |
| Any import from a bank or card | Nothing on this screen reads a statement or a feed. Every row is typed, filed from a receipt, or written by a stock write-off. |
| Recurring or scheduled expenses | A monthly subscription is entered each month. The vendor's default category is what makes that quick. |
| Non-dollar amounts | The currency read off a receipt is recorded but never applied. A receipt in another currency needs converting before you file it. |
| TikTok's own fees | Referral fees, shipping labels and refund admin fees are never expenses here — they arrive from TikTok and live on Finance. |
| Inventory you bought to sell | Stock is a purchase, not an expense: it becomes cost of goods when it sells. Recording a bin of merchandise here would double-count it. |
Unfiled receipts are costs that have not landed yet. A month that looks good with fifteen receipts sitting in the inbox has not been measured, only glimpsed.
One record, one default category, and every future receipt from them opens on the right answer. It also collects everything you already typed under that name.
It is the one line that says a figure exists but nobody decided what it was. It is meant to be visible, and it is meant to shrink.
The date on the row is what puts the money in a month. Entering August's receipts in September is normal and correct — as long as the dates say August.
A deleted expense takes its receipt out of sight with it. Almost every "wrong row" is a wrong field.