<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://wiki.restapro.es/en/changelog</id>
    <title>RestaPro changelog</title>
    <updated>2026-05-04T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://wiki.restapro.es/en/changelog"/>
    <subtitle>Novedades y mejoras del producto</subtitle>
    <icon>https://wiki.restapro.es/en/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Internal customer notes, allergen filter, and this wiki]]></title>
        <id>https://wiki.restapro.es/en/changelog/notas-internas-alergenos-wiki</id>
        <link href="https://wiki.restapro.es/en/changelog/notas-internas-alergenos-wiki"/>
        <updated>2026-05-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Private notes per customer, allergen filtering on the public menu, and the launch of wiki.restapro.es with full documentation.]]></summary>
        <content type="html"><![CDATA[<p>A polish batch on the CRM, the public menu, and an announcement that concerns you directly: <strong>wiki.restapro.es</strong> is now live.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="internal-notes-on-customers">Internal notes on customers<a href="https://wiki.restapro.es/en/changelog/notas-internas-alergenos-wiki#internal-notes-on-customers" class="hash-link" aria-label="Direct link to Internal notes on customers" title="Direct link to Internal notes on customers" translate="no">​</a></h2>
<p>Every customer card in the CRM now has an <strong>Internal notes</strong> field. Only you and your team see it, never the customer. Use it for:</p>
<ul>
<li class="">Allergies and preferences ("red wine crianza, no dessert").</li>
<li class="">Heads-up notes ("the husband always pays, not the wife").</li>
<li class="">Context ("neighborhood VIP, attend personally").</li>
</ul>
<p>It shows up on the customer card in <strong>Live service</strong> and on the reservation edit screen, so you see it before they arrive.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="allergen-filter-on-the-public-menu">Allergen filter on the public menu<a href="https://wiki.restapro.es/en/changelog/notas-internas-alergenos-wiki#allergen-filter-on-the-public-menu" class="hash-link" aria-label="Direct link to Allergen filter on the public menu" title="Direct link to Allergen filter on the public menu" translate="no">​</a></h2>
<p>Your guests can filter the menu by allergen (gluten, lactose, nuts, shellfish, eggs…) directly on the public page. You set them per dish when editing the menu. It is optional. If you flag none, the filter does not appear.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wiki-at-wikirestaproes">Wiki at wiki.restapro.es<a href="https://wiki.restapro.es/en/changelog/notas-internas-alergenos-wiki#wiki-at-wikirestaproes" class="hash-link" aria-label="Direct link to Wiki at wiki.restapro.es" title="Direct link to Wiki at wiki.restapro.es" translate="no">​</a></h2>
<p>You are reading it right now. It is our public knowledge base with:</p>
<ul>
<li class=""><strong>Step-by-step guides</strong> for every product feature, written for restaurant owners (no technical jargon).</li>
<li class=""><strong>FAQ</strong> with the 20 most common questions.</li>
<li class=""><strong>Changelog</strong> (this one).</li>
<li class=""><strong>Search</strong> that matches across all content.</li>
</ul>
<p>And the <strong>Help</strong> button in the app's sidebar opens this wiki in a new tab. Pinche, the AI assistant, also uses it: ask "how do I do X?" and it searches here and returns links.</p>
<p>More in the wiki <a class="" href="https://wiki.restapro.es/en/">introduction</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Live service pause]]></title>
        <id>https://wiki.restapro.es/en/changelog/pausa-servicio-en-vivo</id>
        <link href="https://wiki.restapro.es/en/changelog/pausa-servicio-en-vivo"/>
        <updated>2026-05-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Close online reservations for a specific service (lunch, dinner, breakfast) on a date without touching your hours.]]></summary>
        <content type="html"><![CDATA[<p>At a restaurant owner's request ("walk-ins are coming in, I don't want any more online reservations for lunch, but I don't want to dig into settings"), we are shipping the <strong>live service pause</strong>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-does">What it does<a href="https://wiki.restapro.es/en/changelog/pausa-servicio-en-vivo#what-it-does" class="hash-link" aria-label="Direct link to What it does" title="Direct link to What it does" translate="no">​</a></h2>
<p>From <strong>Reservations → Pause online reservations</strong> you can block new reservations for a specific shift (breakfast, lunch, dinner, or the whole day) on a given date. The pause <strong>expires automatically when the day changes</strong>: if you do not resume it, tomorrow your site accepts reservations again on its own.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-matters">Why it matters<a href="https://wiki.restapro.es/en/changelog/pausa-servicio-en-vivo#why-it-matters" class="hash-link" aria-label="Direct link to Why it matters" title="Direct link to Why it matters" translate="no">​</a></h2>
<ul>
<li class="">You do not touch hours or settings. The permanent configuration stays intact.</li>
<li class="">The restaurant owner keeps creating internal reservations (walk-ins, calls, VIPs) during the pause.</li>
<li class="">The guest sees a clear message: <em>"At capacity, we'll see you without a reservation"</em> with a button to <strong>call the restaurant</strong>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="difference-from-extended-closure">Difference from extended closure<a href="https://wiki.restapro.es/en/changelog/pausa-servicio-en-vivo#difference-from-extended-closure" class="hash-link" aria-label="Direct link to Difference from extended closure" title="Direct link to Difference from extended closure" translate="no">​</a></h2>
<table><thead><tr><th></th><th>Service pause</th><th>Extended closure</th></tr></thead><tbody><tr><td>Where</td><td>Reservations → Pause</td><td>Live service → toggle</td></tr><tr><td>Scope</td><td>One service on one date</td><td>The whole site indefinitely</td></tr><tr><td>Expires</td><td>Yes, when the day changes</td><td>No, you have to resume manually</td></tr></tbody></table>
<p>More detail in the <a class="" href="https://wiki.restapro.es/en/operativa-diaria/pausa-servicio">full service pause guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[A wave of internal improvements: security, performance, resilience]]></title>
        <id>https://wiki.restapro.es/en/changelog/ola-de-mejoras-internas</id>
        <link href="https://wiki.restapro.es/en/changelog/ola-de-mejoras-internas"/>
        <updated>2026-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Security hardening (XSS, leaks, idempotency), admin performance, and resilience improvements you don't see but you feel.]]></summary>
        <content type="html"><![CDATA[<p>This week was more about paying down debt than shipping new things, but the result is that the app feels more solid. Here is a summary so you know where things got better even if your eye did not catch it.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://wiki.restapro.es/en/changelog/ola-de-mejoras-internas#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<ul>
<li class=""><strong>JSON-LD escaping</strong> on the public menu to block injections from exotic dish names.</li>
<li class=""><strong>Validation of external URLs</strong> before showing them on public pages.</li>
<li class=""><strong>Image upload</strong> now rejects SVGs and caps size at 5 MB. Previously you could sneak in a scripted SVG.</li>
<li class=""><strong>Public edit token</strong> signed with HMAC: nobody can edit someone else's reservation, even if they guess the ID.</li>
<li class=""><strong>Idempotent Stripe webhook</strong>: if the same event arrives twice (Stripe sometimes retries), it only applies once.</li>
<li class=""><strong>Rate limiting and access guards</strong> on six Gemini functions to prevent cost abuse.</li>
<li class=""><strong>Roles</strong>: <code>workspace-member-upsert</code> no longer allows escalation to <code>owner</code> from a lower role.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance">Performance<a href="https://wiki.restapro.es/en/changelog/ola-de-mejoras-internas#performance" class="hash-link" aria-label="Direct link to Performance" title="Direct link to Performance" translate="no">​</a></h2>
<ul>
<li class=""><strong>Admin overview</strong> stopped doing N+1 when listing restaurants (it was one query each; now a single one).</li>
<li class=""><strong>Sentry lazy-loaded</strong>: only loads when needed, not on every visit to the public home.</li>
<li class=""><strong><code>date-fns</code> in small bundle</strong> instead of the full package, saving about 80KB per load.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resilience">Resilience<a href="https://wiki.restapro.es/en/changelog/ola-de-mejoras-internas#resilience" class="hash-link" aria-label="Direct link to Resilience" title="Direct link to Resilience" translate="no">​</a></h2>
<ul>
<li class=""><strong>Frontend auto-reload</strong> if a chunk preload fails after a deploy: the user does not see a broken screen, it reloads on its own.</li>
<li class=""><strong>Snapshot of <code>dist/</code></strong> plus a quick <strong>rollback</strong> script to revert to the previous version if a deploy goes sideways.</li>
<li class=""><strong>Reminders</strong> now respect the restaurant's <strong>time zone</strong> (they used to send in UTC and sometimes ran an hour early).</li>
<li class=""><strong>Public stats cron</strong> rescheduled so it does not collide with backups.</li>
</ul>
<p>If something felt slow or odd and you notice it no longer does, this was it.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Events-only onboarding and a redesigned landing]]></title>
        <id>https://wiki.restapro.es/en/changelog/onboarding-eventos-y-landing</id>
        <link href="https://wiki.restapro.es/en/changelog/onboarding-eventos-y-landing"/>
        <updated>2026-04-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Events-only workspace for businesses that handle private events exclusively. New landing with a real counter and a comparison against TheFork.]]></summary>
        <content type="html"><![CDATA[<p>Two launches aimed at different profiles: the pure private-events business, and the restaurant owner landing on the public site for the first time.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="events-only-workspace">"Events-only" workspace<a href="https://wiki.restapro.es/en/changelog/onboarding-eventos-y-landing#events-only-workspace" class="hash-link" aria-label="Direct link to &quot;Events-only&quot; workspace" title="Direct link to &quot;Events-only&quot; workspace" translate="no">​</a></h2>
<p>Not every business needs standard reservations. Some customers (catering, wedding venues, private event spaces) handle <strong>only group events</strong>. For them we built an <strong>events-only workspace mode</strong>:</p>
<ul>
<li class="">During setup, they pick "I only manage events" instead of the reservations flow.</li>
<li class="">The <strong>Live service</strong> and <strong>Reservations</strong> screens are hidden.</li>
<li class=""><strong>Group events</strong> becomes the main screen.</li>
<li class="">Templates and emails adopt the language of events (quote, deposit, event date, expected number of guests).</li>
</ul>
<p>If your business fits this, write to us at <code>support@restapro.es</code> and we will enable the mode. It is not a public toggle yet; we prefer to talk to each customer to fine-tune.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redesigned-landing">Redesigned landing<a href="https://wiki.restapro.es/en/changelog/onboarding-eventos-y-landing#redesigned-landing" class="hash-link" aria-label="Direct link to Redesigned landing" title="Direct link to Redesigned landing" translate="no">​</a></h2>
<p>We rewrote <strong><code>https://www.restapro.es</code></strong> from end to end:</p>
<ul>
<li class=""><strong>Real reservations counter</strong> instead of made-up numbers.</li>
<li class=""><strong>Transparent comparison</strong> against TheFork: prices, commissions, what each one does better.</li>
<li class=""><strong>Live demo</strong> showing the service screen without requiring signup.</li>
<li class=""><strong>Wider layout (1536px)</strong> with condensed blocks; reads better on a large monitor without losing density.</li>
</ul>
<p>If you were taking someone to the site to explain RestaPro, the conversation is now shorter: less jargon, more real screenshots.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Goodbye TheFork + five UX sprints on live service]]></title>
        <id>https://wiki.restapro.es/en/changelog/adios-thefork-sprints-ux</id>
        <link href="https://wiki.restapro.es/en/changelog/adios-thefork-sprints-ux"/>
        <updated>2026-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We removed the TheFork integration and spent five back-to-back sprints polishing the live-service experience.]]></summary>
        <content type="html"><![CDATA[<p>Big wave this week: we have removed the <strong>TheFork</strong> integration and run five back-to-back sprints polishing the <strong>Live service</strong> screen point by point.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-we-removed-thefork">Why we removed TheFork<a href="https://wiki.restapro.es/en/changelog/adios-thefork-sprints-ux#why-we-removed-thefork" class="hash-link" aria-label="Direct link to Why we removed TheFork" title="Direct link to Why we removed TheFork" translate="no">​</a></h2>
<p>We learned this the hard way: when RestaPro was the source of the reservation, data was consistent and emails arrived on time. When a reservation came from TheFork, there were <strong>two sources of truth</strong>: sync drifted, reminders duplicated, and restaurant owners got complaints from guests receiving two confirmations for the same dinner.</p>
<p>The decision was: either fix it properly (weeks of work) or remove it. We chose to remove it and simplify. If you need TheFork, we still ask customers to keep it running in parallel and reflect those reservations as walk-ins in RestaPro.</p>
<p>If you still had a restaurant connected to TheFork, past reservations stay in history and new ones stop syncing. We flagged it via email and a backoffice toast.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="five-ux-sprints-on-live-service">Five UX sprints on live service<a href="https://wiki.restapro.es/en/changelog/adios-thefork-sprints-ux#five-ux-sprints-on-live-service" class="hash-link" aria-label="Direct link to Five UX sprints on live service" title="Direct link to Five UX sprints on live service" translate="no">​</a></h2>
<p>After launching <strong>Live service</strong>, we ran weekly sprints to polish what you only feel when you actually use it:</p>
<ul>
<li class=""><strong>Sprint 1.</strong> Quick wins: tooltips, keyboard shortcuts, responsive layout on tablet.</li>
<li class=""><strong>Sprint 2.</strong> General UX: copy review, clearer separators, visual weights.</li>
<li class=""><strong>Sprint 3.</strong> Operational efficiency: fewer clicks to reassign, quick access to "mark arrived", critical-table highlighting.</li>
<li class=""><strong>Sprint 4.</strong> Guest context: <strong>VIP</strong> badge and <strong>no-show</strong> counter visible at a glance.</li>
<li class=""><strong>Sprint 5.</strong> TV view (mode for the dining-room display) and <strong>sound</strong> on new incoming reservation.</li>
</ul>
<p>If you have not opened this screen in a while, try it now. It is a different thing.</p>
<p>More in the <a class="" href="https://wiki.restapro.es/en/operativa-diaria/reservas">reservations guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Public reservation editing + alerts to multiple emails]]></title>
        <id>https://wiki.restapro.es/en/changelog/edicion-publica-y-alertas-multiples</id>
        <link href="https://wiki.restapro.es/en/changelog/edicion-publica-y-alertas-multiples"/>
        <updated>2026-04-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Guests edit or cancel their reservation from the email without calling. Restaurants get alerts in multiple inboxes in real time.]]></summary>
        <content type="html"><![CDATA[<p>Two small improvements that cut noise on both sides: the guest does not call to change a time, and the restaurant does not learn about a new reservation late because they were checking another inbox.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="guests-edit-their-reservation-from-the-email">Guests edit their reservation from the email<a href="https://wiki.restapro.es/en/changelog/edicion-publica-y-alertas-multiples#guests-edit-their-reservation-from-the-email" class="hash-link" aria-label="Direct link to Guests edit their reservation from the email" title="Direct link to Guests edit their reservation from the email" translate="no">​</a></h2>
<p>The confirmation email your guests receive now includes an <strong>"Edit or cancel my reservation"</strong> link. When they tap it:</p>
<ul>
<li class="">They land on a simple screen on your public domain.</li>
<li class="">They can change the time within available slots, or cancel.</li>
<li class="">No account, no password to remember.</li>
</ul>
<p>The link is signed with a unique token. No one else can touch the reservation, even if they know the ID. We covered the edge cases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="alerts-to-multiple-emails">Alerts to multiple emails<a href="https://wiki.restapro.es/en/changelog/edicion-publica-y-alertas-multiples#alerts-to-multiple-emails" class="hash-link" aria-label="Direct link to Alerts to multiple emails" title="Direct link to Alerts to multiple emails" translate="no">​</a></h2>
<p>Until now, new-reservation alerts went to a single inbox. Now you can define <strong>multiple recipients</strong> in <strong>Settings → Alerts</strong>:</p>
<ul>
<li class="">You (<code>you@restaurant.com</code>)</li>
<li class="">The floor manager (<code>floor@restaurant.com</code>)</li>
<li class="">Anything else (a Slack-via-webhook-to-email bridge, a group, etc.)</li>
</ul>
<p>If you set more than one, all of them get the alert at once.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-time-toast">Real-time toast<a href="https://wiki.restapro.es/en/changelog/edicion-publica-y-alertas-multiples#real-time-toast" class="hash-link" aria-label="Direct link to Real-time toast" title="Direct link to Real-time toast" translate="no">​</a></h2>
<p>If you have the backoffice open, when an online reservation comes in a <strong>toast appears in the corner</strong> ("New reservation: 2 people, 21:00"). No reload, no waiting for sync. It is realtime via Supabase, so it is instant.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="duplicate-detection">Duplicate detection<a href="https://wiki.restapro.es/en/changelog/edicion-publica-y-alertas-multiples#duplicate-detection" class="hash-link" aria-label="Direct link to Duplicate detection" title="Direct link to Duplicate detection" translate="no">​</a></h2>
<p>If the same guest tries to book twice for the same day (typical when the form double-submits or a request hangs on the network), RestaPro detects it and warns before inserting a duplicate. The backoffice flags it too.</p>
<p>More in the <a class="" href="https://wiki.restapro.es/en/operativa-diaria/reservas">reservations guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Live service: the floor manager's screen]]></title>
        <id>https://wiki.restapro.es/en/changelog/servicio-en-vivo</id>
        <link href="https://wiki.restapro.es/en/changelog/servicio-en-vivo"/>
        <updated>2026-04-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Real-time view of your restaurant with drag-and-drop reservations onto tables, flexible walk-ins, service banner, and per-table blocks.]]></summary>
        <content type="html"><![CDATA[<p>This is the screen we have been thinking about for months: a single real-time view to run service without jumping between menus. It is called <strong>Live service</strong> and it lives at <code>/app/local</code>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-does">What it does<a href="https://wiki.restapro.es/en/changelog/servicio-en-vivo#what-it-does" class="hash-link" aria-label="Direct link to What it does" title="Direct link to What it does" translate="no">​</a></h2>
<ul>
<li class=""><strong>Floor plan</strong> with the live status of each table: free, occupied, walk-in, blocked.</li>
<li class=""><strong>Drag and drop</strong> to reassign reservations to tables during service. If capacity is tight, the system warns you before you drop.</li>
<li class=""><strong>Flexible walk-ins</strong> — the big button to seat guests without a reservation, adjusting capacity on the fly.</li>
<li class=""><strong>Service banner</strong> in the header with a summary of how the day is going (occupancy, upcoming reservations, alerts).</li>
<li class=""><strong>Table blocking</strong> with a reason: "broken table", "reserved for a group at 22:00", "boss's birthday".</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="who-its-for">Who it's for<a href="https://wiki.restapro.es/en/changelog/servicio-en-vivo#who-its-for" class="hash-link" aria-label="Direct link to Who it's for" title="Direct link to Who it's for" translate="no">​</a></h2>
<p>For the <strong>floor manager</strong> and the <strong>shift lead</strong>. It is the screen open on the tablet behind the bar throughout service. No technical text, no training needed: if you have worked the floor, you get it instantly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-fits-with-the-rest">How it fits with the rest<a href="https://wiki.restapro.es/en/changelog/servicio-en-vivo#how-it-fits-with-the-rest" class="hash-link" aria-label="Direct link to How it fits with the rest" title="Direct link to How it fits with the rest" translate="no">​</a></h2>
<ul>
<li class=""><strong>Reservations</strong> is still where you do background management (create, edit, cancel).</li>
<li class=""><strong>Live service</strong> is where you <strong>operate</strong> during the shift.</li>
<li class="">Both screens look at the same database in real time, so there is no sync drift.</li>
</ul>
<p>More in <a class="" href="https://wiki.restapro.es/en/operativa-diaria/floor-plans">floor plans</a> and the <a class="" href="https://wiki.restapro.es/en/operativa-diaria/reservas">reservations guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Breakfast as a service shift + slots up to the last reservation]]></title>
        <id>https://wiki.restapro.es/en/changelog/desayuno-y-slots</id>
        <link href="https://wiki.restapro.es/en/changelog/desayuno-y-slots"/>
        <updated>2026-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Breakfast stops being a special case and is managed like every other service. Reservation slots run to the last configured time, not before.]]></summary>
        <content type="html"><![CDATA[<p>Two small but requested fixes from cafés and breakfast spots: morning hours are no longer a second-class citizen, and reservation slots no longer get cut off too early.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breakfast-as-a-service-shift">Breakfast as a service shift<a href="https://wiki.restapro.es/en/changelog/desayuno-y-slots#breakfast-as-a-service-shift" class="hash-link" aria-label="Direct link to Breakfast as a service shift" title="Direct link to Breakfast as a service shift" translate="no">​</a></h2>
<p>Until now the service shifts were <strong>lunch</strong> and <strong>dinner</strong>. If your business opens for breakfast, there was no clean way to separate the morning service from the rest. Now <strong>breakfast</strong> is a shift in its own right:</p>
<ul>
<li class="">You enable it in <strong>Settings → Hours</strong> by setting the time range (typically 8:00–12:00).</li>
<li class="">It has its own configuration (capacity, slots, assigned tables).</li>
<li class=""><strong>Online reservations</strong> show it as a separate shift on the public page.</li>
<li class=""><strong>Emails</strong> and <strong>automations</strong> can filter by shift: "send a promo only to breakfast guests", for example.</li>
</ul>
<p>If your restaurant serves breakfast, you can finally separate it from lunch without workarounds.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="slots-up-to-the-last-configured-reservation">Slots up to the last configured reservation<a href="https://wiki.restapro.es/en/changelog/desayuno-y-slots#slots-up-to-the-last-configured-reservation" class="hash-link" aria-label="Direct link to Slots up to the last configured reservation" title="Direct link to Slots up to the last configured reservation" translate="no">​</a></h2>
<p>There used to be a subtle behavior: if your last dinner hour was 23:00, the last <strong>bookable slot</strong> was 22:30 (because we left an "automatic" buffer). Result: people who wanted to book at 23:00 could not, even though your restaurant was actually accepting guests then.</p>
<p>Now slots run <strong>all the way to the exact time you configured</strong>. If you say the last hour is 23:00, 23:00 is selectable.</p>
<p>If you want to leave a buffer, you set it explicitly by changing the last hour to 22:30. More control, less magic.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Redesigned public menu and group event proposals]]></title>
        <id>https://wiki.restapro.es/en/changelog/carta-publica-eventos-grupo</id>
        <link href="https://wiki.restapro.es/en/changelog/carta-publica-eventos-grupo"/>
        <updated>2026-04-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A responsive, accessible public menu, plus group event requests directly from your public page.]]></summary>
        <content type="html"><![CDATA[<p>Two visible changes for your guests in this batch: the <strong>public menu</strong> has been fully redesigned, and you can now request a <strong>group event</strong> from your page without picking up the phone.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-public-menu">New public menu<a href="https://wiki.restapro.es/en/changelog/carta-publica-eventos-grupo#new-public-menu" class="hash-link" aria-label="Direct link to New public menu" title="Direct link to New public menu" translate="no">​</a></h2>
<p>The menu your guests see (through the QR or at <code>restapro.es/r/your-restaurant</code>) now:</p>
<ul>
<li class=""><strong>Truly responsive</strong>: reads the same on an iPhone SE as on an iPad.</li>
<li class=""><strong>Accessible</strong>: keyboard-navigable, sufficient color contrast, screen readers handle it.</li>
<li class=""><strong>Allergen filters</strong>: guests can filter by gluten, lactose, nuts, etc. You configure the data per dish when editing.</li>
<li class=""><strong>Contextual empty state</strong>: if filters return nothing, suggestions to widen the search.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="group-event-proposals">Group event proposals<a href="https://wiki.restapro.es/en/changelog/carta-publica-eventos-grupo#group-event-proposals" class="hash-link" aria-label="Direct link to Group event proposals" title="Direct link to Group event proposals" translate="no">​</a></h2>
<p>Your public page now shows a <strong>"Book for a group"</strong> button when someone wants to come with a large party. The guest:</p>
<ol>
<li class="">Fills in a short form: date, party size, type of event, notes.</li>
<li class="">The proposal lands in your backoffice; it is not a confirmed reservation.</li>
<li class="">You approve, decline, or reply with a quote / alternative availability.</li>
</ol>
<p>For large reservations (15+), this is a far better flow than a standard online reservation: it gives you time to coordinate with the kitchen, set a menu, request a deposit, and so on.</p>
<p>More in the <a class="" href="https://wiki.restapro.es/en/clientes/eventos-de-grupo">group events guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-small-things">Other small things<a href="https://wiki.restapro.es/en/changelog/carta-publica-eventos-grupo#other-small-things" class="hash-link" aria-label="Direct link to Other small things" title="Direct link to Other small things" translate="no">​</a></h2>
<ul>
<li class=""><strong>Reservations embed</strong> without a cookie banner (you handle it on your own site, no duplication).</li>
<li class=""><strong>Deleting a reservation</strong> no longer requires typing exact confirmation text, just a button.</li>
<li class=""><strong>Action tracking</strong> for the restaurant owner: we now know which screens you use and which are orphans, so we can polish them instead of guessing.</li>
</ul>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Pinche moves to Gemini 2.5 and centralized logs]]></title>
        <id>https://wiki.restapro.es/en/changelog/pinche-mas-rapido-y-logs</id>
        <link href="https://wiki.restapro.es/en/changelog/pinche-mas-rapido-y-logs"/>
        <updated>2026-04-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Pinche, the AI assistant, migrates to Gemini 2.5 Flash: faster responses and better reasoning. Unified logs in Slack via n8n.]]></summary>
        <content type="html"><![CDATA[<p>Invisible but important improvements: the AI assistant is faster, and platform errors no longer disappear into a log nobody checks.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pinche-on-gemini-25-flash">Pinche on Gemini 2.5 Flash<a href="https://wiki.restapro.es/en/changelog/pinche-mas-rapido-y-logs#pinche-on-gemini-25-flash" class="hash-link" aria-label="Direct link to Pinche on Gemini 2.5 Flash" title="Direct link to Pinche on Gemini 2.5 Flash" translate="no">​</a></h2>
<p><strong>Pinche</strong> now runs on <strong>Gemini 2.5 Flash</strong> instead of 2.0. You will notice it in:</p>
<ul>
<li class=""><strong>Speed.</strong> Responses start appearing about 30% faster.</li>
<li class=""><strong>Reasoning.</strong> Better when you ask things like "what menu change would have the biggest impact on average ticket?" or "explain this to a new server".</li>
<li class=""><strong>Cost.</strong> Equal or lower for us, so it does not affect your bill.</li>
</ul>
<p>The change is transparent. Pinche still answers in Spanish, with the same management tools.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="centralized-logs">Centralized logs<a href="https://wiki.restapro.es/en/changelog/pinche-mas-rapido-y-logs#centralized-logs" class="hash-link" aria-label="Direct link to Centralized logs" title="Direct link to Centralized logs" translate="no">​</a></h2>
<p>Errors from edge functions used to live in six different places: Supabase, Sentry, local nginx logs… Now they all flow into a single <strong><code>#logs</code> channel</strong> via n8n:</p>
<ul>
<li class="">Any error or warning from any serverless function lands in Slack within seconds.</li>
<li class="">If your restaurant shows odd behavior and you email us, we correlate it with the logs from that exact moment.</li>
<li class="">We automatically filter out known noise (expected timeouts) so we do not spam the channel.</li>
</ul>
<p>It affects you indirectly: when something breaks in production, we see it in minutes instead of hours.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sentry-tunnel-via-m">Sentry tunnel via <code>/m</code><a href="https://wiki.restapro.es/en/changelog/pinche-mas-rapido-y-logs#sentry-tunnel-via-m" class="hash-link" aria-label="Direct link to sentry-tunnel-via-m" title="Direct link to sentry-tunnel-via-m" translate="no">​</a></h2>
<p>Some ad blockers block Sentry's domain outright, leaving us blind to frontend errors. Now the frontend sends errors to <code>/m</code> (a same-origin proxy on our nginx) that forwards to Sentry.</p>
<p>Result: <strong>we see 100% of the errors</strong> happening in the browser, even from users on aggressive uBlock Origin.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Automated email rules: write it once, it sends itself]]></title>
        <id>https://wiki.restapro.es/en/changelog/reglas-email-automaticas</id>
        <link href="https://wiki.restapro.es/en/changelog/reglas-email-automaticas"/>
        <updated>2026-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Build rules that send an email when reservation conditions match: thank-you, reminder, win-back, first VIP visit.]]></summary>
        <content type="html"><![CDATA[<p>Until now, automated emails were all-or-nothing: confirmation on booking and not much else. Now you can define <strong>fine-grained rules</strong> for when and to whom you send what.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-theyre-built">How they're built<a href="https://wiki.restapro.es/en/changelog/reglas-email-automaticas#how-theyre-built" class="hash-link" aria-label="Direct link to How they're built" title="Direct link to How they're built" translate="no">​</a></h2>
<p>In <strong>Marketing → Automations</strong>, you pick:</p>
<ol>
<li class=""><strong>Trigger.</strong> When the rule is evaluated: reservation created, reservation confirmed, reservation completed, customer hits X visits…</li>
<li class=""><strong>Conditions.</strong> As specific as you want: day of week, time slot, party size, source channel, first visit or not.</li>
<li class=""><strong>Template.</strong> Which email is sent. Five or six templates ship ready (thanks, reminder, win-back, discount code, first visit).</li>
<li class=""><strong>Delay.</strong> When it goes: immediately, 4 hours later, the next day, a week later…</li>
<li class=""><strong>Cap per customer.</strong> So you do not spam: maximum X emails from this rule per person.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="typical-cases-already-running">Typical cases already running<a href="https://wiki.restapro.es/en/changelog/reglas-email-automaticas#typical-cases-already-running" class="hash-link" aria-label="Direct link to Typical cases already running" title="Direct link to Typical cases already running" translate="no">​</a></h2>
<ul>
<li class=""><strong>"Thanks for your first visit"</strong> with 10% off the next one — for new guests.</li>
<li class=""><strong>"We miss you"</strong> to guests who have not been back in 3+ months.</li>
<li class=""><strong>"24h reminder"</strong> only for large reservations (8+) or for Friday and Saturday.</li>
<li class=""><strong>"Happy birthday"</strong> a week early with a treat from the house.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="live-preview--test-email">Live preview + test email<a href="https://wiki.restapro.es/en/changelog/reglas-email-automaticas#live-preview--test-email" class="hash-link" aria-label="Direct link to Live preview + test email" title="Direct link to Live preview + test email" translate="no">​</a></h2>
<p>While creating the rule, you can see it rendered and send yourself a test email before activating. Spares you the embarrassment of an unresolved placeholder landing in a guest's inbox.</p>
<p>More in the <a class="" href="https://wiki.restapro.es/en/publico-y-marketing/automatizaciones-email">automations guide</a> and the <a class="" href="https://wiki.restapro.es/en/publico-y-marketing/mailing-campaigns">campaigns guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Kiosk mode at /app/local + UI density pass]]></title>
        <id>https://wiki.restapro.es/en/changelog/modo-kiosko-y-densidad</id>
        <link href="https://wiki.restapro.es/en/changelog/modo-kiosko-y-densidad"/>
        <updated>2026-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[An always-on screen for the day's service, descriptions on menu categories, and tightened density across settings and reservations.]]></summary>
        <content type="html"><![CDATA[<p>A visible polish batch: a view designed to stay on a screen behind the bar through the entire service, and a density pass so the app stops wasting pixels.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kiosk-mode-at-applocal">Kiosk mode at <code>/app/local</code><a href="https://wiki.restapro.es/en/changelog/modo-kiosko-y-densidad#kiosk-mode-at-applocal" class="hash-link" aria-label="Direct link to kiosk-mode-at-applocal" title="Direct link to kiosk-mode-at-applocal" translate="no">​</a></h2>
<p>If you have a tablet or small monitor behind the bar to run service, open <code>/app/local</code>. It is <strong>Live service</strong> in clean mode: no sidebar, no distractions, all the space for tables and reservations.</p>
<p>It works well on a horizontal tablet and on small wall-mounted screens. The idea is for it to become part of the restaurant's digital furniture, not something you open and close.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="description-on-menu-categories">Description on menu categories<a href="https://wiki.restapro.es/en/changelog/modo-kiosko-y-densidad#description-on-menu-categories" class="hash-link" aria-label="Direct link to Description on menu categories" title="Direct link to Description on menu categories" translate="no">​</a></h2>
<p>In the menu editor, each <strong>category</strong> can now have a <strong>descriptive subtitle</strong>. Useful for:</p>
<ul>
<li class="">"Starters to share" → text: "Designed for 2-3 people, we bring bread to the center of the table"</li>
<li class="">"Desserts" → text: "Made in-house every day"</li>
<li class="">"Wines by the glass" → text: "A rotating seasonal selection, ask your server"</li>
</ul>
<p>It appears on the public page below the category name. Adds texture without clutter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="density-pass">Density pass<a href="https://wiki.restapro.es/en/changelog/modo-kiosko-y-densidad#density-pass" class="hash-link" aria-label="Direct link to Density pass" title="Direct link to Density pass" translate="no">​</a></h2>
<p>We tightened density in these areas:</p>
<ul>
<li class=""><strong>Settings</strong>: shorter headers, reduced padding; long forms now fit on one screen.</li>
<li class=""><strong>Reservations</strong>: thinner rows, better-balanced columns for lists of 100+ reservations.</li>
<li class=""><strong>Dashboard</strong>: more compact cards; it used to take more space than it earned.</li>
<li class=""><strong>General chrome</strong>: thinner top bar, sidebar with adjusted padding.</li>
<li class=""><strong>Menu capacity and filters</strong>: less air between controls.</li>
</ul>
<p>Result: 25 to 40% more information fits without losing legibility.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="e2e-smoke-tests--public-i18n">E2E smoke tests + public i18n<a href="https://wiki.restapro.es/en/changelog/modo-kiosko-y-densidad#e2e-smoke-tests--public-i18n" class="hash-link" aria-label="Direct link to E2E smoke tests + public i18n" title="Direct link to E2E smoke tests + public i18n" translate="no">​</a></h2>
<p>Technical bonus: we added <strong>end-to-end smoke tests</strong> in GitHub Actions that test login + create reservation + view public menu on every commit. If a change breaks any of those flows, the commit does not merge.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Visual table editor + multiple menus (lunch, dinner, brunch)]]></title>
        <id>https://wiki.restapro.es/en/changelog/editor-mesas-y-multi-cartas</id>
        <link href="https://wiki.restapro.es/en/changelog/editor-mesas-y-multi-cartas"/>
        <updated>2026-04-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Draw your floor with drag and drop, support multiple floors, and publish different menus per service.]]></summary>
        <content type="html"><![CDATA[<p>Two big shipments on the same day. The first is for those who used to draw their dining room on a napkin; the second, for those with a separate lunch and dinner menu who spent all day editing.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="visual-table-editor">Visual table editor<a href="https://wiki.restapro.es/en/changelog/editor-mesas-y-multi-cartas#visual-table-editor" class="hash-link" aria-label="Direct link to Visual table editor" title="Direct link to Visual table editor" translate="no">​</a></h2>
<p>In <strong>Settings → Tables</strong> you no longer need to list tables by hand. You get a canvas where:</p>
<ul>
<li class="">You drag tables from a palette (square, round, long).</li>
<li class="">You assign minimum and maximum capacity.</li>
<li class="">It supports <strong>multiple floors</strong> (terrace upstairs, dining room downstairs, private rooms apart).</li>
<li class="">Each table has its zone and can be shown or hidden in online reservations.</li>
</ul>
<p>When a guest books online, we see graphically which table is free directly on the reservation card, and we can assign it with one click.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="multiple-menus-per-restaurant">Multiple menus per restaurant<a href="https://wiki.restapro.es/en/changelog/editor-mesas-y-multi-cartas#multiple-menus-per-restaurant" class="hash-link" aria-label="Direct link to Multiple menus per restaurant" title="Direct link to Multiple menus per restaurant" translate="no">​</a></h2>
<p>If your business has a <strong>lunch and dinner menu</strong>, <strong>daily special</strong>, <strong>weekend brunch</strong>… all of that fits in RestaPro now. Each menu:</p>
<ul>
<li class="">Has a name and a type (lunch / dinner / daily special / breakfast…).</li>
<li class="">Appears as a tab on your <strong>public page</strong> and in the QR.</li>
<li class="">Can be activated or deactivated per service without touching the others.</li>
</ul>
<p>The menu editor switches between them with a selector at the top. It is the same screen, multiplied.</p>
<p>More in the <a class="" href="https://wiki.restapro.es/en/workspace/capacidad-mesas-vs-plazas">tables and seats guide</a> and the <a class="" href="https://wiki.restapro.es/en/carta-digital/editor-carta">menu editor guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[New landing, polished billing, and security hardening]]></title>
        <id>https://wiki.restapro.es/en/changelog/landing-legal-y-billing</id>
        <link href="https://wiki.restapro.es/en/changelog/landing-legal-y-billing"/>
        <updated>2026-04-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A redesigned public site, complete legal pages, billing through Stripe portal, and a serious first pass at security.]]></summary>
        <content type="html"><![CDATA[<p>A long polish sprint: new public site, friendlier billing, and a serious security pass. If you have not visited <code>restapro.es</code> in a while, it is a different page now.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-public-landing">New public landing<a href="https://wiki.restapro.es/en/changelog/landing-legal-y-billing#new-public-landing" class="hash-link" aria-label="Direct link to New public landing" title="Direct link to New public landing" translate="no">​</a></h2>
<p>We rewrote <strong><code>restapro.es</code></strong> end to end. The big calls:</p>
<ul>
<li class=""><strong>"For restaurant owners" block</strong> at the top, not for investors or journalists.</li>
<li class=""><strong>Real screenshots</strong> of the app, not Figma mockups.</li>
<li class=""><strong>Visible pricing</strong>, no "contact sales". What the page says is what you pay.</li>
<li class=""><strong>Transparent comparison</strong> with TheFork and Resy.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="complete-legal-pages">Complete legal pages<a href="https://wiki.restapro.es/en/changelog/landing-legal-y-billing#complete-legal-pages" class="hash-link" aria-label="Direct link to Complete legal pages" title="Direct link to Complete legal pages" translate="no">​</a></h2>
<p><code>restapro.es/legal</code> now also includes:</p>
<ul>
<li class=""><strong>Cookie policy</strong> with a specific breakdown of which we use and which we do not (we run no third-party analytics on public pages).</li>
<li class=""><strong>Legal notice</strong> with tax ID and registered address.</li>
<li class=""><strong>Terms of service</strong> for end users (the guests who book).</li>
<li class=""><strong>Personal data policy</strong> with clear GDPR rights.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="billing-with-stripe-portal">Billing with Stripe portal<a href="https://wiki.restapro.es/en/changelog/landing-legal-y-billing#billing-with-stripe-portal" class="hash-link" aria-label="Direct link to Billing with Stripe portal" title="Direct link to Billing with Stripe portal" translate="no">​</a></h2>
<p>If you pay for RestaPro, in <strong>Workspace → Billing</strong> you will see a <strong>"Manage subscription"</strong> button that takes you to the <strong>Stripe Customer Portal</strong>:</p>
<ul>
<li class="">Change payment method, download invoices, view history.</li>
<li class="">It is Stripe's portal, not one we built. Card data never passes through RestaPro.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-hardening">Security hardening<a href="https://wiki.restapro.es/en/changelog/landing-legal-y-billing#security-hardening" class="hash-link" aria-label="Direct link to Security hardening" title="Direct link to Security hardening" translate="no">​</a></h2>
<p>A serious pass under the hood (invisible, but you feel it):</p>
<ul>
<li class=""><strong>Rate limiting</strong> on public endpoints so no bot can take down a restaurant's page.</li>
<li class=""><strong>Strict input validation</strong> on public forms.</li>
<li class=""><strong>CSP</strong> (Content Security Policy) tightened to limit which scripts can run.</li>
<li class=""><strong>Security headers</strong> in nginx (HSTS, X-Frame-Options, X-Content-Type-Options).</li>
<li class=""><strong>Webhooks</strong> signed with rotatable secrets.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="review-marketing--test-coverage">Review marketing + test coverage<a href="https://wiki.restapro.es/en/changelog/landing-legal-y-billing#review-marketing--test-coverage" class="hash-link" aria-label="Direct link to Review marketing + test coverage" title="Direct link to Review marketing + test coverage" translate="no">​</a></h2>
<p>As a bonus: we shipped the <strong>review marketing</strong> flow integrated with Google and pushed test coverage up to 72% to reduce regressions.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Coupons, plan cancellation with reason, and AI-drafted emails]]></title>
        <id>https://wiki.restapro.es/en/changelog/cupones-cancelacion-y-emails-ia</id>
        <link href="https://wiki.restapro.es/en/changelog/cupones-cancelacion-y-emails-ia"/>
        <updated>2026-04-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We're shipping discount coupons, plan cancellation with a short survey, and an AI assistant that writes the first email draft for you.]]></summary>
        <content type="html"><![CDATA[<p>Three big things in this batch: being able to offer discounts, leaving RestaPro gracefully (and letting us know why), and ending the staring-at-a-blank-page problem when writing an email to your guests.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="discount-coupons">Discount coupons<a href="https://wiki.restapro.es/en/changelog/cupones-cancelacion-y-emails-ia#discount-coupons" class="hash-link" aria-label="Direct link to Discount coupons" title="Direct link to Discount coupons" translate="no">​</a></h2>
<p>If you are running a promotion ("first month free", "20% for grandparents with family"), you can now create coupons from the panel and share the code. They apply at Stripe checkout and disable themselves on expiry.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plan-cancellation-with-reason">Plan cancellation with reason<a href="https://wiki.restapro.es/en/changelog/cupones-cancelacion-y-emails-ia#plan-cancellation-with-reason" class="hash-link" aria-label="Direct link to Plan cancellation with reason" title="Direct link to Plan cancellation with reason" translate="no">​</a></h2>
<p>If a restaurant owner decides to cancel, we ask for a reason in a short survey before processing the cancellation. Three benefits:</p>
<ul>
<li class="">The plan goes into pause, taking effect at the end of the period.</li>
<li class="">We learn why you are leaving. It is more useful feedback than any anonymous NPS.</li>
<li class="">If the reason is something we can fix (price, a specific feature), we reply by email before the cutoff.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-assistant-for-marketing-emails">AI assistant for marketing emails<a href="https://wiki.restapro.es/en/changelog/cupones-cancelacion-y-emails-ia#ai-assistant-for-marketing-emails" class="hash-link" aria-label="Direct link to AI assistant for marketing emails" title="Direct link to AI assistant for marketing emails" translate="no">​</a></h2>
<p>When creating a campaign in <strong>Marketing → New campaign</strong>, there is now a <strong>"Generate AI draft"</strong> button. You give it three things:</p>
<ul>
<li class="">Who it goes to (new guests / regulars / VIPs)</li>
<li class="">What you want (fill Tuesdays, announce a new menu, win back lapsed guests)</li>
<li class="">Tone (friendly, formal, playful)</li>
</ul>
<p>It writes you a subject line, body, and CTA. You edit, make it your own, and send. Much faster than starting from scratch.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-page-telemetry">Public-page telemetry<a href="https://wiki.restapro.es/en/changelog/cupones-cancelacion-y-emails-ia#public-page-telemetry" class="hash-link" aria-label="Direct link to Public-page telemetry" title="Direct link to Public-page telemetry" translate="no">​</a></h2>
<p>As a technical bonus: your <strong>public reservations page</strong> now counts views. It shows up in analytics so you can see whether SEO or ads are paying off.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ask your guests for reviews without fighting the copy]]></title>
        <id>https://wiki.restapro.es/en/changelog/emails-para-pedir-resenas</id>
        <link href="https://wiki.restapro.es/en/changelog/emails-para-pedir-resenas"/>
        <updated>2026-03-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Automatic post-visit email asking for a Google review. Pick the template, set the timing, and forget it.]]></summary>
        <content type="html"><![CDATA[<p>Reviews drive more reservations than any paid campaign. But asking for them by hand, guest by guest, does not scale. So we built an automated flow into RestaPro.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How it works<a href="https://wiki.restapro.es/en/changelog/emails-para-pedir-resenas#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works" translate="no">​</a></h2>
<ol>
<li class=""><strong>Pick a pre-made template</strong> (thank you + ask + direct link to your Google listing).</li>
<li class=""><strong>Set the delay</strong> (typical: 4 hours after the reservation, when the guest is back home with a coffee).</li>
<li class=""><strong>Activate the rule</strong> and RestaPro sends the email each time a reservation is marked completed.</li>
</ol>
<p>The guest opens the email, clicks, lands on your Google Business profile, and leaves the review in under 30 seconds. If they say no or ignore it, nothing is lost. The guest about to complain usually does not respond to these emails anyway.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-makes-this-work-well">What makes this work well<a href="https://wiki.restapro.es/en/changelog/emails-para-pedir-resenas#what-makes-this-work-well" class="hash-link" aria-label="Direct link to What makes this work well" title="Direct link to What makes this work well" translate="no">​</a></h2>
<ul>
<li class=""><strong>24h marketing block</strong> post-visit: if the person already received an email from you (reminder, confirmation), nothing else goes out the same day. No one feels stalked.</li>
<li class=""><strong>Unsubscribe respected.</strong> A guest who opts out gets no more marketing emails, first time, no questions.</li>
<li class=""><strong>Real tracking.</strong> The <a class="" href="https://wiki.restapro.es/en/publico-y-marketing/visibilidad-google">Google reviews dashboard</a> shows how many reviews came in through this flow.</li>
</ul>
<p>More detail in the <a class="" href="https://wiki.restapro.es/en/publico-y-marketing/solicitar-resenas">review request guide</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Import your menu and hours without typing anything]]></title>
        <id>https://wiki.restapro.es/en/changelog/importar-carta-y-horarios</id>
        <link href="https://wiki.restapro.es/en/changelog/importar-carta-y-horarios"/>
        <updated>2026-03-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Import your menu from your restaurant's website, copy your hours to the clipboard, and pull data from Google.]]></summary>
        <content type="html"><![CDATA[<p>If you already have your menu posted on your own site or on Google Business, RestaPro can pull from there instead of forcing you to retype it.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-shipped">What we shipped<a href="https://wiki.restapro.es/en/changelog/importar-carta-y-horarios#what-we-shipped" class="hash-link" aria-label="Direct link to What we shipped" title="Direct link to What we shipped" translate="no">​</a></h2>
<ul>
<li class=""><strong>URL importer.</strong> In <strong>Menu → Import from web</strong> you paste the public URL of your menu and RestaPro reads titles, descriptions, prices, and categories. You then review and fix whatever is needed.</li>
<li class=""><strong>Import from Google Places.</strong> During restaurant setup, if it finds your listing, we pull phone, address, hours, and cover photo in one go.</li>
<li class=""><strong>Copy hours to clipboard.</strong> A quick button to take your RestaPro hours to your website, social, or a printed sign.</li>
<li class=""><strong>Quick actions on the dashboard.</strong> Three buttons to create a reservation, mark a walk-in, and open the menu without navigating the menu tree.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-matters">Why it matters<a href="https://wiki.restapro.es/en/changelog/importar-carta-y-horarios#why-it-matters" class="hash-link" aria-label="Direct link to Why it matters" title="Direct link to Why it matters" translate="no">​</a></h2>
<p>Initial setup is where people drop off most. Reducing the time to "first dish visible on my page" from an hour to five minutes is the difference between starting to use RestaPro today or putting it off until next week (which almost never comes).</p>
<p>Take a look at the <a class="" href="https://wiki.restapro.es/en/empezar/alta-restaurante">restaurant setup guide</a> and the <a class="" href="https://wiki.restapro.es/en/carta-digital/editor-carta">digital menu guide</a> for the details.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Team roles, editable profile, and legal page]]></title>
        <id>https://wiki.restapro.es/en/changelog/roles-equipo-y-legal</id>
        <link href="https://wiki.restapro.es/en/changelog/roles-equipo-y-legal"/>
        <updated>2026-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Invite your team with distinct roles, edit your profile with avatar, and a public legal page.]]></summary>
        <content type="html"><![CDATA[<p>A round of "ergonomics and compliance": if you are about to give your manager or floor lead access, it is now one click. And if your advisors ask, you have a public legal page ready.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="team-roles">Team roles<a href="https://wiki.restapro.es/en/changelog/roles-equipo-y-legal#team-roles" class="hash-link" aria-label="Direct link to Team roles" title="Direct link to Team roles" translate="no">​</a></h2>
<p>In <strong>Workspace → Members</strong> you can invite people with three levels:</p>
<ul>
<li class=""><strong>Owner</strong> (you). Full control. Only one owner allowed.</li>
<li class=""><strong>Admin.</strong> Manages reservations, menu, settings; cannot touch billing or delete the restaurant.</li>
<li class=""><strong>Staff.</strong> Sees and manages reservations, marks walk-ins; no access to marketing or settings.</li>
</ul>
<p>Every backoffice action respects those roles automatically. If a staff user tries to enter billing, they see a clear message instead of a technical error.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="profile-editing--avatar">Profile editing + avatar<a href="https://wiki.restapro.es/en/changelog/roles-equipo-y-legal#profile-editing--avatar" class="hash-link" aria-label="Direct link to Profile editing + avatar" title="Direct link to Profile editing + avatar" translate="no">​</a></h2>
<p>In your <strong>account</strong> you can now change your name, photo, and email. Photos upload to a private bucket (not public), with RLS policies that only let you touch your own.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="public-legal-page">Public legal page<a href="https://wiki.restapro.es/en/changelog/roles-equipo-y-legal#public-legal-page" class="hash-link" aria-label="Direct link to Public legal page" title="Direct link to Public legal page" translate="no">​</a></h2>
<p><code>restapro.es/legal</code> with privacy, terms, and legal notice ready to go. If your advisor asks you to link them from your own site, they are already published.</p>
<p>More in <a class="" href="https://wiki.restapro.es/en/workspace/roles-permisos">roles and permissions</a>.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[RestaPro opens its doors]]></title>
        <id>https://wiki.restapro.es/en/changelog/hola-mundo</id>
        <link href="https://wiki.restapro.es/en/changelog/hola-mundo"/>
        <updated>2026-03-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We're shipping the first version of RestaPro: an end-to-end management SaaS for restaurants, designed in Spanish.]]></summary>
        <content type="html"><![CDATA[<p>Today we are publishing the <strong>first version</strong> of RestaPro. It is the result of months thinking about what a hospitality management tool should feel like when it does not fight you.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-v1-includes">What this v1 includes<a href="https://wiki.restapro.es/en/changelog/hola-mundo#what-this-v1-includes" class="hash-link" aria-label="Direct link to What this v1 includes" title="Direct link to What this v1 includes" translate="no">​</a></h2>
<ul>
<li class=""><strong>Online reservations</strong> with a public page per restaurant (<code>restapro.es/c/your-restaurant</code>).</li>
<li class=""><strong>Reservations backoffice</strong> to handle day-to-day work (create, edit, cancel, mark arrival and no-show).</li>
<li class=""><strong>Digital menu</strong> with a public QR (<code>restapro.es/r/your-restaurant</code>).</li>
<li class=""><strong>Dashboard</strong> with the day's overview.</li>
<li class=""><strong>Auth</strong> with email + password.</li>
<li class=""><strong>Multi-restaurant</strong> from day one: a workspace can hold several locations.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="philosophy">Philosophy<a href="https://wiki.restapro.es/en/changelog/hola-mundo#philosophy" class="hash-link" aria-label="Direct link to Philosophy" title="Direct link to Philosophy" translate="no">​</a></h2>
<p>RestaPro is built around three principles we will defend on every feature:</p>
<ol>
<li class=""><strong>Spanish first, no shortcuts.</strong> No i18n, no English placeholders. Every word is written for someone who runs a kitchen, not for someone who runs APIs.</li>
<li class=""><strong>The restaurant owner should not have to read documentation to use the app.</strong> If a screen needs explaining, the screen is the problem.</li>
<li class=""><strong>The data belongs to the restaurant.</strong> CSV export, full deletion with one button, no lock-in.</li>
</ol>
<p>Welcome. If you have spent time in hospitality and something does not match how you work, write to us. RestaPro is the youngest tool on the market, and that is exactly why it can change fastest to fit you.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[The two weeks before opening the doors]]></title>
        <id>https://wiki.restapro.es/en/changelog/dos-semanas-antes-del-lanzamiento</id>
        <link href="https://wiki.restapro.es/en/changelog/dos-semanas-antes-del-lanzamiento"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[E2E smoke tests, legal page, Stripe billing, security hardening, and coffee. What happened between the beta and launch.]]></summary>
        <content type="html"><![CDATA[<p>By late February we had a beta running well with eight restaurants and a decision made: we open to the public on March 19. That left us about two and a half weeks. It feels short. It was.</p>
<p>We did not want a big-bang launch with horns and confetti. We wanted a calm launch: any restaurant owner could come in, sign up, pay, and start working without surprises. Sounds modest. Implies a long task list.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-closed-in-those-two-weeks">What we closed in those two weeks<a href="https://wiki.restapro.es/en/changelog/dos-semanas-antes-del-lanzamiento#what-we-closed-in-those-two-weeks" class="hash-link" aria-label="Direct link to What we closed in those two weeks" title="Direct link to What we closed in those two weeks" translate="no">​</a></h2>
<p>Here are the big items that landed in the home stretch:</p>
<ul>
<li class=""><strong>Automated HTTP smoke tests.</strong> A script (<code>npm run smoke:http</code>) that checks the critical routes return the right status code after every deploy. Nothing fancy, but enough to catch dumb regressions.</li>
<li class=""><strong>Minimal E2E coverage.</strong> Three critical flows verified manually before each release: full signup, public reservation creation, menu editing and publishing.</li>
<li class=""><strong>Complete legal page.</strong> Terms of service, privacy policy, cookie notice. We worked with a lawyer who specializes in SaaS to avoid copying dubious templates. Glossing over this was not an option.</li>
<li class=""><strong>Billing with Stripe portal.</strong> We did not reinvent the wheel: Stripe's customer portal handles subscriptions, payment methods, and invoices. We just integrated checkout and webhooks.</li>
<li class=""><strong>Security hardening.</strong> RLS policy audit, service-role review, secret rotation, alerts on 500 errors. The dull but essential stuff.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-day-we-almost-broke-the-database">The day we almost broke the database<a href="https://wiki.restapro.es/en/changelog/dos-semanas-antes-del-lanzamiento#the-day-we-almost-broke-the-database" class="hash-link" aria-label="Direct link to The day we almost broke the database" title="Direct link to The day we almost broke the database" translate="no">​</a></h2>
<p>There was a scare, of course. Four days before launch, a migration touched a large table and blocked queries for 90 seconds. In real production, that is an eternity. The beta noticed, but no one was doing anything critical at that moment. Immediate decision: from then on, no migration goes out without a written rollback plan reviewed by two people.</p>
<p>That rule still stands today.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-left-out-on-purpose">What we left out on purpose<a href="https://wiki.restapro.es/en/changelog/dos-semanas-antes-del-lanzamiento#what-we-left-out-on-purpose" class="hash-link" aria-label="Direct link to What we left out on purpose" title="Direct link to What we left out on purpose" translate="no">​</a></h2>
<p>The temptation to add "one more feature" before launch is enormous. We had to say no to several things:</p>
<ul>
<li class="">Full dark mode. The styles were ready but not thoroughly tested.</li>
<li class="">TheFork integration. We knew we would do it, but not on day one.</li>
<li class="">Native mobile app. The responsive web covered 95% of cases.</li>
<li class="">Automated SMS marketing. Email first, SMS later.</li>
</ul>
<p>All of that ended up shipping in the following weeks, as you can see in later posts on this blog.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-day-before">The day before<a href="https://wiki.restapro.es/en/changelog/dos-semanas-antes-del-lanzamiento#the-day-before" class="hash-link" aria-label="Direct link to The day before" title="Direct link to The day before" translate="no">​</a></h2>
<p>On the night of March 18 we activated payments in production, ran a final deploy, and let the smoke tests run. Zero errors. We closed the laptop with that strange feeling of having reached the starting line after running half a marathon. The actual launch, with its own stories, is told in the first post on this blog: <a class="" href="https://wiki.restapro.es/en/changelog/hola-mundo">"RestaPro opens its doors"</a>.</p>
<p>From that day on, RestaPro stopped being a project and started being a tool used by real people every night.</p>]]></content>
        <author>
            <name>RestaPro Team</name>
            <uri>https://www.restapro.es</uri>
        </author>
    </entry>
</feed>