Booking SaaS / Tooling
Wide Book Admin (Wideview)
Web panel + iOS/Android app + custom Booking Bridge για 4 booking sites
4-layer sync (events ↔ calendar metadata ↔ ACF ↔ theme) σε jktours, daycruiseparga, sivota, brown
Challenge
Τι έπρεπε να λυθεί
Τα 4 booking sites χρησιμοποιούσαν off-the-shelf booking plugin που είναι δυνατό αλλά δε διαθέτει unified API ή mobile interface. Οι owners (4 διαφορετικές επιχειρήσεις τουρισμού) έπρεπε να μπαίνουν σε WP admin κάθε φορά για να δουν κρατήσεις, αλλά WP admin σε mobile είναι αδύνατο να χρησιμοποιηθεί. Επίσης, αν άλλαζε στοιχείο σε ένα event από το mobile ή το panel, ο κώδικας του booking plugin γράφει direct SQL χωρίς να τρέχει WordPress hooks, οπότε το theme display + ACF fields έμεναν stale και ο customer έβλεπε λάθος τιμή.
Solution
Τι χτίσαμε
Custom δικό μας Booking Bridge plugin (current v1.14.1) που εκθέτει events + calendars + customers + bookings σε REST API με per-site API keys. Theme-side, helpers διαβάζουν direct από booking plugin tables (single source of truth) + REST hook στο `rest_post_dispatch` που τρέχει 4-layer sync σε κάθε Bridge write. Web panel + mobile app πάνω από αυτό το API, με unified dashboard για όλες τις κρατήσεις των 4 sites σε ένα login.
Custom Modules
Τι το κάνει διαφορετικό
Custom Booking Bridge plugin v1.14.1
PHP plugin εγκατεστημένο σε κάθε site. REST endpoints με per-site API keys (WP Application Passwords). Bridge λειτουργεί ως translation layer: booking-plugin internals (που αλλάζουν σε plugin updates) σε stable contract που panel + mobile app χτυπάνε χωρίς να σπάει. Cache TTLs ανά endpoint, single 500ms retry σε transient 502/504, cache-warm cron κάθε 2 λεπτά.
4-layer sync (events ↔ cal_meta ↔ ACF ↔ theme)
Όταν admin/mobile/panel αλλάζει price σε ένα event, REST hook συγχρονίζει: (1) booking-plugin events table, (2) calendar metadata `default_price`, (3) ACF fields στο vehicle/room CPT (preserving package ratios per season), (4) theme cache invalidation (LiteSpeed + WP + optional Cloudflare). Καμία γραμμή χάνεται. Pattern documented ως reusable για όποιο μελλοντικό booking site.
Web panel σε Next.js (unified 4 sites)
Όλες οι κρατήσεις από jktours + daycruiseparga + sivotaluxurycollection + brownsivota σε ένα dashboard. Filter ανά site, status, ημερομηνία. Quick actions: confirm, cancel, refund. Audit log σε κάθε action. Per-site analytics: deposit_summary (collected vs remaining), refund_summary, payment_methods aggregate.
Native iOS app (LIVE στο App Store)
Wide Book Admin για iPhone και iPad, διαθέσιμη δωρεάν στο App Store, iOS 15.1 και άνω. Smart Calendar με dot indicators ανά ημέρα, push notifications σε νέα booking, calendar UI για quick reschedule, refund flow με i18n EL/EN/DE, Face ID protection. Η Android έκδοση βρίσκεται σε ενεργή ανάπτυξη.
Form integration για inquiry & contact forms
Συνδέουμε τις φόρμες επικοινωνίας και inquiry forms του site στην εφαρμογή. Κάθε υποβολή έρχεται σαν push notification και αποθηκεύεται στο in-app inbox με όλα τα στοιχεία του πελάτη, ώστε ο owner να μη χρειάζεται να ανοίγει email για κάθε νέο lead.
Per-site API key + mutation rate limit
Κάθε site έχει δικό του API key που panel + mobile χρησιμοποιούν για authenticated requests. Mutation rate limit (sliding window 30 mutations / 60s per IP) στο `api/middleware/rate_limit.php`, fails open σε file errors, skips login + push-token endpoints + webhooks.
Customer cache + delete hooks
v1.14.1 έπιασε ένα silent bug: deleting/trashing bookings άφηνε stale customers στο customer cache. Νέο delete hook + `refresh_customer_cache_by_email()` που DELETEs την cache row όταν δεν υπάρχουν other non-trash bookings για το email. Manual cleanup μέσω POST `/cache/rebuild` σε όλα τα 4 sites.
Reusable pattern για νέα booking sites
Το ίδιο stack (Bridge + panel + mobile + theme helpers) πάει plug-and-play σε όποιο νέο booking site βάλει η Wideview στο πελατολόγιο. Setup σε νέο site = εγκατάσταση plugin + config API key + theme helpers, όχι rewrite. Pattern documented internally ως reusable blueprint.
Connected sites: jktours, daycruiseparga, sivotaluxurycollection, brownsivota
jktours = 13 οχήματα στην Αγία Πελαγία Κρήτης, daycruiseparga = day cruise tours από Πάργα, sivotaluxurycollection = 4-room luxury villa σε Σύβοτα (inquiry-only), brownsivota = 4-room boutique σε Σύβοτα (opens 2026-07-01 inquiry-only). Όλα συγχρονισμένα.
Live από production
Πώς δείχνει στην πράξη
Screenshots από το ζωντανό site. Τιμές, ονόματα πελατών και ευαίσθητα στοιχεία είναι μασκαρισμένα με skeleton blur ώστε να φαίνεται μόνο το functionality.

