Non-Itemized Receipt: What It Is, Why Claims Get Rejected, and How to Catch One
A non-itemized receipt is proof that you paid a merchant a certain amount on a certain day, without a list of what you paid for. The most common one is the card terminal slip: merchant name, date, card number masked to the last four digits, an authorization code, and a total. An itemized receipt is the bill behind it, with each product or service on its own line, a subtotal, tax, and usually a tip line. Short answer: a non-itemized receipt proves payment, and an itemized receipt proves what the money bought. Expense policies and tax rules usually care about the second part, so a claim backed only by a card slip is often returned. If you process receipts at any volume, you can catch these before an approver does by reading each receipt with OCR and checking whether it contains item lines at all.
This post is about that one document question. For the full path from receipt photo to approved, archived claim, read the paperless expense management guide.
Itemized vs. non-itemized receipts
| Non-itemized receipt | Itemized receipt | |
|---|---|---|
| Typical form | Card terminal slip, “total only” till receipt, bank or card statement line | Restaurant bill, hotel folio, shop till receipt with product lines |
| Shows | Merchant, date, total, often masked card and auth code | Merchant, date, each item with price, subtotal, tax, tip, total |
| Proves | That a payment happened | What was bought, how many, and what each part cost |
| Common gap | Number of people, alcohol vs. food, hotel extras | Usually none for policy, though payment method may be missing |
Many restaurants hand you both: the itemized bill on the table and the card slip after you pay. The slip is the one that ends up in a wallet. The bill is the one finance wants.
Why a non-itemized receipt gets rejected
The reason is not that finance likes paperwork. A total alone cannot answer the questions a policy or a tax rule asks.
In the US, IRS Publication 463 says documentary evidence is ordinarily adequate when it shows the amount, date, place, and essential character of the expense. “Essential character” is the part a card slip leaves out. The same section spells out what that means for common receipts:
- A restaurant receipt for a business meal should show the restaurant’s name and location, the number of people served, and the date and amount. If the charge includes items other than food and beverages, the receipt must show that.
- A hotel receipt should show the hotel’s name and location, the dates of the stay, and separate amounts for lodging, meals, and telephone charges.
A card slip from a hotel shows one number for the whole folio. A card slip from a restaurant does not say how many people ate or whether part of the bill was something other than food. Those are the gaps.
Pub 463 also says a canceled check together with a bill from the payee ordinarily establishes the cost, but a canceled check by itself does not prove a business expense without other evidence of business purpose. A card statement line has the same weakness: it shows payment, not character.
Company policies add their own reasons on top of tax rules:
- Non-reimbursable items. Alcohol, minibar charges, in-room movies, or personal purchases may be excluded. You cannot remove them from a total you cannot see inside.
- Per-person limits. A meal cap per attendee needs a headcount and a total that matches it.
- VAT recovery. In the EU, a simplified invoice under Article 226b of the VAT Directive must still identify the type of goods or services supplied and the VAT amount or the information needed to calculate it. A slip with just a total often carries neither.
When a non-itemized receipt is enough
Not every expense needs line items. Pub 463 lists cases where documentary evidence is not needed at all: an expense other than lodging under $75, a transportation expense where a receipt is not readily available, and meals or lodging covered by a per diem allowance under an accountable plan. You still record the amount, date, place, and business purpose in your own expense record.
In practice, a single-item purchase also makes the distinction moot. A taxi receipt, a parking ticket, or a train fare is effectively itemized because there is only one thing on it. The question “what was this for?” is already answered.
Your company policy can be stricter than any of this. Many policies require an itemized receipt for every meal regardless of amount. Check the written policy and your tax advisor before relying on a threshold.
What to do when you only have the card slip
If the itemized receipt is gone, work through these in order:
- Ask the merchant for a copy. Restaurants and hotels can usually reprint a bill or email a folio if you give them the date, approximate time, table or room number, and the last four digits of the card.
- Check your email. Hotels, airlines, rail operators, ride-hailing apps, and many online shops send an itemized receipt by email that you can forward straight into your expense tool.
- Write down what the slip cannot say. Attendees, business purpose, and a short description of what was ordered, written at or near the time of the expense. Pub 463 gives a timely kept record more weight than a statement prepared later.
- Use your company’s missing receipt process. Many expense tools have a missing receipt declaration that the employee signs. Whether it is accepted, and up to what amount, is a policy decision.
Then fix the habit. Photograph the itemized bill at the table, before you pay, so the slip becomes a backup instead of the only record.
How to detect a non-itemized receipt with OCR
If you review receipts in bulk, the fastest win is to stop approvers from discovering card slips one at a time. A receipt either has item lines or it does not, and that is something code can check.
OCRskill fits this in two ways. POST /ocr.json returns typed values for the header fields in its receipt catalog: seller_name, receipt_date, and total_amount, with dates as YYYY-MM-DD and the total as a number. That tells you whether a receipt has the basics. It does not tell you whether the receipt is itemized, because the field catalog has no line-item field. For that, use POST /ocr, which returns the whole page as Markdown, often with the item block as a table, and inspect the lines yourself. The structured OCR JSON API post covers how required and optional fields behave.
The script below sends one receipt to /ocr, then classifies the Markdown as itemized, card slip, or total only. It looks for lines that end in an amount and are not summary lines (subtotal, tax, tip, total, card, change), and it counts card slip markers such as a masked card number, an authorization code, or “customer copy”. When it finds item lines and a printed subtotal, it checks that they add up.
import re
import sys
import requests
API = "https://api.ocrskill.com"
API_KEY = "sk-your-key-here"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
AMOUNT = re.compile(r"(-?\d{1,6}[.,]\d{2})\s*$")
SUMMARY_WORDS = re.compile(
r"\b(sub\s?total|total|tax|vat|tva|mwst|iva|tip|gratuity|change|cash|"
r"card|visa|mastercard|amex|balance|amount|due|paid|rounding)\b",
re.IGNORECASE,
)
SLIP_MARKERS = re.compile(
r"\b(auth(orization)?\s*(code|no|#)?|approval|approved|"
r"merchant copy|customer copy|cardholder copy|\bAID\b|"
r"entry mode|contactless|chip read)\b|[*xX]{4,}\s?\d{4}",
re.IGNORECASE,
)
SUBTOTAL = re.compile(r"\bsub\s?total\b", re.IGNORECASE)
def to_number(text):
return float(text.replace(",", "."))
def lines_of(markdown):
for raw in markdown.splitlines():
line = raw.strip().strip("|").replace("|", " ")
line = re.sub(r"\s+", " ", line).strip()
if line and not set(line) <= set("-: "):
yield line
def classify(markdown):
items, subtotal, slip_hits = [], None, 0
for line in lines_of(markdown):
if SLIP_MARKERS.search(line):
slip_hits += 1
m = AMOUNT.search(line)
if not m:
continue
label = line[: m.start()].strip()
if SUBTOTAL.search(label):
subtotal = to_number(m.group(1))
elif label and not SUMMARY_WORDS.search(label) and re.search(r"[A-Za-z]{3,}", label):
items.append((label, to_number(m.group(1))))
result = {"item_lines": items, "subtotal": subtotal,
"card_slip_markers": slip_hits, "flags": []}
if not items:
result["kind"] = "card slip" if slip_hits else "total only"
result["flags"].append("no item lines found, ask for the itemized receipt")
return result
result["kind"] = "itemized"
if subtotal is not None:
diff = round(sum(p for _, p in items) - subtotal, 2)
if abs(diff) > 0.01:
result["flags"].append(f"item lines differ from subtotal by {diff}")
else:
result["flags"].append("no subtotal printed, check the item lines by eye")
return result
def ocr_markdown(path):
with open(path, "rb") as f:
r = requests.post(f"{API}/ocr", headers=HEADERS,
files={"file": f}, timeout=120)
r.raise_for_status()
return r.text
if __name__ == "__main__":
print(classify(ocr_markdown(sys.argv[1])))
Run it with python3 receipt_check.py receipt.jpg after installing requests and setting your key. A free test key comes from curl https://api.ocrskill.com/get-key.json.
To show what the classifier does with typical layouts, here are two fictional receipts as Markdown and the result for each. First, a card slip:
EXAMPLE BISTRO
SALE
VISA ************4821
Entry mode: contactless
AUTH CODE: 08Q21K
TOTAL EUR 186.40
APPROVED
CUSTOMER COPY
classify() returns kind: "card slip" with five slip markers, no item lines, and the flag “no item lines found, ask for the itemized receipt”. Second, the bill behind a different dinner:
| Item | Qty | Amount |
|---|---|---|
| Grilled trout | 2 | 64.00 |
| Seasonal salad | 2 | 28.00 |
| Sparkling water | 3 | 13.50 |
| House red, bottle | 1 | 58.00 |
| Subtotal | | 163.50 |
| VAT 9% | | 14.72 |
| Total | | 178.22 |
That one comes back as kind: "itemized" with four item lines and no flags, because 64.00 + 28.00 + 13.50 + 58.00 equals the printed 163.50 subtotal. It also shows why itemization matters: the bottle of wine is visible, so a policy that excludes alcohol can act on it.
Limits of this check
- It is a heuristic. Receipts vary a lot. A product name that contains the word “card” or “total” will be skipped, and a receipt that prints quantities and prices on separate lines may be read as total only. Tune the word lists on your own receipts and keep a person on the flagged ones.
- The script assumes one currency and two decimal places. Amounts like
1.234,50or currencies without decimals need a different pattern. - Faded thermal paper and poor photos break everything. If the OCR text is thin, the classifier will report “total only” for a receipt that was itemized on paper. Show the image to the reviewer next to the result.
- OCR does not decide policy. It can tell you that a receipt has no item lines or that a line mentions wine. Whether the claim is approved, and whether the expense qualifies under the rules that apply to you, stays with your approvers and your tax advisor.
Before trusting any flag rate, run a month of real receipts through it and count how often a reviewer disagreed.
Conclusion
The difference between a non-itemized and an itemized receipt is the difference between “I paid” and “this is what I paid for”. Most expense rejections in this area are not about missing money, they are about missing description: headcount, alcohol, hotel extras, or VAT. That makes them predictable. If you check every incoming receipt for item lines at submission time, the employee gets the “please send the itemized bill” message while they can still ask the merchant for a copy, instead of weeks later from an approver.
To try it, get a test key from get-key.json, run a handful of last month’s receipts through /ocr and the script above, and see how many card slips were hiding in the pile. Product details and pricing are at ocrskill.com.
