Handing the app the evidence
The reason people stop tracking money is not that budgeting is hard. It is that typing ฿89, 7-Eleven, today, food is boring on the fourth try. So Pocketbird takes the evidence you already have — the transfer slip in your camera roll, the bank SMS in Messages, the receipt in your pocket, the statement your bank exported — and turns it into a transaction you only have to check.
All of it is read on the phone itself: Vision text recognition for images, Apple's on-device language model for pasted text. No receipt, no SMS and no statement is uploaded anywhere to be read.
- The rule the whole feature is built on: the machine reads, you confirm. A scan never posts a transaction by itself, and anything it read weakly is flagged for you to look at.
- Rows created automatically land in a pinned "To Review" / "รอตรวจสอบ" inbox at the top of the Transactions list until you tick them off.
- Five doors are inside the app: scan one slip, scan a receipt from inside the add form, paste text, scan up to twenty slips at once, or import a CSV statement. More start outside it — the iOS Share sheet, Siri and Shortcuts, a Control Centre button, and the Ask Pocketbird chat.
Scanning one slip or receipt
On a Thai bank transfer slip the app pulls out the amount actually transferred, the recipient, the fee, the reference number and any memo. On an ordinary shop receipt it pulls the grand total, the date and the merchant.
- Open the Transactions tab and tap the camera-with-viewfinder button in the nav bar — "Scan or Select" / "สแกนหรือเลือกรายการ".
- "Take Photo" / "ถ่ายรูป" opens the iOS document camera, which finds the slip's edges and straightens it live. Only the first page you capture is used.
- "Choose from Library" / "เลือกจากคลังรูป" opens the system photo picker instead, for a slip someone sent you.
- A "Reading slip…" / "กำลังอ่านสลิป…" panel covers the screen while it reads.
- The confirm screen "Confirm from Slip" / "ยืนยันจากสลิป" opens with the fields filled in and the photo already attached. Check the highlighted fields, then tap "Confirm" / "ยืนยัน" — it stays disabled until the amount is a readable number.
Unlike a manual add, the confirm screen opens with the advanced fields already expanded — account, pocket, trip, tags, note, date, receipt photo — and with the keypad deliberately not focused, so you read before you type.
- A clean read shows "Auto-filled from slip — review the highlighted fields before confirming" / "เติมจากสลิปอัตโนมัติ — ตรวจช่องที่ไฮไลต์ไว้ก่อนยืนยัน" at the top.
- A murky read shows "Couldn't read this clearly — enter the details and check anything filled in" / "อ่านได้ไม่ชัด — กรอกรายละเอียดเองและตรวจสิ่งที่เติมไว้ด้วย".
- No text at all shows "Couldn't read the slip — enter the details manually" / "อ่านสลิปอัตโนมัติไม่สำเร็จ — กรอกรายละเอียดเอง", and the form is yours to fill in by hand.
- Per field, a confident read is marked "Read from the receipt" / "อ่านได้จากใบเสร็จ". A flag disappears the moment you actually change that field.
- A total printed in another currency is flagged even when it was read perfectly — "Total reads as USD, not baht — tap to enter the amount in baht" / "ยอดรวมเป็นสกุลเงิน USD ไม่ใช่บาท — แตะเพื่อกรอกยอดเป็นบาท" — because otherwise the figure would be booked as baht.
- Every transaction created this way is flagged To Review, so a bad read can never quietly settle into your history.
- You can also start a scan from inside the add form: Transactions → "+" → the "Scan receipt" / "สแกนใบเสร็จ" button under Amount and Category. It appears only on a brand-new manual add — never when editing, duplicating, recording a debt payment, or after a scan has already filled the form.
- The camera item is hidden, not greyed out, on hardware with no document camera — so what you see in the menu is always something you can actually tap.
- Behind the scenes the image is straightened, turned grayscale, contrast-boosted and read twice — once with language correction on, which is best for Thai words, and once with it off, which is best for digits — then the uncorrected numbers are spliced into the corrected text.
- Classic thermal-printer glitches are repaired before parsing: "29. 70" and "22-60" become 29.70 and 22.60. The dash form is restricted so real dates like 10-05-2017 are left alone.
- Cash-tendered and change lines, tax summaries, reference and account numbers, subtotals, discounts and quantities are all excluded from the search for the grand total.
Smart paste — a bank SMS becomes a transaction
Thai banks already text you every time money moves. Smart paste takes that text — or copied slip text, or a plain note you wrote yourself — and lets the on-device language model pull one or more transactions out of it. You review the drafts and save the ones you want.
- Copy the SMS or the slip text in the other app.
- Open Smart paste: Transactions → "Scan or Select" → "Smart Paste" / "วางอัจฉริยะ", or the "Smart paste" button inside the add form.
- Paste into the box under "Text to understand" / "ข้อความที่จะให้วิเคราะห์". The footer states the deal plainly: "Nothing is saved until you tap Save." / "ยังไม่มีการบันทึกจนกว่าจะแตะบันทึก"
- Tap "Analyze" / "วิเคราะห์" and wait through "Analyzing…" / "กำลังวิเคราะห์…".
- Review the drafts and tap "Save" / "บันทึก" — or "Save 3" / "บันทึก 3" when several are ticked.
- Some messages are refused on purpose: OTP and password codes, promotions and interest-rate ads, failed or declined or insufficient-funds notices, balance-only messages and standalone fraud warnings. You get "No transactions found" / "ไม่พบรายการ" and an "Edit text" / "แก้ไขข้อความ" button, and the check runs before the model does.
- Nearly every Thai bank SMS prints both the amount and the remaining balance. Each number is classified by the label in front of it, and a balance-labelled number is never booked as a transaction.
- Direction is decided by where the money went, not by the verb. "ได้รับเงิน…จากบัญชีของท่าน" is an expense, because the merchant received it from you; "เข้าบัญชีของท่าน", "เงินเข้า", "รับโอนจาก", refunds and cashback are income. With no decisive signal, the model's own reading stands.
- A foreign-currency amount is dropped to zero rather than booked as baht, which leaves the draft unsaveable until you type the baht figure yourself.
- Masked account and reference numbers never become the note — the app substitutes the named counterparty when it can find one, and otherwise leaves the note empty.
- Saved drafts are recorded as digital payments and flagged To Review, and saving closes the whole sheet stack so you land back on the list rather than on an empty add form.
Twenty slips in one sitting
For the evening when you finally deal with a week of transfer slips sitting in your camera roll: pick them all, let the phone read them one by one, then tick and import in one go.
- Transactions → "Scan or Select" → "Scan Multiple Slips" / "สแกนหลายสลิป". The screen is titled "Scan Slips" / "สแกนสลิป".
- Tap "Choose Slip Photos" / "เลือกรูปสลิป" and select up to 20 images in the system picker.
- Watch the counter — "Scanning slip 3 of 12…" / "กำลังสแกนสลิปที่ 3 จาก 12…". Each finished slip replaces its placeholder row as soon as it is read.
- Review the list under "Found Slips (9/12)" / "สลิปที่พบ (9/12)". Every row shows a thumbnail, the merchant, the date, the guessed category, the amount and an import toggle.
- Tap "Import 9" / "นำเข้า 9" in the nav bar. It stays disabled while a scan is still running or nothing is ticked.
- A row with no badge was read cleanly and comes pre-ticked. A row is only pre-ticked when the scan found text and found an amount.
- "Needs review" / "รอตรวจสอบ" means an amount was found but flagged as a weak read — check it before you import.
- "Not a slip" / "ไม่ใช่สลิป" means no readable amount at all. The toggle is disabled and the row can never be imported, but it stays on screen so you can see what happened to that photo.
- Imported rows become expenses with the parsed amount and date, the merchant text as the note, and a digital payment source. A category is filled only when the guessed name exactly matches one of your own expense categories.
- A finished import throws confetti and a checkmark badge, "Slips imported!" / "นำเข้าสลิปแล้ว!", which you can tap to dismiss early and which fades by itself after about 1.6 seconds. Under Reduce Motion the confetti is suppressed and the haptic stays.
- If a save fails you get a "Couldn't Save" / "บันทึกไม่สำเร็จ" alert with "Report a Problem" / "รายงานปัญหา", which opens a pre-filled bug report.
- The screen states its own privacy rule: "Pocketbird can only see the photos you pick here — never your whole library — and slips are read entirely on this device. No photo or permission request leaves your phone." The app never asks for photo-library permission, because the picking happens inside the system picker.
- The photos live in memory only for as long as the review sheet is open — the batch screen never saves or syncs them.
- The same screen exists inside a shared shop, with an extra "Import as" / "นำเข้าเป็น" control choosing "Sale" / "ยอดขาย" or "Cost" / "ต้นทุน" — it defaults to Cost, and you can tap one row's tag to change that single row.
Importing a CSV statement
For the month you gave up on: download the statement from your bank or card issuer, hand the app the file, and check every row before any of it becomes yours. Nothing imports until you tap Import, and rows you untick are forgotten.
- Go to More → Settings → "Profile & Setup" / "โปรไฟล์และการตั้งค่า" → "Import from CSV" / "นำเข้าจากไฟล์ CSV".
- Tap "Choose CSV File" / "เลือกไฟล์ CSV" and pick a .csv or .txt file in the Files picker.
- "Reading file…" / "กำลังอ่านไฟล์…" shows while it parses, off the main thread, so a long statement never freezes the screen.
- Review the rows under "Found Transactions (48/52)" / "รายการที่พบ (48/52)" and untick anything you do not want.
- Tap "Import 48" / "นำเข้า 48".
- Two identical charges inside one file are never merged — two ฿50 coffees on one day are usually two real coffees.
- Rows that yield no date and amount are skipped, including the header row itself.
- Quoted fields follow the full CSV standard, so a description containing a comma or even a line break imports intact.
- Imported rows are recorded as digital payments. Categories are filled best-effort — first from merchants you have filed before, then by keyword against your personal expense categories — while credit and income rows generally stay uncategorized.
- A CSV import deliberately does not round up into a pocket, does not teach the merchant memory, and does not flag its rows To Review. The clean-up screen below is the intended follow-up instead.
- A file with no usable columns says so: "No readable transactions found (date and amount columns required)" / "ไม่พบรายการที่อ่านได้ (ต้องมีคอลัมน์วันที่และจำนวนเงิน)".
The To Review inbox and the clean-up screen
Anything the app captured for you is pinned into an inbox at the top of the Transactions list, headed "To Review" / "รอตรวจสอบ" with a count. It exists so an automatic capture always ends with a human glance.
- Tap a row to open the edit form and correct whatever the scan got wrong.
- Or tap the check on the right of the row — "Mark as reviewed" / "ทำเครื่องหมายว่าตรวจแล้ว" — if it is already correct.
- With more than one queued, "Mark All Reviewed" / "ทำเครื่องหมายตรวจแล้วทั้งหมด" appears in the inbox header.
- The inbox ignores your tag, cycle and search filters, so nothing captured automatically can hide behind a filter you forgot you set.
- Flagged rows still count in every balance and every total — the money really was spent. Review is about the details, not the arithmetic.
- They are held out of the normal day-by-day ledger until reviewed, so the same transaction never appears twice on screen.
- Clearing the flag syncs, so reviewing on your phone empties the inbox on your iPad too.
- Slip confirms, in-form scans, Smart paste, the Siri capture actions, a queued widget quick-add and a saved Ask Pocketbird proposal all land here. Batch slip imports and CSV imports do not.
A statement import leaves a different mess: dozens of rows with no category. The Categorize screen is built for exactly that, and it files a whole merchant in one tap.
- Turn on "All time" / "ทุกช่วงเวลา" to widen the screen beyond the current cycle and mop up everything an old import left behind.
- The picker offers personal categories only — shop and business categories are never listed here.
- Assigning is repeat-safe: re-filing a group overwrites the old pick, and rows that already carry the category are skipped.
- Every category you confirm or correct teaches the app that merchant, so the next slip or SMS from the same shop is pre-filed there — ahead of any keyword guess. This memory lives on the device and is wiped when you sign out.
Keeping the receipt photo
A scan attaches its photo automatically, but you can also attach one to any transaction by hand — for the warranty, for the expense claim, or for the argument three months from now.
- In the add or edit form, open "More details" / "รายละเอียดเพิ่มเติม" and find the "Receipt Photo" / "รูปใบเสร็จ" section.
- Tap "Attach Photo" / "แนบรูป", then "Take Photo" / "ถ่ายรูป" or "Choose from Library" / "เลือกจากคลังรูป".
- Tap the thumbnail to open the full-screen viewer. "Replace Photo" / "เปลี่ยนรูป" swaps it and "Remove Photo" / "ลบรูป" takes it off.
- Every attached image is downscaled to a 2048-px long edge and re-encoded as JPEG. If the result is still over about 2 MB it is refused with "That photo was too large to attach." / "รูปนี้ใหญ่เกินไป แนบไม่ได้".
- Taking a photo here needs only camera permission — this path never touches your photo library. The "Take Photo" item is hidden on hardware with no camera.
- One live photo per transaction. Replacing removes the old one and stores the new one.
- Photos sync through a private cloud folder, and on a second device the placeholder is replaced the first time you open the photo — so a device that never opens it never downloads it. Offline you keep the placeholder.
- Deleting a photo deletes the stored file first and the record second, so no orphan file is left behind in the cloud.
- A transaction with a photo shows a small paperclip in the ledger row, read out as "Has photo" / "มีรูปภาพ".
- In a shared shop the same field carries a plain warning: "Shop partners can see this photo" / "หุ้นส่วนในร้านเห็นรูปนี้ได้".
Capturing without opening the app
The fastest capture is the one that starts where the slip already is — in Photos, in Messages, in your banking app. Share it to Pocketbird and the app opens on the right review screen.
- Share one image and the share sheet reads it on the spot; Pocketbird then opens on the slip confirm screen with the photo attached.
- Share text — an SMS from Messages, say — or a web link, and Pocketbird opens Smart paste already filled in and analyzes it for you.
- The extension accepts exactly one image, or text, or one web link at a time. If a share carries both an image and text, the image wins.
- Log from Text refuses what it should: an OTP or promo gets "That doesn't look like a transaction — nothing was logged." / "ข้อความนี้ไม่ใช่รายการเงิน — ไม่ได้บันทึกอะไร", and a message it can read but not trust is stashed with "I couldn't read that confidently — open Pocketbird to review it in Smart paste." / "อ่านข้อความนี้ได้ไม่ชัดเจน — เปิด Pocketbird เพื่อตรวจใน วางอัจฉริยะ".
- Both voice actions check that you are signed in and have consented before anything is written.
Two more readers: the chat and the shop
Two places read a document for you outside the scan menu. One is the Ask Pocketbird chat, which also takes PDFs. The other is a shared shop, where the same OCR files a receipt as stock you bought rather than a personal expense.
- The paperclip is disabled while a reply is still streaming or a previous attachment is still being read, and the thumbnail kept in the transcript is a small 320-px copy, not the full-resolution photo.
- In a shared shop, More → Shop → the shop → the "Log" / "บันทึก" segment → the document-viewfinder button, "Scan Receipt" / "สแกนใบเสร็จ", opens the same OCR into a shop entry pre-set to "Cost" / "ต้นทุน".
- A single shop scan guesses the payment source from the receipt: card, transfer, e-wallet or QR cues make it digital, and cash cues — or no cue at all — make it cash. Rows imported through the shop batch screen are always cash.
- Reading a shop receipt works offline, but saving it does not: "You're offline. Your scanned details are kept — connect to save them to the shop." / "คุณออฟไลน์อยู่ รายละเอียดที่สแกนไว้ถูกเก็บไว้แล้ว — เชื่อมต่ออินเทอร์เน็ตเพื่อบันทึกเข้าร้าน" Your scan is not thrown away while you find signal.
- Shop receipt photos go to a folder shared with the shop's members, not to your personal storage.