Mobile
Smart Calendar: dot indicators για All Accepted και Has Pending κρατήσεις

Mobile
Multi-property hub με Face ID, EL/EN/DE, dark/light/system, granular notification controls

Mobile
Notifications inbox με push history, filters Auto/Manual/Unread, action triggers
Tech Stack
Με τι χτίστηκε
Όλο το stack είναι τυποποιημένο. Δεν βασίζεται σε κρυφά παραμετροποιημένα plugins ή proprietary cloud services. Μπορεί να μεταφερθεί ή να συντηρηθεί από οποιαδήποτε ομάδα γνωρίζει το stack.
Φεύγουμε από το λιμάνι 10 το πρωί και γυρνάμε 5 το απόγευμα, όλη μέρα στη θάλασσα. Κάθε κράτηση που έρχεται όσο είμαστε εν πλω την βλέπω και την επιβεβαιώνω από κινητό. Φτάνουμε στο λιμάνι με το πρόγραμμα της επόμενης ημέρας ήδη κλειδωμένο, χωρίς να αγγίξω WordPress.
Κώστας Ρεπάνης · Day Cruise Parga
FAQ
Συχνές ερωτήσεις
Γιατί δικός σας Bridge plugin και όχι direct WP REST API;
Το booking plugin που τρέχει σε όλα τα 4 sites αλλάζει internals σε κάθε plugin update, οπότε αν panel και mobile app χτυπάνε direct το plugin endpoint, ένα update μπορεί να σπάσει και τα 2 ταυτόχρονα. Το Bridge λειτουργεί ως translation layer: εκθέτει stable contract σε panel + mobile, και ενδιάμεσα διαβάζει direct από τα booking-plugin tables. Έτσι plugin update δε σπάει mobile app, και το mobile app δεν αναγκάζει app store update κάθε φορά που αλλάζει το upstream plugin.
Πώς αποφεύγεται stale display όταν αλλάζει τιμή event;
Έχουμε 4-layer sync που τρέχει σε REST hook μετά από κάθε Bridge write. Ενημερώνονται ταυτόχρονα: (1) booking-plugin events table, (2) calendar metadata default_price, (3) ACF fields στο vehicle ή room CPT (preserving package ratios per season), (4) theme cache invalidation σε LiteSpeed + WP + optional Cloudflare. Καμία γραμμή δε χάνεται και ο επόμενος visitor δε βλέπει stale price.
Δουλεύει το ίδιο stack για boats, vehicles και villas;
Ναι. Currently συνδέει 4 sites: jktours (13 οχήματα στην Αγία Πελαγία Κρήτης), daycruiseparga (day cruise tours από Πάργα), sivotaluxurycollection (4-room luxury villa σε Σύβοτα inquiry-only), brownsivota (4-room boutique σε Σύβοτα, opens 2026-07-01 inquiry-only). Το pattern είναι reusable blueprint για όποιο νέο booking site βάλει η Wideview στο πελατολόγιο: εγκατάσταση plugin + config API key + theme helpers, όχι rewrite.
Πώς διαχειρίζεται ένας owner κρατήσεις από mobile χωρίς να μπαίνει σε WP admin;
Με τη Wide Book Admin εφαρμογή. Native iOS app, ζωντανή στο App Store δωρεάν, για iOS 15.1 και άνω. Smart Calendar με dot indicators σε ημέρες με κρατήσεις, push notifications σε κάθε νέα κράτηση, calendar UI για quick reschedule, refund flow με i18n EL/EN/DE, Face ID login. Ο owner δεν αγγίζει WordPress για daily operations. Η Android έκδοση είναι σε ενεργή ανάπτυξη.
Πώς δουλεύει το rate limiting όταν εμφανιστεί burst από mobile clients;
Mutation rate limit (sliding window 30 mutations / 60s per IP) στο api/middleware/rate_limit.php. Fails open σε file errors ώστε να μη μπλοκαριστεί ολόκληρο το API αν χτυπήσει το filesystem. Skip κάνει σε login + push-token endpoints + webhooks γιατί αυτά είναι time-sensitive και δε χρειάζονται throttling. Burst από legit user (πχ batch confirm 10 bookings) περνάει χωρίς πρόβλημα.
Πώς διαχειρίζεται customers όταν διαγράφονται bookings;
Bridge v1.14.1 έπιασε ένα silent bug: deleting ή trashing bookings άφηνε stale customers στο customer cache. Φτιάξαμε νέο delete hook + refresh_customer_cache_by_email() function που DELETEs την cache row όταν δεν υπάρχουν other non-trash bookings για το email. Manual cleanup μέσω POST /cache/rebuild σε όλα τα 4 sites αν χρειαστεί full refresh.