What a group is for
One person taps their card, everyone says they'll transfer later, and by the end of the trip nobody can reconstruct who owes what. A group is the fix: one shared record for a trip, a house, or a run of shared meals, where every bill states who paid, who was in on it, and what each person's slice is.
From there the app keeps a running who-owes-whom, works out the fewest transfers that clear everybody at once, and renders the whole group as one recap card you can post into the chat. What it never does is move money — it produces the numbers and the wording, and the transfer happens in your bank app.
Groups is the one part of Pocketbird that lives on the server instead of on your phone. Whether B has paid A back has to be true for everyone at the same moment, so there is no offline mode: with no connection you get "No Connection" / "ไม่มีการเชื่อมต่อ" and an ask to connect, rather than yesterday's numbers dressed up as today's.
- While a group is open in front of you, a live channel keeps it current — a co-member's new bill or settled tick lands on your screen without a refresh. Incoming events are batched for about half a second before the screen updates.
- Those channels are only up while you are signed in, consented, on that screen, and the app is in the foreground. Every reconnection does a full re-read, so a moment spent in the background can't leave you looking at stale numbers.
- Pull down on the Groups list, or inside a group, for a live re-read on demand. On the hub the pull is gated on being signed in and cloud-consented, so withdrawing consent really does stop the app reading from the cloud.
- Pocketbird holds no payment identifiers anywhere in Groups: no PromptPay QR, no bank-account field, and it never sends a message on your behalf. Everything it produces goes out through the iOS share sheet, where you choose the app and the recipient.
Starting a group, or joining one
A group needs a name and nothing else. Whoever creates it becomes its owner and is joined to the roster automatically, and the server mints a fresh 8-character invite code for it on the spot.
- Go to More → Groups and tap "Create Group" / "สร้างกลุ่ม" — the pill at the bottom of the list, or the same button inside the empty state.
- Optionally tap "Choose Photo" / "เลือกรูป" and pick a cover.
- Type a name under "Group Name" / "ชื่อกลุ่ม" — the placeholder is "e.g. Chiang Mai Trip" / "เช่น ทริปเชียงใหม่".
- Optionally add a "Description" / "รายละเอียด".
- Tap "Save" / "บันทึก".
Getting people in is deliberately unfussy, and every member can do it — not just the owner. Open the group, scroll to "Members" / "สมาชิก" and tap "Invite Friends" / "ชวนเพื่อน" for a sheet with a large QR code and the code printed beneath it.
- Hold the phone up and let your friend scan the QR with the stock iPhone Camera — the QR is an ordinary invite link, so iOS offers to open Pocketbird for them.
- "Share Invite Link" / "แชร์ลิงก์คำเชิญ" opens the iOS share sheet with the link plus the message "Join my group “%@” on Pocketbird — invite code %@". The code is repeated in plain text on purpose, so someone whose chat app doesn't make the link tappable can still type it in.
- "Copy Code" / "คัดลอกรหัส" puts the eight characters on the clipboard; the button turns into "Copied" / "คัดลอกแล้ว" with a checkmark for exactly two seconds, then changes back.
- The code is 8 uppercase characters, generated on the server and unique across every group. It does not rotate and cannot be regenerated from the app, so treat it as permanent: anyone holding it can join at any time.
- If the QR image can't be drawn, the sheet says so and keeps working: "Couldn't create a QR code. Share the link or code below instead." / "สร้างคิวอาร์โค้ดไม่สำเร็จ แชร์ลิงก์หรือใช้รหัสด้านล่างแทน".
- To join someone else's group, go to More → Groups → "Join with Invite Code" / "เข้าร่วมด้วยรหัสเชิญ".
- Type the code into "Invite Code" / "รหัสเชิญ", or tap "Scan QR Code" / "สแกน QR" to open the camera viewfinder.
- Tap "Join" / "เข้าร่วม" — it reads "Joining…" / "กำลังเข้าร่วม…" while it works, and swipe-to-dismiss is blocked until it finishes.
- Codes are forgiving. The field auto-capitalises every character and turns autocorrect off, and leading or trailing spaces are trimmed before it is submitted — a lowercase code pasted with a stray space still works.
- The in-app scanner reads QR only, one code at a time, and highlights what it sees. Point it at something else and it buzzes, with the hint swapping to "That's not a Pocketbird invite QR code." / "นี่ไม่ใช่ QR คำเชิญของ Pocketbird". A QR containing just the bare eight characters is accepted too.
- Camera permission is asked only on hardware that can actually scan. Denied, you get "Camera Access Needed" / "ต้องอนุญาตให้ใช้กล้องก่อน" with "Open Settings" / "เปิดการตั้งค่า", and coming back from iOS Settings re-reads the grant by itself. Where scanning isn't supported at all: "Scanning Unavailable" / "สแกนไม่ได้", with the advice to type the code instead.
- Re-entering the code of a group you are already in is harmless — the server refreshes your existing roster row instead of adding a second one, and takes the chance to update your display name.
- A shared-shop code is the same kind of code and will let you in, but that shop appears under Shop, not in the Groups hub — the Groups list only shows bill-split groups.
- Your name on a roster is never typed in a group form. It comes from your display name in Settings → "My Profile" / "โปรไฟล์ของฉัน", falling back to the part of your email before the @, then the word "Member" / "สมาชิก", clamped to 50 characters. Rename yourself there and you are renamed in every group. Members are listed oldest-joined first, so the owner sits at the top, with an "Owner" / "เจ้าของ" badge and "You" / "คุณ" on your own row.
- Someone who left or deleted their account still appears on the old bills they were part of, as "Former member" / "อดีตสมาชิก" — the record of who owed what is not rewritten when a person goes.
Splitting a bill
This is the screen the whole feature exists for. One shared bill records what it was for, how much it came to, who actually paid, and every participant's slice — and the arithmetic is done in whole satang, so the slices always add up to the total exactly.
- Open the group, scroll to "Bills" / "บิล" and tap "Split a Bill" / "หารบิล" at the bottom of the section.
- Type what it was for — "What was it for? (e.g. dinner, taxi)" / "ค่าอะไร? (เช่น มื้อเย็น แท็กซี่)".
- Enter the "Total Amount (THB)" / "ยอดรวม (บาท)".
- Flip "Add 10% service charge" / "บวกค่าบริการ 10%" and "Add 7% VAT" / "บวก VAT 7%" if the receipt had them.
- Pick the payer under "Who Paid?" / "ใครจ่าย?" — it starts on you.
- Under "Split Between" / "หารระหว่าง", switch people out of the split, or overtype any individual amount.
- Add carve-outs if only some people shared part of it.
- Leave "Log what I paid as an expense" / "บันทึกยอดที่จ่ายไปเป็นรายจ่าย" on to mirror it into your own ledger.
- Tap "Save" / "บันทึก".
The default is an equal split computed in integer satang: the total is divided by the number of participants and the leftover satang are handed out one at a time from the front of the roster, which is ordered oldest-joined first. ฿100 between three people is 33.34 / 33.33 / 33.33 — never three times 33.33 with a satang missing, and never a different arrangement on someone else's phone.
A carve-out is the one uneven move Thai groups actually make: pull the drinks out for the drinkers, the cake out for whoever ate it, and let the rest split equally. The "Carve-Outs" / "รายการแยกหาร" section shows up in the form once you have at least one participant and a non-zero amount.
- Tap "Add a Carve-Out" / "เพิ่มรายการแยกหาร".
- Name it under "What is it?" / "รายการอะไร?" — placeholder "e.g. drinks, cake" / "เช่น ค่าเหล้า เค้ก". The label is optional; leave it blank and it shows as "Shared item" / "รายการหารร่วม".
- Enter the "Amount (THB)" / "จำนวนเงิน (บาท)" — required, more than 0.
- Under "Who shares it?" / "ใครหารบ้าง?" tap everyone who had it. Nobody is selected to begin with, on purpose — a carve-out that defaulted to everyone would just be the bill again.
- Tap "Add" / "เพิ่ม".
- Each carve-out splits equally among its own people, and whatever is left over splits equally among everyone in the bill. Both legs use the same satang-exact remainder handling, so the bill still reconciles to the total.
- Swipe a carve-out row to delete it — the even split recomputes on the spot. Switching someone out of the split also removes them from every carve-out automatically.
- If the carve-outs come to more than the bill, or one of them ends up with nobody in it, Save is blocked and the footer turns red: "Carve-outs exceed the total or have no members — adjust them to save." / "รายการแยกหารเกินยอดรวม หรือไม่มีคนหาร — ปรับก่อนจึงจะบันทึกได้".
- Carve-outs are a form-time helper. What gets saved is the resulting per-person amounts, not the list of carve-outs — reopen the bill later and you see those amounts instead.
- There is no date field. A bill is stamped with the moment you save it, and editing never changes that stamp — you cannot back-date a bill, so log it while you are still at the table.
- The payer's own share is created already settled. You cannot owe yourself, so their line carries a badge instead of a tick-circle.
- The saved bill jumps to the top of the Bills list (newest first) and reaches the other members live. A row shows the title, the amount on the right, and "Paid by %@ · %@" / "จ่ายโดย %1$@ · %2$@" underneath — payer and date.
What a shared bill does to your own money
A group bill is a shared record; your own budget still needs the money that actually left your account. That is what "Log what I paid as an expense" / "บันทึกยอดที่จ่ายไปเป็นรายจ่าย" does. It is on by default, it appears only when there is something worth recording, and only while you are creating a bill — never while editing one.
- You paid the bill → a single expense for the whole amount goes into your transactions, because that is what left your account, with your own slice carried alongside as "my share". The footer says exactly that: "The full amount you paid goes to this device's transactions, since that's what left your account. Only your own share counts toward a trip's total."
- Someone else paid → the toggle reads "Log my share as an expense" / "บันทึกส่วนของฉันเป็นรายจ่าย" and records just your share, which is what you will hand over. Footer: "Adds your share to this device's transactions so budgets and safe-to-spend stay accurate."
- You paid but weren't in the split — you covered it entirely for other people → the full amount is still logged, with a ฿0 share of your own.
- You paid only for yourself → the whole thing is yours anyway, so no separate share is recorded.
- The mirrored row is written with the bill's title as its note and digital as its payment source.
Fixing or removing a bill
Bills get typed wrong: the wrong total, the wrong payer, one person who wasn't even there. Deleting and re-entering would wipe everyone's settled ticks, so the app opens the same sheet again as "Edit Bill" / "แก้ไขบิล" and keeps as much of the agreement as it honestly can.
- The form is seeded once with the exact stored amounts as per-person overrides, so what the group agreed to survives verbatim instead of being re-derived from an even split.
- Save is only offered when something has actually changed.
- Changing the payer on an edit is allowed. The bill's date and its original author are deliberately left alone.
- Members dropped from the split have their share row deleted, new members get one, and unchanged amounts are updated in place.
- To remove a bill: swipe its row and tap "Delete" / "ลบ".
- Read the dialog "Delete Bill?" / "ลบบิล?" — "Deletes “%@” and its split for everyone in the group." / "ลบ “%@” และการหารของทุกคนในกลุ่ม".
- Tap "Delete" / "ลบ".
Who owes whom, and settling up
Two different questions get two different answers here. "Who Owes Whom" / "ใครติดเงินใคร" is strictly pairwise — between you and each other person, nothing netted through anybody else. "Settle Up" / "เคลียร์ยอด" nets the whole group and tells you the fewest transfers that clear everybody at once.
- Balance rows read "%@ owes you" / "%@ ติดเงินคุณ" or "You owe %@" / "คุณติดเงิน %@", each with an arrow, so the direction never depends on colour alone. They are sorted biggest creditor first.
- Only unsettled shares count. Tick a share and it drops out of the balance at once; a person whose net comes to exactly zero disappears from the list, and the whole section is hidden when every balance is zero.
- Either side can flip a tick: the person who paid can mark it received, the person who owes can mark it paid. The app records who flipped it, and leaves that person out of the notification it sends about it.
- The checkmark fills instantly and survives a dropped refresh, because the app splices the server's own returned row straight back into the screen.
The Settle Up section appears as soon as at least one transfer is needed. Each row reads "%@ pays %@" / "%@ โอนให้ %@" with an exact amount, satang and all, because that is the figure somebody types into a bank app. The footer states the promise plainly: "The fewest transfers that clear every balance in the group." / "จำนวนครั้งโอนที่น้อยที่สุดที่เคลียร์ยอดทั้งกลุ่มได้พอดี".
- "Mark All Between You Settled" is the "we're square now" button after a single transfer. It confirms first, with the exact count: "Marks every unsettled share between you and %@ — %lld in all — as settled. You can still un-tick any single share afterwards." and a button reading "Mark %lld settled" / "ติ๊กจ่ายแล้ว %lld รายการ".
- Its scope is narrow on purpose: only bills where one of you two was the payer. A bill a third person paid is left untouched, even when it shows up in the netted plan. The count in the dialog is worked out before anything is written, so it is exact.
- Shares are ticked one at a time, so if it fails part-way the ones already ticked stay ticked and the error is reported. Everything it does can be un-ticked share by share afterwards.
- "Send a Payment Reminder" writes the awkward message for you: "Friendly reminder from “<group>” 🙏 <name>'s outstanding share is ฿X,XXX.XX — transfer whenever it suits. Thanks!" — the amount with full satang, and no deadline, no guilt.
- It hands the text to the iOS share sheet and stops there. The app never sends it, never messages anyone on a schedule, and never nudges on its own — you pick the app and the person.
- The item only appears on rows where the other person owes you — never on a row where you owe them. And there is no payment QR to attach, here or anywhere else in Groups.
The shareable recap card
At the end of a trip somebody usually types a สรุปยอด into the group chat by hand, and gets a line of it wrong. The recap is that post, generated: total spent, what is still outstanding, what the trip cost each person, and who should transfer what to whom — rendered as an image you can share.
- Open the group and tap "See group recap" / "ดูสรุปยอดกลุ่ม" — the row only appears once the group has at least one bill.
- Read the card.
- Tap "Share" / "แชร์" at the top right to send the rendered image.
- Tap "Done" / "เสร็จ" to close.
- Member lines count every share, settled or not: the per-person figure answers "what did this cost me", not "what do I still owe".
- Members with no involvement at all are left off. A roster is not a summary — only people who paid something or owed something get a line.
- A group whose bills come to ฿0 shows "Nothing to summarise yet" / "ยังไม่มีอะไรให้สรุป" with "Split a bill and the recap fills itself in." / "หารบิลสักใบ แล้วสรุปจะเติมให้เอง".
- No payment QR appears on the recap, by design — the card carries numbers and names, nothing that could be used to receive money.
Notifications, and getting out
A group is the one place in Pocketbird where other people can change your numbers, so it is the one place that pushes. Four things raise a notification, and every one of them leaves out whoever caused it.
- You are never pushed for your own action — the person who did the thing is excluded from every event, including a settle tick you flipped yourself.
- A push for the group you are currently looking at is dropped silently. No banner — the live channel already updated the row in front of you.
- Tapping a group push opens that group as a sheet with a "Done" / "เสร็จ" button. Tapped while signed out, the destination is held until you are back in. A group you have left, or one that has been deleted, lands on a "not found" screen rather than an error.
- Every word of a notification is composed on your device from the app's own translations. The server sends the event, never the language.
At the bottom of a group screen there is exactly one red button, and which one you get depends on your role. Everyone except the owner sees Leave; the owner sees Delete.
- Not the owner: "Leave Group" / "ออกจากกลุ่ม" → confirm "Leave Group?" / "ออกจากกลุ่ม?" → "Leave" / "ออก". You lose access on the next refresh and the group drops off your list.
- The owner: "Delete Group" / "ลบกลุ่ม" → "Delete Group?" / "ลบกลุ่ม?" → "Delete Permanently" / "ลบถาวร". The dialog is honest about the blast radius: "Deletes the group with all its bills and shared pockets for every member. This can't be undone."
- Leaving does not remove your shares from other people's bills, and it does not touch anything already mirrored into your own transactions. The record of who owed what stays intact for the people still in the group.
- Deleting your whole Pocketbird account does not take the group down with it: your name is replaced by a deleted-user placeholder, the shared facts stay for your co-members, and a group you own is handed to the earliest-joined member left — unless you were the only one, in which case it goes.