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 works from the evidence you already have — the transfer slip in your camera roll, the bank SMS you copy out of Messages, the receipt in your pocket, the statement your bank exported — and turns whatever you hand 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 never rides into the ฿ field as if it were baht. When the receipt clearly names the currency next to a number, the form opens its foreign-currency block with that amount already in it (see "A foreign receipt" below). When the evidence is weaker, it falls back to a flag — "Total reads as USD, not baht — tap to enter the amount in baht" / "ยอดรวมเป็นสกุลเงิน USD ไม่ใช่บาท — แตะเพื่อกรอกยอดเป็นบาท".
- 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.
- When a three-letter currency code sits next to the amount — 120.50 USD, USD 120.50 — the amount is left out rather than booked as baht, so the draft cannot be saved until you fill it in. Smart paste never invents an exchange rate; if you want the foreign price recorded, open the full form and use "Paid in another currency", where you enter the rate you actually got.
- 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.
A foreign receipt
A receipt printed in another currency used to be a trap: the number is right, the unit is wrong, and one Confirm tap would book a $32.10 dinner as ฿32.10. The app now handles it in the confirm screen rather than leaving it to you.
When the receipt names the currency right next to a number — "USD 32.10", "112.46 RM", "Total (RM) 112.46", "€1,234.56" — the confirm screen opens with the foreign-currency block already on, the currency picked, and that figure sitting in the foreign amount field. The ฿ field opens EMPTY, deliberately: a baht field holding a foreign magnitude is exactly the mistake this feature exists to prevent.
- If this device has converted that currency before, the rate comes back with it and the entry is complete — nothing left to type. If not, the amount cue reads "Read as USD — enter the rate you paid", which is the one input missing.
- The currency has to appear next to a number before it is allowed to drive anything. The detector matches bare substrings, so "RM" hides inside Confirmed and "RP" inside Corp. — as a warning those false alarms cost a sentence, but as a prefill they would take the ฿ field away from you over a word on a Bangkok receipt.
- When the evidence is not strong enough, nothing is prefilled and you get the older, safer behaviour: an amber "Total reads as USD, not baht — tap to enter the amount in baht".
Slip Capture — the slips already sitting in your photos
Everything above needs you to remember. You pay by PromptPay, the bank app saves a slip, and then the slip sits in your photos and is never logged. Slip Capture is the layer that notices for you: when you come back to the app it checks your recent photos for bank-transfer slips and stages whatever it finds, so Home can offer them.
- More → Settings → Slip Capture, and turn the switch on. iOS asks for photo access here, not before.
- Optionally open "What Gets Scanned" to choose which banks count, and whether ordinary shop receipts are picked up too.
- Use the app as usual. When something is found, Home shows a card: "Found N slips in your photos — Review and log them — nothing saves until you confirm."
- Tap it and each staged slip walks through the same confirm screen a shared slip uses. Confirm the ones you want; the rest can be removed.
- Photos are read on this device by iOS text recognition, and your original photos are never uploaded, changed, or deleted. A photo that is not a slip is discarded straight after the check.
- Only a detected slip is kept, and only as a draft — amount, date, recipient, reference, the recognized text and a small thumbnail — on this device, until you import or remove it.
- Confirming a staged slip does send an image off the phone — and it is a copy, never the original. The thumbnail rides into the confirm screen as the transaction's receipt photo, and a receipt photo is synced data like any other: while cloud sync is on, that small copy the app made is uploaded to your own private media storage so it reaches your other devices. Remove the photo from the transaction and the stored copy is deleted with it. The picture in your library is untouched either way.
- A slip that comes in through "Auto-import confident slips" carries no photo at all — only the parsed draft becomes a row, so nothing is uploaded on that path.
- Each pass is bounded — it looks at up to 30 recent images and reads at most 12 of them — so a day when you dumped 400 photos onto the phone does not turn opening the app into a scanning marathon. The rest are picked up on the next pass.
- The same slip is never staged twice: the scan remembers how far it has got and which images it has already seen, and an imported slip's reference number is remembered so the batch scanner cannot re-import it either.
- Turning the switch off stops the scan cold. Signing out clears everything it had staged.
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. A slip you choose to save keeps a small copy of the image on that transaction, which syncs privately to your account." 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.
