What a recurring rule is
Some money moves on a schedule you already know: rent on the 5th, the phone bill mid-month, salary at the end of it. Re-typing those every period is the quickest way to stop using a budgeting app at all.
A recurring rule is you telling the app the schedule once. After that the app writes the transaction itself, on the day the money actually moves — not in advance, and not as a plan you still have to action.
- A fixed rule posts the exact amount every period, automatically — "Posts this exact amount automatically every period." / "บันทึกจำนวนเงินนี้โดยอัตโนมัติทุกงวด"
- A variable rule is a reminder instead: on the due day it holds the occurrence until you type what you were really charged. That's the one for electricity, water and phone bills.
- A transfer rule moves money between two of your own accounts every period. It never counts as income or expense, and never touches budgets or Safe-to-Spend.
- Any single occurrence can be skipped, moved to a later day, or given a one-off amount without disturbing the rest of the series.
Creating a rule
Tap "+" in the Recurring nav bar — or the empty state's "Add Recurring Transaction" / "รายการประจำใหม่" button. The form opens as a sheet at half height; drag it up for the full form. Nothing posts when you save: the first transaction appears when the first occurrence comes due.
- Pick the "Type" / "ประเภท" segment — Expense, Income or Transfer.
- Enter the amount.
- Set the repeat pattern and the "Next Occurrence" / "เริ่มงวดถัดไป" date — that date is the anchor for the whole schedule.
- Add whatever optional links you want — category, person, account, tags, subscription details.
- Tap "Save" / "บันทึก".
Everything below the schedule is optional, and it exists so the posted transaction comes out already filed — you never have to go back and categorize it.
Reading the list
The Recurring tab is sorted by what happens next, not by when you created things. Each row tells you one thing above all: the date the money will actually move.
- The second line reads "<cadence> · Next <date>". That date already has skipped occurrences walked past, and any weekend, holiday or snooze move applied — it is not the raw schedule slot.
- The third line, when it has something to say, is the countdown — "Today" / "วันนี้", "Tomorrow" / "พรุ่งนี้", "in N days" / "อีก N วัน", "Overdue" / "เลยกำหนด" — and the account chip. The countdown counts start-of-day to start-of-day, so 23:00 tonight to 01:00 tomorrow reads as one day, not zero.
- A variable rule's amount is prefixed with ~, and a paused or ended rule's whole row renders at half opacity.
- Only the next charge is ever shown. There is no list of future occurrences anywhere in the app.
- Rows are grouped into "This week" / "สัปดาห์นี้" (7 days away or fewer, including anything overdue), "This month" / "เดือนนี้" (8 to 31 days), "Later" / "ต่อไป" (more than 31 days), and "Paused" / "หยุดชั่วคราว", which always sits last and shows no total.
- A section header's figure is the sum of each rule's next charge only — income positive, expense negative, transfers counted as ฿0. A yearly rule counts once at its full amount, not at a monthly equivalent.
- Sections only appear under the default sort with the search box empty. Any other sort, or an active search, gives a flat list.
- Pull the list down slightly to reveal "Search Recurring" / "ค้นหารายการประจำ"; it matches the rule's note, or its category name when the note is empty. Swipe a row left and confirm to delete the rule — the transactions it already posted stay in your ledger, and only its own adjustments go with it.
When the transactions actually get written
Posting happens when you open the app, and every time you switch back to it. There is no background posting — if the phone never opens Pocketbird, nothing is written. Everything due since your last visit is caught up in that moment.
- Only live, active, non-paused rules post. A fixed rule writes its exact amount, already stamped with the account, pocket, tags, debt link and person you set.
- Catch-up is capped at 12 posted occurrences per rule per app-open. Anything older is fast-forwarded silently — the schedule advances, no rows are written — so coming back after a long absence can't dump a wall of transactions on you. In practice only a daily rule ever reaches this.
- Double posting is impossible. Each occurrence gets an id derived from the rule and the day, so two devices, a repeated pass or a sync-then-regenerate all land on the same single row.
- A transaction you deleted never comes back. The duplicate check deliberately counts deleted rows too, so removing an auto-posted charge is final.
- If you delete the category a rule uses, the rule keeps working — the charges simply post uncategorized. A missing category never pauses a rule.
- Reaching the end date or the occurrence count switches the rule to "Inactive" / "ปิดอยู่" so it can never post again. Only posted occurrences count toward "After N times" — a skipped one does not use up the budget.
- Once an announced price-change date has passed, the new amount is folded into the rule itself and the pending pair disappears from the detail screen. You don't have to go back and edit anything.
Weekends and holidays
Banks and employers don't move money on a Sunday. Salary usually arrives the working day before; a bank charge usually lands the working day after. Each rule can be told which of those it is, so the date in the app matches the date on your statement.
- A weekend is always Saturday and Sunday here, whatever your phone's first-day-of-week setting says.
- A holiday means a day in your own holiday list — nothing else is consulted when the charge posts.
- The walk gives up after 30 days and falls back to the raw scheduled day, so a pathological run of holidays can never lose a charge.
- The schedule itself never moves — only the posted date does. That's why two devices always agree on which occurrence is which.
- The shift carries through to the bill reminder (the lead time counts back from the shifted date) and to the Safe-to-Spend forecast, where a "Move earlier" rule sitting just past the cycle end can be pulled back inside it.
Your holiday list lives at Settings → "Profile & Budget Cycle" / "โปรไฟล์ & รอบงบ" → "Holidays" / "วันหยุด". It has two sections: "Repeats Every Year" / "ทุกปี" and "Specific Dates" / "วันที่เจาะจง". Tap "+" to add one, tap a row to edit it, swipe a row left to delete it.
Changing one occurrence
Months are not identical. You paid the gym in cash this once, the landlord asked you to wait a week, you cancelled a delivery for one cycle. All three are one-occurrence changes, and none of them should mean editing the rule.
- "Skip Next Occurrence" / "ข้ามครั้งถัดไป" removes exactly one charge. The date jumps to the occurrence after it and the row wears a quiet "Skipped" / "ข้าม" badge so the jump doesn't read as "it already posted". The skipped charge drops out of the forecast and its reminder, and it does not use up an "After N times" slot.
- "Snooze Next" / "เลื่อนครั้งถัดไป" moves one charge later by exactly "1 Day" / "1 วัน", "3 Days" / "3 วัน" or "1 Week" / "1 สัปดาห์". The row wears "Moved" / "เลื่อน" and the detail screen shows what it was moved from. The series carries on unchanged afterwards.
- "Pause" / "หยุดชั่วคราว" freezes the whole rule: nothing posts, it leaves the forecast and the subscription totals, and its reminders stop. "Resume" / "ทำต่อ" picks it back up — see the note below about what resuming does not do.
- Skips, moves and one-off amounts all land in an "Adjustments" / "การปรับแก้" log at the bottom of the rule's detail screen, newest first. The section appears only once you've adjusted something, and it is read-only.
- An ended rule offers no Pause, Skip or Snooze at all — those only render for an active rule. You can still edit or delete it.
Editing an existing rule always ends with a choice. Tap "Save" / "บันทึก" and a dialog asks "Apply Changes To" / "ใช้การแก้ไขกับ" — "This Occurrence Only" / "เฉพาะครั้งนี้" or "All Future Occurrences" / "ครั้งนี้และครั้งต่อๆ ไป". It appears on every edit; there is no "don't ask again".
Variable bills and reminders
An electricity bill is on a schedule but not on a fixed amount. Auto-posting a guess would quietly corrupt your totals, so a variable rule does the opposite: it holds the occurrence, tells you it is due, and posts only the number you confirm.
- Create the rule with "Variable amount (confirm each bill)" / "จำนวนเงินไม่คงที่ (ยืนยันแต่ละบิล)" on, and put your best guess in the amount field.
- Optionally set "Usually at least" / "ปกติอย่างน้อย" and "Usually at most" / "ปกติไม่เกิน" — the range sharpens the forecast and flags an unusual bill.
- On the due day the row stops advancing and shows "Tap to confirm" / "แตะเพื่อยืนยัน".
- Open the rule and tap the banner "Bill due — confirm the amount" / "ถึงกำหนดชำระ — ยืนยันยอด" — or long-press the row and choose "Confirm Bill" / "ยืนยันบิล", or tap the notification.
- Type the real amount and tap "Confirm" / "ยืนยัน".
- The Confirm Bill sheet pre-fills your estimate, shows it again on a read-only "Estimate" / "ประมาณการ" row, and shows "Usually" / "ปกติ" with your range. Type something outside that range and a calm line appears — "That's outside this bill's usual range — double-check before confirming." — but it never blocks you.
- Confirming is idempotent — a double tap, or the same confirm on a second device, still produces exactly one transaction. The amount must be above 0.
- The confirmed transaction is dated on the schedule slot, not on the shifted or snoozed date — and the sheet's due line shows that same raw slot.
- In the Safe-to-Spend forecast a variable rule with a range counts at the midpoint of that range, and without one at your estimate. The rule detail's per-month and per-year figures use the estimate too, and say so.
- A transfer rule can never be variable — the toggle is hidden for transfers and the flag is ignored.
Bill reminders are a separate switch, and it ships off. Turn on "Bill-Due Reminder" / "เตือนบิลครบกำหนด" at Settings → "Profile & Budget Cycle" / "โปรไฟล์ & รอบงบ". You also need to have already granted notification permission — this screen never asks for it.
- Reminders fire at 09:00, titled "Bill due 💸" / "บิลครบกำหนด 💸". Only expense rules produce one — never income, never transfers.
- The default lead is one day before a fixed charge posts, or on the day itself for a variable bill. Set your own lead per rule with Remind me.
- The lead counts back from the day the money really moves, so a weekend or holiday shift and any snooze move the reminder too. A skipped occurrence never pings on its old date — the reminder re-arms on the next occurrence that will really happen.
- Tapping a variable bill's notification opens the Confirm Bill sheet directly — even from a cold launch, after you pass the login screen. If the occurrence was skipped, snoozed or deleted in the meantime, the tap is dropped silently rather than opening a sheet for a bill that isn't due.
- A rule with a free-trial end date also gets its own "Free trial ending ⏰" / "ช่วงทดลองใช้ฟรีใกล้หมด ⏰" notification two days before, telling you to cancel now if you don't want to be charged.
- Reminders are re-armed at launch, on every return to the app, and right after you pause, skip, snooze or delete a rule. If the app is never opened, nothing new gets scheduled.
Bills the app spots for you
Most people don't set up a rule for a subscription — they just keep paying it. So the app reads your own ledger for charges that repeat on a steady schedule and offers to turn one into a rule, already filled in.
- Open the Summary tab, then "Insights" / "ข้อมูลเชิงลึก" in the toolbar.
- In "Highlights" / "ไฮไลต์", look for the card "Looks like a recurring bill" / "น่าจะเป็นรายจ่ายประจำ".
- Tap it. The Add Recurring Transaction form opens pre-filled with the detected amount, name, category, person, cadence and next expected date.
- Adjust anything you like and save. Nothing is created until you do.
- It looks back 400 days, over your personal expenses only, and ignores any transaction a recurring rule generated.
- It needs at least 3 charges to the same merchant, several charges on one day counting as one.
- Every amount must sit within 15% of the median, or ฿15, whichever is larger — and every gap between charges within 25% of the median gap, or 4 days, whichever is larger.
- The median gap must land in a recognised window: 5–10 days reads as weekly, 12–18 as every two weeks, 24–38 as monthly, 52–70 as every two months, 80–100 as every three months. A rhythm in between — 20 days, say — is deliberately not classified.
- The pattern must still be alive: the last charge no longer ago than 1.6 times the median gap.
- The suggested amount is the median, not the average, so one odd month can't skew it, and the suggested category is the one that appeared most often. Suggestions are ranked priciest first.
- A suggestion is dropped when an active expense rule already covers that merchant, or already has the same category and a near-equal amount.
Where recurring money shows up elsewhere
- Safe-to-Spend and the widget subtract every recurring expense occurrence still landing between today and the end of your budget cycle — that is how a bill you haven't paid yet stops looking like money you can spend.
- Paused rules, income rules and transfer rules are never subtracted, occurrences that already posted are excluded, a skipped one drops out, and a snoozed one counts on its moved date. A one-off amount override is used in place of the rule's amount.
- In Insights, tapping a row in the subscriptions breakdown or in "Upcoming This Cycle" / "ที่จะถึงในรอบนี้" opens that rule's edit sheet directly, skipping the detail screen.
- Rules, your per-occurrence adjustments and your holidays all sync to your account, so a skip on your phone is a skip on your iPad. Your sort choice and your dismissed insight cards stay on the device that made them.
- Pull down on the Recurring list, a rule's detail screen or the Holidays list to force a real push-then-pull sync — the spinner is held until the round trip finishes.
- The data export carries your rules, their adjustments and your holidays, and every transaction row in the CSV has a recurring column holding the note of the rule that created it — empty for anything you typed yourself.