TableCheck vs Tabelog vs Rezabo: Selection Criteria and Cost-Structure Traps for Thai Restaurant Reservation Systems

TableCheck vs Tabelog vs Rezabo: Selection Criteria and Cost-Structure Traps for Thai Restaurant Reservation Systems
BLUF: Three products, three categories, one TCO mistake
The typical Bangkok selection error is not “which booking tool has more features.” It is a category mix-up. Tabelog (食べログ) is a Japan-only demand portal: setup and monthly fees are officially 0 yen, then dinner 200 yen and lunch 100 yen per seated cover (ex-tax) on net reservations that actually arrive. TableCheck is a reservation engine that publishes zero cover fees on own-site and social bookings, while its Thailand design is built to sync inventory with Hungry Hub prepaid packages under a separate commercial contract. Rezabo is a shop-owned ledger at 1,900 THB per month, unlimited reservations, with LINE Official Account and PromptPay dynamic QR as the primary rails. The decision fork for a Thong Lo or Phrom Phong room is whether you are buying Japanese inbound discovery, buying OTA package volume, or keeping local regulars on a list you control. Any contract whose invoice grows with covers, or whose net price is cut by a package discount, transfers more cash off the floor in the months you are busiest.
1. Operators fail first by treating three different products as peers
Headquarters in Tokyo or Osaka often instruct a Bangkok branch to “use the same reservation stack we use in Japan.” The floor is already split across LINE Official Account, phone, Google Maps, walk-in, Hungry Hub, and Instagram DMs. Adding a Japan portal or an enterprise engine on top of that stack does not create one book. It creates a second source of truth, then a Friday 20:00 private-room collision.
The three roles are distinct.
- Tabelog is a Japanese search, review, and net-reservation product for diners inside Japan. It is not a Thai floor OS. It does not surface in Thai-language discovery, does not sit on a host iPad for seating, and does not speak PromptPay. Kakaku.com’s owner pages state 75,000-plus contracted net-reservation shops as of June 2024 and more than 8.4 million monthly net-reservation users. That scale is Japanese. The multilingual inbound flow is built for visitors to Japan, not for a Sukhumvit dining room’s daily book.
- TableCheck, founded in 2011, is a reservation, CRM, waitlist, prepayment, and channel engine. Marketing pages cite 10,000-plus restaurants, 1 billion diners seated, and coverage across 35 countries and regions, including a Thailand office. On 18 June 2024 it announced a free inventory sync with Hungry Hub. Sync is not the same as Hungry Hub’s prepaid package economics. List prices are unpublished. Quotes accumulate by module: IVR, POS or PMS connectors, analytics, multi-site, implementation, and training. Third-party directories (GetApp, 2025) commonly place a starting band near USD 250 per venue per month. Treat that as a floor, not a contract.
- Rezabo is a reservation and CRM ledger. It does not ship a POS. The monthly fee is flat. Cover count does not move the invoice. Screens switch across Thai, English, and Japanese on one grid. PromptPay dynamic QR is bound to the corporate Tax ID. Booking completion is designed to finish inside LINE, which is how Thai diners already behave.
The two expectations that break shops are “if we list on Tabelog, Japanese guests will appear in Bangkok” and “if we install TableCheck, Hungry Hub and LINE become one system.” The first ignores the market. The second ignores who bills the package discount.
2. Reddit and X already document the guest friction; the floor documents the inventory problem
Public threads and host notes describe the same failure with different nouns.
TableCheck, diner side. Threads on r/JapanTravelTips repeat three complaints: the confirmation screen does not make it obvious a reservation exists; a card authorization is read as a charge; a no-show later produces what guests call a double bill. TableCheck’s diner help states that a FastPass-related 200 yen figure is a temporary authorization hold, not a reservation fee. The founder has posted on Reddit that debit cards cannot hold, so the amount posts and is later refunded. Guests treat “200 yen left my card” as proof the table is theirs. House policy (percentage capture, 24-hour window, full course charge) then disagrees. Facebook travel groups have separately argued over a 2,000 yen per person add-on that appeared in a booking flow: cover charge, or show guarantee? FastPass itself is framed as a paid skip-the-queue product, typically from 390 yen per person at opted-in shops, and the booking fee is described as non-refundable even on guest error. The amount is not the main leak. The leak is that authorization, capture, and house cancel rules are not written in the same words on the completion screen.
Later threads add a second-order problem for long-lead bookings. Some issuers re-authorize a small hold every 30 to 40 days so the card is still valid. A diner who booked two months out sees another 200 yen movement just before travel and assumes the restaurant charged again. Hosts then spend Friday night explaining a card-network behavior they do not control.
TableCheck plus Hungry Hub, operator side. After the June 2024 announcement, X traffic from travelers was positive: Japanese-language booking of Thai rooms. Official copy says Hungry Hub bookings write date, time, and guest data into TableCheck automatically, and that Hungry Hub will not accept a booking if TableCheck has no seat. Hungry Hub’s published scale at announcement was 1,400-plus partner shops, about 1 million monthly active users, more than 3 million seats sent, and more than 2 billion THB of partner revenue. Consumer apps in 2026 advertise 3,000-plus venues across Thailand, Singapore, and Malaysia. What the floor feels is heavier than “sync is free.” Hungry Hub sells prepaid fixed-price packages. Stay length and average check are not the à la carte grid. If a 90-minute package and a 120-minute à la carte booking share one chair without a stay-time rule, Friday 20:00 private rooms fill from two channels even when the engines agree on a row. Shops that keep a paper diary and manual LINE replies discover that a free sync does not stop a double book.
Tabelog inbound. r/JapanTravelTips regularly notes that the English flow and the Japanese flow are different products. The English reservation path requires a card and charges the guest a system fee of 440 yen per person (tax included, subject to revision), normally non-refundable. Shop-side per-cover fees stay at the domestic rates. Meal prepayment is not available on the inbound path; the card is for cancellation charges. Overseas media inventory (Meituan / Dianping, OpenRice, KKday) is officially limited to seat-only inventory. Course bookings and private-room-fee seats are out of scope. Free-text house notes stay in Japanese for overseas partner users; only the simple-form cancel policy is translated. A Bangkok shop that “keeps a Tabelog slot for Japanese tourists” inherits a Japan-shaped inventory object.
Guests write the brand name. The cause is that confirmation, charge timing, and inventory master are defined differently on each channel.
3. Feature comparison: what you actually buy
A list-price glance ranks Tabelog cheapest, TableCheck richest, Rezabo in the middle. Three-year TCO for a Thai shop reverses that ranking. Conversion used below is 1 JPY = 0.23 THB.
| Dimension | Tabelog net reservation | TableCheck | Rezabo |
|---|---|---|---|
| Product role | Japan demand portal and review graph | Reservation engine plus OTA inventory sync | Shop-owned reservation ledger and CRM |
| Published price | Setup 0, monthly 0. Dinner 200 yen / lunch 100 yen per arrived net-reservation cover (ex-tax) | Unpublished quote. Own site and SNS: zero cover fee (vendor claim) | 1,900 THB / month flat. No per-reservation usage fee |
| Guest-side extra | Inbound English flow: 440 yen / person (incl. tax, revised over time). Card required | Shop-set deposit or cancel fee. FastPass shops: from 390 yen. Auth vs capture is easy to misread | Shop-set PromptPay deposit or card. Dynamic QR carries the reservation ID |
| OTA / media | Overseas partners: seat-only. Course and private-room-fee seats excluded. No per-media inventory split | Hungry Hub sync announced as free. Package terms sit on Hungry Hub. Traveloka and similar sit one hop further | Own LINE / web / Google profile are primary. OTA is optional overflow |
| Customer data | Bound to portal members. Weak as a shop remarketing list | Engine CRM. Export and CRM API depend on the contract | Tenant-owned. CSV / JSON from the console |
| Thai rails | Japan card assumption. No PromptPay. Meal prepay not offered inbound | Card prepay is the default. PromptPay dynamic QR is not a published standard module | PromptPay dynamic QR as default. Non-+66 numbers route to international cards |
| Floor UI / language | Owner tools are Japanese-first. Not built for Thai hosts | 18 to 23 languages claimed across pages. LINE reply and Thai host ops remain a separate project | Thai / English / Japanese on one seating grid |
| Support and tax | Japan shop desk, weekdays 10:00 to 19:00 JST | English / Japanese primary. Thailand office claimed. Bangkok floor deployment is contractual | Bangkok team. Thai legal entity issues VAT 7% tax invoices |
| Volume ceiling | Usage fee, not a hard cap, is the constraint. Monthly contract | Seat and cover assumptions in the quote set the band | Unlimited reservation count on the ledger fee |
| Exit | Past portal bookings rarely become a shop asset. Cancel in one-month units | Confirm term, extraction fees, and format at quote time | Monthly. Full CSV export is standard |
Read the table as a map of what grows when you get busy. Tabelog’s “zero fixed cost” is a variable cost proportional to Japanese net-reservation arrivals. Official copy also states that bookings from a shop’s own site or SNS via Tabelog Note carry no usage fee. That is a Japan-site fact, not a Bangkok OS. TableCheck’s “zero cover fee” applies to branded demand. It does not erase a Hungry Hub package sold at a net price 10% to 20% below à la carte. Rezabo’s 1,900 THB is ledger rent. Payment-gateway costs (PromptPay commonly 1.65% plus VAT 7% at Thai PSPs such as Omise) sit on a different line.
4. Rate limits, inventory rules, and API constraints that belong in the contract
Sales decks say “real-time sync” and “open API.” Published and field constraints disagree. Put these rows in the due-diligence pack before legal signs.
| Constraint | Tabelog | TableCheck | Rezabo |
|---|---|---|---|
| Inventory object | Seat-only on overseas media. Course and private-room-fee seats excluded. No split inventory per partner | Hungry Hub refuses a book if TableCheck has no seat. Package stay time is not auto-separated from à la carte | One shop grid. OTA overflow is a residual pool, not a second master |
| Charge unit | Per arrived cover. Cancels are not billed. Lunch 06:00 to 15:59, dinner 16:00 to 05:59 next day | Per quote (base + modules). Guest FastPass / reservation fees are guest-paid and do not hit shop P&L | Flat monthly. PSP MDR billed by the rail |
| Guest payment rails | Card for cancel fee only. Meal prepay not available inbound | Card auth / capture / prepay. Debit often posts then refunds | PromptPay QR default 24h life on many PSPs; re-issue jobs required |
| API surface | Owner CSV and portal tools. Not a shop-facing booking API for Bangkok | Web Booking, Directory, POS, CRM, Booking, Messaging APIs. Enterprise-scoped | Webhook + REST for reservation events; LINE Messaging / LIFF as the guest path |
| Published rate limit | Portal rate limits are not a shop integration concern | Public API notes cite 10,000 requests per 5 minutes per API component (limits do not pool across components) | Burst control on webhook ingest; retries must be idempotent on reservation_id |
| Webhook semantics | N/A for Thai ledger use | Create / change / cancel can arrive twice for one external ID | Paid / confirmed / released events retry; same ID consumes one seat |
| Phone / locale | Japanese +81 numbers and alphabet names on overseas partners | Mixed +66 / 0 / spaces plus tourist PANs | Normalize to E.164 before merge; +66 vs +81 is a join key, not a display field |
| Data residency / PDPA | Overseas media receive shop detail, photos, PR text on a schedule; some copy can remain after unlink (vendor FAQ) | Confirm region of PII and extraction rights. Thai PDPA outbound transfer notice is the shop’s duty | Thai tenant. Shop is the controller for phone, allergy, and visit history |
Three traps sit inside that matrix.
“Sync is free” is a record statement. It is not a stay-time statement. A host who closes a slot inside the Hungry Hub console can desync the engine master. Official guidance is: if TableCheck has no seat, Hungry Hub will not take the book. The inverse (host edits Hungry Hub first) is how Friday rooms collide.
10,000 requests / 5 minutes per component is generous for a single shop and tight for a naive multi-site poller that refreshes every table every 5 seconds. Limits do not pool. A CRM extract job that shares a window with a booking poller will 429 one of them. Handle Retry-After. Do not retry create.
Tabelog overseas inventory cannot carry a tasting-menu private room. If that room is the product you sell to Japanese visitors, the portal object is the wrong type. Putting it there and also taking LINE bookings is a designed collision.
5. Pricing-plan traps: zero fixed, zero cover, flat monthly
Tabelog: 200 yen looks cheap only inside Japan, and only until volume arrives
Official billing is “people who net-reserved and actually arrived.” Cancels are not charged. Daypart is by clock, not by menu. A Japan shop with 300 dinner net-reservation arrivals in a month pays 60,000 yen ex-tax (about 13,800 THB). Add lunch and the line grows. Inbound guests pay 440 yen themselves, so shop-side usage stays at the domestic rate, but completion falls because the guest sees “440 yen to book” before any food. Meal prepay still does not exist on that path.
For a Thai shop the real trap is scope, not the yen figure. Tabelog does not reach Thai search, LINE, PromptPay, or a Thai host’s seating grid. Contracting it as an inbound tap still fails if you place the Bangkok master book on Tabelog. Phone and LINE then double-write the same chair. You also cannot partition inventory by overseas partner.
Kakaku.com’s owner FAQ is explicit: monthly contract, cancel in one-month units, no usage fee on no-shows, and no extra fees beyond the per-arrival rate (PR products are a separate SKU). Those are clean Japan-portal terms. They are not a reason to park Thong Lo Saturday inventory on a Japanese review graph.
TableCheck: unpublished quotes are themselves a cost structure
The join site starts at “request a demo.” Own homepage and SNS bookings are documented as zero cover fee and zero extra setup fee. Read in isolation, that sounds like a usage-free engine. Field quotes grow on other rows:
- Monthly base that moves with seats, sites, and modules
- IVR, POS / PMS, analytics, EDM
- Implementation, training, historical book migration
- Hungry Hub (and downstream Traveloka / KKday) package discounts and prepaid conditions, which survive a free sync
OTA effective cost rarely appears as “50 THB per reservation.” It appears as 10% to 20% of sale price given away up front as a fixed-price package. At 400 package covers a month, 1,800 THB average check, and a 15% net-price giveaway, 108,000 THB a month leaves through the price list. That is an order of magnitude above most engine retainers.
Guest FastPass and reservation fees do not land in the shop till. From 390 yen disappears as guest spend. If the completion screen and the cancel policy do not use the same Thai / English / Japanese words for authorization versus capture, Friday night hosts inherit the Reddit “double charge” ticket.
Rezabo: the flat fee has a perimeter. Do not pretend it does not
1,900 THB buys an unlimited-count ledger and CRM. It does not buy PSP MDR, an existing LINE Official Account message pack, or Google Business Profile labor. It does not replace Wongnai POS or Ocha. Sales matching is an integration design, not a checkbox. The economic point of the flat fee is that Friday and Saturday volume does not raise software OPEX. Rezabo does not sell covers. If you need to buy covers, that budget is advertising or OTA, and it must stay on its own line.
6. Three-year TCO for a 40-seat Thong Lo room
Assumptions: 40 seats. 1,000 monthly covers that originate online (400 OTA package, 600 own LINE / web). Average check 1,800 THB. Food cost 38%. FX 1 JPY = 0.23 THB. Figures are a synthesis of published rates and operator quotes, not a vendor invoice.
| Annual cost line | Tabelog kept for “Japanese guests,” local book on paper + LINE | TableCheck + Hungry Hub as the spine | Rezabo flat + own LINE as the spine |
|---|---|---|---|
| Ledger / engine | 0 locally. Tabelog usage only in months Japan-side demand lands. 300 dinner arrivals ≈ 16,600 THB / year equivalent | Base + options. Field band often 100,000 to 300,000 THB / year | 19,000 THB (annual plan, 2 months free) |
| Demand / discount | 200 yen / arrived dinner cover. Overseas partners bill the same usage. House notes do not render for those users | 400 × 1,800 × 15% × 12 ≈ 1,296,000 THB | Own rails 0. Ads optional |
| Payments | Card assumption. No PromptPay. Meal prepay unavailable | Card ~3% plus VAT. Thai completion drops first | PromptPay MDR on deposits only |
| Reconciliation labor | LINE and paper transcription. Peak labor is the real cost | Sync reduces re-key. Package vs à la carte design remains | One grid. Exceptions only |
| Guest list | Portal-side. Weak for shop resale | Inside the engine. Extract terms are contractual | Shop-owned. LINE segments |
| 3-year shape | Portal usage + local collisions and no-shows dominate | Package discount above 1M THB / year dominates | Ledger 126,000 THB + rails. Discount shrinks as own mix rises |
The breakpoint is blunt. While 400 OTA package covers persist, negotiating the engine retainer is a sideshow. The 1.3 million THB discount line is the TCO. Move own LINE / web from 600 to 850 covers and OTA from 400 to 150, and the discount falls to about 486,000 THB a year. The 810,000 THB gap is internal cash that can buy product or ads. Tabelog usage is a coherent Japan-shop expense. It is not a coherent price for custody of a Bangkok seat grid.
Three years matters because year one carries migration labor and year two is when OTA mix actually falls. Usage fees and package discounts scale with success. A flat ledger does not. A strong year makes the first two structures worse.
Unit economics the quote pack usually hides
Food cost does not shrink when the package price shrinks. On a 1,800 THB à la carte cover at 38% food cost, contribution is 1,116 THB. The same cover sold as a 1,530 THB prepaid package still consumes 684 THB of product. Contribution falls to 846 THB. The 270 THB gap times 400 covers is 108,000 THB a month, identical to the list-price giveaway, except it now sits inside contribution rather than “marketing.” A Friday four-top that would have paid 7,200 THB à la carte and instead arrives on a 6,120 THB package has already transferred 1,080 THB before the first plate leaves the pass.
Stay time compounds the same math. A 90-minute Hungry Hub package parked on a 120-minute à la carte chair wastes 30 minutes of inventory you already discounted. Two turns of a 90-minute package on a correctly split grid can beat one discounted 120-minute hold. Two channels writing the same 120-minute object cannot.
| Mix scenario (1,000 online covers / month) | OTA package covers | Own LINE / web | Annual package giveaway at 15% | 3-year giveaway if mix is held |
|---|---|---|---|---|
| Current (engine + OTA spine) | 400 | 600 | 1,296,000 THB | 3,888,000 THB |
| Year-2 shift | 250 | 750 | 810,000 THB | n/a (transition year) |
| Own-rail majority | 150 | 850 | 486,000 THB | 1,458,000 THB if held from year 1 |
The software line is not the decision. The mix line is. A shop that signs a three-year engine term and keeps 400 package covers “because the book looks full” finances the vendor and the OTA with contribution that never reaches the pass.
What the tax invoice actually looks like
Finance will ask this before legal does. A Japan-entity engine or portal invoice often arrives in JPY or USD, then Thai WHT 3% on cross-border services and VAT treatment split across lines. Rezabo’s Thai entity issues a monthly full tax invoice at VAT 7% against a Thai Tax ID. PromptPay MDR arrives on a separate PSP statement (Omise, Xendit, or the acquiring bank). Do not let those three documents collapse into “the reservation fee.” One is software. One is withholding. One is card or QR processing. Mixing them is how a 1,900 THB ledger is compared, incorrectly, to a 250 USD engine that still leaves the 108,000 THB package hole untouched.
7. Operational traps and edge cases that do not appear on the pricing page
Worked collision, Friday 19:50, private room P1 (four-top):
- 14:10. A LINE guest books P1 at 19:30, stay 120 minutes, à la carte. The host writes it in the paper diary and confirms in chat. The engine or Hungry Hub console is not updated.
- 16:40. A Japanese visitor books the same P1 at 20:00 through Hungry Hub as a 90-minute prepaid package. TableCheck (if it is master and still shows open) accepts. Hungry Hub takes payment.
- 19:50. Both parties are in the lobby. The package guest has a prepaid voucher. The LINE guest has a chat screenshot. The room cannot split.
Sync would have stopped step 2 only if step 1 had consumed the engine seat. Paper plus chat as a third master turns every API into a contradiction detector. The SOP is not “buy a better sync.” The SOP is “one screen owns P1.”
Write these into the quote pack and the floor SOP
- Minutes that only record “zero cover fee.” Own-site zero and Hungry Hub net price are different rows. Force a channel table: discount rate, prepaid or not, and what the shop keeps on a guest cancel.
- Tabelog as the Bangkok master. Overseas inventory is seat-only. Course and private-room-fee seats are excluded. House notes do not show to overseas users. A Friday tasting-menu room on that object will collide with local LINE.
- Free sync interpreted as one inventory. Record sync stops double keying. A 90-minute package on a 120-minute à la carte chair still breaks rotation. Closing inventory inside Hungry Hub rather than the engine master creates a silent hole.
- Cancel-charge definition. Tabelog bills arrivals, not cancels. TableCheck may release an auth or capture a penalty. Debit looks like a sale. Reddit “double charge” posts start here.
- Raising Thai mix on a card-auth flow. Tourists complete. Locals look for a bank-app QR first. Falling back to a static shop QR plus a LINE slip photo recreates peak-hour reconciliation labor.
- CRM extract fees and term. “We have a CRM” is not “on exit we receive phone, visit history, and allergy in a documented schema.” PDPA makes the shop the controller. Put export format and fee in the contract.
- Buying IVR + POS + CRM + Messaging in year one. Those APIs exist on TableCheck’s enterprise surface. Integration cost and test hours land before Friday 19:00 gets safer. Independent Bangkok rooms usually stabilize LINE, the seating grid, and deposits on weekend private rooms first.
- 24-hour PromptPay QR on a 14-day booking. Many Thai PSPs expire a QR at 24 hours and cannot extend it. A charge created at booking time is dead 13 days before service. Re-issue at T-72h and T-24h, or hosts return to chasing slips.
- Omise amounts in satang. 1,000 THB is
100000. Send1000and you issued 10 THB, or you failed the 20 THB minimum. This is the most common first-week production incident on Thai PromptPay. - Omise / Xendit refund holes. Several Thai PromptPay channels cannot void or refund through the same API that collected the deposit. An in-policy cancel at 16:00 then becomes an outbound transfer. Write that path into the SOP before the first Friday.
- Long-lead card re-authorization. A 200 yen hold that reappears 30 to 40 days later is not a second reservation fee. Train hosts on the diner-help language, or the ticket lands on the floor in Japanese, English, and Thai at once.
8. Technical snippets: treat inventory, money, and identity as one transaction
OTA-connected stacks need a single inventory master decided on day one. If TableCheck is master, Hungry Hub may only write through the engine. If a LINE ledger is master, OTA is a residual pool with its own stay-time. Paper plus chat as a third master turns every API into a contradiction detector.
Webhook handlers must be idempotent. TableCheck Messaging and booking events can deliver create / change / cancel twice for one external ID. A ledger that is not keyed on that ID will seat two parties on one four-top. Verify the signature, persist the raw body, then project stay time onto the grid.
type Channel = "tablecheck" | "hungry_hub" | "tabelog" | "line" | "walkin";
interface ReservationEvent {
external_id: string;
channel: Channel;
party_size: number;
start_at: string; // ISO-8601, Asia/Bangkok
stay_minutes: number;
phone_e164: string;
status: "held" | "confirmed" | "cancelled" | "no_show";
}
const seen = new Set<string>();
export function applyReservationEvent(evt: ReservationEvent): "applied" | "duplicate" {
const key = `${evt.channel}:${evt.external_id}`;
if (seen.has(key)) return "duplicate";
seen.add(key);
// consume exactly one inventory interval [start_at, start_at + stay_minutes)
return "applied";
}
export function toSatang(thb: number): number {
const satang = Math.round(thb * 100);
if (satang < 2_000 || satang > 15_000_000) {
throw new Error(`PromptPay ${satang} satang outside Omise 20-150,000 THB`);
}
return satang;
}
export function normalizeThPhone(raw: string): string {
const digits = raw.replace(/\D/g, "");
if (digits.startsWith("66") && digits.length === 11) return `+${digits}`;
if (digits.startsWith("0") && digits.length === 10) return `+66${digits.slice(1)}`;
if (digits.startsWith("81")) return `+${digits}`;
throw new Error(`unjoinable phone: ${raw}`);
}
A Hungry Hub (or TableCheck) webhook payload should be stored raw before it is projected onto the grid. Projection is where stay time is applied. Do not infer 120 minutes because that is how the à la carte book works.
{
"id": "evt_8f2c1a",
"type": "reservation.created",
"data": {
"external_id": "HH-240819-88921",
"channel": "hungry_hub",
"party_size": 4,
"start_at": "2026-08-21T20:00:00+07:00",
"stay_minutes": 90,
"package_net_thb": 6120,
"phone": "0812345678",
"status": "confirmed"
}
}
Collision detection is a SQL constraint, not a host habit. Overlapping intervals on the same chair must fail closed. A gist exclusion constraint is stronger than a SELECT you remember to run.
/* Reject a second booking that overlaps an occupied interval on the same table. */
CREATE EXTENSION IF NOT EXISTS btree_gist;
ALTER TABLE reservations
ADD CONSTRAINT reservations_no_overlap
EXCLUDE USING gist (
table_id WITH =,
tstzrange(
start_at,
start_at + (stay_minutes * INTERVAL '1 minute'),
'[)'
) WITH &&
)
WHERE (status IN ('held', 'confirmed'));
SELECT r.id
FROM reservations r
WHERE r.table_id = :table_id
AND r.status IN ('held', 'confirmed')
AND tstzrange(r.start_at, r.start_at + (r.stay_minutes || ' minutes')::interval, '[)')
&& tstzrange(:start_at, :start_at + (:stay_minutes || ' minutes')::interval, '[)');
Availability for a LIFF seat picker should be a single query surface, not a fan-out to three vendors at tap time. A thin GraphQL wrapper keeps the host iPad and the LINE client on the same truth. Confirming a deposit must mutate the same object the availability query just read.
query FridayPrime($shopId: ID!, $from: DateTime!, $to: DateTime!) {
availability(shopId: $shopId, from: $from, to: $to) {
tableId
stayMinutes
channelQuota { channel remaining }
depositRequired
}
}
mutation ConfirmDeposit($reservationId: ID!, $pspChargeId: ID!) {
confirmDeposit(reservationId: $reservationId, pspChargeId: $pspChargeId) {
status
tableId
paidSatang
}
}
Phone numbers arrive as 081-234-5678, 0812345678, +66812345678, and the occasional +81. Collapse to E.164 (+66812345678) before CRM merge or one regular becomes three profiles and the no-show history vanishes. Join Japanese inbound guests to local regulars on the phone field, not the name field. Tabelog’s own FAQ notes that overseas-partner guest names arrive in alphabet.
LINE is the Thai completion surface. An email-first engine produces a second step: Thai hosts ask guests to screenshot a booking number into the OA. TableCheck’s Messaging API replaces in-product SMS. It is not a LIFF seat picker on your Rich Menu. Budget that work explicitly, or the “unified engine” still ends in chat.
If personal data lives in Japan or a third country, Thai PDPA outbound-transfer notice is the shop’s problem, not the vendor’s slide. Confirm that diner phones and visit history are not licensed into a portal’s ads for nearby competitors. Tabelog’s overseas partners receive shop detail, photos, and PR copy on a schedule, and vendor FAQ language allows some of that copy to remain after unlink. A list you cannot extract is not a shop asset.
9. Selection criteria by venue type
- Japan-return popup, 90 days or less. Tabelog can still buy awareness in Japan. Do not place the Bangkok grid on Tabelog. Keep one local master (LINE ledger or paper, not both). Do not push tasting-menu private rooms onto overseas media inventory.
- Hotel F&B, multi-site, heavy concierge phone. TableCheck IVR and channel fabric earn their keep at this scale. Put POS / PMS and Booking APIs inside the contracted scope. Still split Hungry Hub stay time, and still print the “zero cover fee” perimeter as a table on the quote.
- Independent or 2 to 5 site Japanese / Thai local, LINE already above 70% of books. A flat ledger stops TCO from tracking covers. Use OTA only to fill leftover inventory. Put PromptPay or card deposits on Friday-Saturday prime and on private rooms, not on every lunch two-top.
- Sukhumvit rooms with an extreme Japanese tourist mix. Japanese-language booking via TableCheck is real demand-side convenience. Without a path that moves a first-time guest onto LINE (table QR, next-visit offer), the second visit returns through the discounted package.
The selection question is not “which product has more modules.” It is “when next month’s covers rise, which invoice line rises, and whose server keeps the phone number.”
10. A 14-day cutover that does not stop service
- Day 1: name the master. GM and floor lead lock which screen owns Friday-Saturday private rooms and the counter.
- Days 2 to 3: extract. Phone, name, allergy, visit count, and unconsumed future books. If TableCheck or the portal cannot emit a standard file, cut a manual reconciliation list for futures only. CRM API rights are a contract line, not a hope.
- Days 4 to 10: dual run. Load futures into the new ledger. Swap Google Business Profile, Instagram, official site, and LINE Rich Menu URLs. Cut OTA inventory to overflow only.
- Days 11 to 12: narrow deposits. Do not deposit every seat. Private rooms, parties of six-plus, and high-check courses only.
- Days 13 to 14: kill the old usage line. Confirm futures are empty on the old book, or fully present on the new one, then stop. A Tabelog listing may remain as a Japan inquiry page with inventory set to “inquire.” Net-reservation inventory must close. Tabelog cancels in one-month units.
Cutover incidents cluster in two weeks: the week old URLs still resolve, and the week OTA still holds prime time after the new ledger is declared master. Pick one master. Do not run two.
11. Questions owners actually ask
Q1. Should we switch Tabelog off entirely?
For a Japan domestic shop, that is a different paper. For a Bangkok daily book, do not use it as master. If you keep a listing as a Japan inquiry window, set inventory to inquire-only and confirm only on the local ledger. Check that seat-only overseas-media sync cannot collide with local LINE.
Q2. Is TableCheck’s zero cover fee false?
Read it as a claim limited to branded demand. Hungry Hub package economics are a separate contract. Ask for a channel-by-channel effective-cost table. Free sync is a record statement, not a discount-rate statement.
Q3. Does Rezabo send guests?
No. Scope is own LINE and web completion, seating, deposits, and list ownership. If you have a budget to buy covers, that is ads or OTA. Do not mix it into the ledger retainer.
Q4. Do advance bookings vanish at cutover?
Import every field the old system will emit. Hand-reconcile the rest before go-live. Private rooms that span the cutover weekend should be closed on both books for that window.
Q5. Can we get a Thai tax invoice?
Rezabo’s Thai entity issues a monthly full tax invoice at VAT 7%. Japan-headquartered engines and portals often split WHT 3% and VAT treatment across invoice lines. Show finance the sample bill before you sign.
Q6. Can we keep Hungry Hub and still own the book?
Yes, if Hungry Hub is overflow and the local ledger is master. Residual inventory only. Separate stay-time. Never close a slot in the Hungry Hub console first. Measure monthly package covers as a cost line, not as a vanity “booked” number.
Closing
Putting TableCheck, Tabelog, and Rezabo on one comparison table is a useful starting point. The decision requires splitting categories. Tabelog is a Japan demand portal: zero fixed cost in exchange for a per-arrival usage fee, and it is not a Thai floor OS. TableCheck is a channel engine: own-site zero cover fee and Hungry Hub package discounts are different ledgers. Rezabo is a flat, shop-owned book built around LINE and PromptPay. It does not sell covers.
For independent Bangkok rooms and small groups, the first costs to stop are usage fees and package discounts that scale with a good month. Name one inventory master. Deposit only the expensive weekend inventory. Keep regulars on your LINE Official Account. Use OTA as overflow. Read quotes as a three-year, channel-split TCO, not as a single monthly line.
Share this month’s cover mix (LINE, phone, Hungry Hub, walk-in) and the Bangkok team can price the usage and discount lines against a flat ledger.
Bangkok Restaurant No-Show Prevention Checklist (15 Rules)
An operational field guide for dining venues in Thailand: sync kitchen prep strictly with dynamic PromptPay QR deposits and automated LINE reminders to eliminate food waste.
- Strict synchronization of Friday 16:00 kitchen prep with paid bookings only
- Dynamic QR verification replacing static slip matching and slip forgery
- High-retention refund deadline rules and seamless tourist card routing
Delivered instantly via LINE Official Account (Instant 3-sec access)