Appearance
Locations
Overview
Locations represent physical business locations (stores, restaurants, branches). Each location has its own profiles, address, operating hours, and order settings. All other features are scoped to locations.
Purpose
This page lets you configure your physical business locations with addresses, contact details, operating hours, and order behavior settings.
Key Concepts
- Location: A physical store, restaurant, or branch with its own settings
- Business Profile: The business (payment) profile the location belongs to — its payment providers, and the billing profile Upvendo invoices it through
- Branding Profile: Visual theme for kiosk and online ordering at this location
- Operating Hours: Days and times when customers can place orders
- Customer prep time: Average minutes needed to prepare an order (affects earliest pickup time)
- Restricted Dates: Specific dates when the location is closed (holidays, etc.)
Route
- Backoffice Route:
/settings/locations(list) - Add Location:
/settings/locations/new—newis the literal add-mode sentinel; any other value in that slot puts the form in edit mode - Edit Location:
/settings/locations/:id
Actions
Add Location
Click "Add Location" to create a new location. Fill in all required fields and save.
Edit Location
Click "Edit" on an existing location to modify its settings.
Export Locations
Export location data for reporting or backup.
Delete Location
Delete Location removes a location, but only while nothing is still using it. The confirmation dialog says so up front — "A location can only be deleted while nothing is still using it" — and asks you to type the location name before the Delete button will act.
Before it will go through:
- Detach any devices, items, menus and offers still assigned to this location. The delete is refused with a message naming what is holding it — "Location is being used by Devices", and likewise for Device Profiles, Inventories, Items, Menus, Offers, Variant Groups or Transactions.
- A location with transactions or an active subscription cannot be deleted at all. Order history is never detachable, so once a location has taken an order, delete is no longer the right tool.
For a location with history, set its Status to Inactive instead. Deactivating can be undone where deleting cannot — but it cancels the location's active subscriptions on the way, and switching back to Active does not re-create them. See Status.
Deleting a location needs the delete-locations permission, in the Location Management group — see Permissions.
(Verified: upvendo-backend app/Services/BackOffice/Settings/LocationService.php:907-927 — the active-subscription check then checkIsLocationDeletable(); app/Repositories/LocationRepository.php:125-145 — the eight blocking relations; upvendo-backoffice src/plugins/i18n/locales/modules/en/locations.ts:198-212 — the confirmation dialog copy.)
Form Sections
Business Profile
The section is titled Business Profile — "Which business profile this location belongs to". You pick one business profile; the location's billing profile is worked out from it rather than chosen separately.
Terminology. "Business profile" is what the back office calls a payment profile (
payment_profile_idin the API). The guided-setup step reads Set up Business Profile. See Payments.
| Field | Type | Required | Description |
|---|---|---|---|
| Business Profile | Select | No | The business (payment) profile for this location — payment providers for online ordering and in-person payments (optional — can be set up later). Hidden for Square-integrated accounts |
| Billing Profile | Shown under the business profile | No | Billing/invoicing settings (billing_profile_id), used for Upvendo-platform invoicing — a merchant invoiced by a reseller does not need one. Normally not picked by hand: once a business profile is selected, the form looks up which billing profile belongs to it and shows the result (see below). Optional on the form and in the API |
| Branding Profile | Select | No | Visual theme for kiosk and online ordering. Optional on create and update — the same StoreLocationRequest serves both, and it only checks that the profile exists when one is provided. Consumers fall back to the merchant/platform default branding |
What appears under the business profile for billing:
| You see | Meaning |
|---|---|
| "Select a business profile first" | No business profile chosen yet; billing follows from it |
| "Billed through billing profile "name"" | One billing profile belongs to this business profile; it is set for you and shown read-only, with its address and VAT number |
| A Billing Profile picker with "This business profile has more than one billing profile — choose the one that bills this location." | Several billing profiles could apply. The picker lists only those candidates, and a choice is required before you can save |
| "No billing profile yet" with a Set up billing link | This business profile has no billing profile. The location saves without one; the link opens that business profile's Billing tab |
| A plain Billing Profile picker | There is nothing to derive from — a Square-integrated account (no business profile selector), or a merchant with no business profiles. If the lookup failed instead, the form says "Billing could not be derived from the business profile; choose it manually." |
Business Logic:
- A billing profile already saved on a location is never changed behind your back. Once an existing location has a billing profile, its billing row stays read-only (except while choosing between several candidates). It is filled in automatically only when the location has none yet, or when you move the location to a different business profile — and even then nothing changes until you click Save.
- Billing profiles flagged incomplete (no Stripe customer yet) stay selectable in the dropdown — the location saves with the link and the Stripe customer ID is stamped on later, once the profile's billing details are completed.
- A location already linked to a different billing customer cannot be silently re-pointed through this field: the save is rejected with "This location is already linked to a different billing profile." Selecting a profile that no longer exists returns a not-found error.
- Locations linked the old way carry only
stripe_customer_id. When the form loads it resolves the matching profile so the selector shows the existing link, and saves from then on sendbilling_profile_id.
Status (edit mode only)
A Status selector (Active / Inactive) sits in the header of the location form when you open an existing location. Deactivating a location — switching it off, taking it out of service, setting it to inactive — is done here and nowhere else. The Settings → Locations list shows each location's status as a coloured chip, but that chip is a label, not a control: seeing your location listed there is not the same as being able to change it, so open the location itself. The selector does not appear while you are adding a new location.
You need the Manage Location Billing permission. Changing a location's status is gated on manage-location-billing, which lives in the Location Management group and is granted to the merchant owner only by default. It is deliberately not part of edit-locations: a team member who can edit every other field on the location still cannot deactivate it. If the change is refused, that permission is what is missing — ask the account owner to make the change or to grant it. See Permissions.
What switching to Inactive does:
- It cancels the location's active subscriptions. Each active subscription on that location is cancelled with Stripe, apart from any already set to stop at the end of the current period — those are left to run out on their own. This is why the permission is owner-only.
- Square is the only connected system that learns the new status. A Square-linked location triggers a sync that normally carries the change across, so Square sees the location go inactive. Nothing else does. An active Deliveroo integration is re-synced, but that sync re-sends the location's opening hours only and carries no status. MplusKassa, Lightspeed, ShopCaisse and Kassanet (Hendrickx / Vanhoutte) are not contacted at all. Deactivating here therefore does not close the location on Deliveroo or on those tills — if you need it closed there, switch it off in that system too.
- It is reversible, but the subscriptions are not. Setting Status back to Active restores the location; it does not re-create the subscriptions that were cancelled. Those have to be subscribed again.
Switching to Inactive while the location has active subscriptions opens a confirmation dialog warning about the billing impact, which requires typing the location name before it will act. Every other status change — including reactivating — asks a short confirmation first: "Change this location's status now? It is applied immediately, without saving the form."
The status can also change on its own, driven by subscriptions. When a location's last active subscription is cancelled, the location is set to Inactive automatically; when a subscription on the location becomes active again, it is set back to Active automatically. A location can therefore show a status nobody picked by hand.
Deactivating is a billing and administrative action. If what you actually want is to stop taking orders — for a day, a holiday, or a stretch of time — use Business Hours or Restricted Dates instead. Those are the controls built for closing.
(Verified: upvendo-backend routes/api/backoffice/settings/locations.php:27 — PUT /locations/{id}/status behind manage-location-billing; app/Constants/Permissions.php:154-157 — owner-only by default; app/Services/BackOffice/Settings/LocationService.php:902-918 — subscription cancellation, then the third-party sync call; app/Traits/IntegrationTrait.php:119-151 — that sync reaches Square and Deliveroo only, with the MplusKassa branch commented out and no other POS in the path; app/Services/BackOffice/Square/SquareLocationSync.php:503-560 — syncSingleLocation reconciles both directions and pushes only when the direction resolves to upvendo_to_square, with status in the pushed payload at :161; app/Jobs/SyncLocationToDeliverooJob.php — posts /opening_hours only, carrying no status; app/Services/Common/SubscriptionService.php:657-664 and :666-698 — the automatic flips in both directions; upvendo-backoffice src/views/settings/Locations/forms/LocationProfile.vue:100-112,168-186 — header placement, edit-mode gate and the confirmation condition.)
Stripe Card Terminal Address Sync
When a location's business profile uses Stripe for in-person (card terminal) payments, saving the location triggers a background sync that registers a matching Stripe Terminal Location using the location's address. If Stripe rejects the address (most commonly an invalid or incomplete postal code), the rejection is recorded on the location as stripe_terminal_sync_error ({message, failed_at}) and surfaced to the merchant until a later sync succeeds, which clears it automatically:
- Location form: a warning banner ("Card terminal setup failed") appears at the top of the form, with the detail text "Stripe reported:
<message>" and guidance to check the address, especially the postal code, and save again. - Locations list: an error-colored "Card terminal sync failed" chip appears next to the location (alongside the "Payment not configured" chip if applicable); hovering it shows the Stripe rejection message.
- This sync/warning is specific to Stripe in-person payments — it does not apply to Viva Wallet or Square in-person configurations.
General → Location Details
| Field | Type | Required | Validation | Description |
|---|---|---|---|---|
| Location Name | Text | Yes | - | Name shown to customers |
| Description | Textarea | No | - | Internal description |
| Location Type | Select | Yes | - | Category of location |
| Preferred Display Language | Select | Yes | - | Default language for this location |
Business Logic:
- The Preferred Display Language picker only lists languages that are Published. If none are published (or you need another), use the Add Language entry at the bottom of the picker instead of leaving the form. The entry appears for users with the
create-languagepermission; creating a language there also publishes it immediately and selects it — unlike Settings → Languages, where a new language is created Unpublished and must be published separately. Publishing is itself anedit-languageaction, so a role withcreate-languagebut notedit-languagecan create the language from the picker but the automatic publish step is rejected. - For locations imported from a POS (e.g. MplusKassa), a read-only hint reading
Imported from POS as "<name>"appears under the Location Name field, showing the original branch name from the POS. This hint is shown whenever the location has a POS-provided name (pos_name), whether or not the merchant has since renamed it — the field itself (pos_name) is not editable by the merchant.
Contact Details
| Field | Type | Required | Validation | Description |
|---|---|---|---|---|
| Yes | Valid email | Contact email | ||
| Phone | Phone | Yes | Valid phone with country code | Contact phone |
| Category | Select | Yes | - | Business category |
Address
The Address section opens with the Country select — always visible, and carrying the hint "Used to search for your address. It is automatically set to match your map pin." — followed by a Search address autocomplete. The four typed fields (Address Line 1, Address Line 2, Postal Code, City) are hidden on a new location until you pick a suggestion, drop or move the map pin (which reverse-geocodes and fills them in), or click Enter address manually. On an existing location that already has an address line, city or postal code, they render straight away. Picking a search suggestion writes the whole formatted address into Address Line 1, and both the suggestion and the pin overwrite Country — the pin is authoritative for country. The coordinates row shows "Drop a pin on the map to set the coordinates" until a pin exists; Edit manually reveals the Latitude/Longitude inputs.
| Field | Type | Required | Description |
|---|---|---|---|
| Address Line 1 | Text | Yes | Street address |
| Address Line 2 | Text | No | Suite, floor, building |
| Postal Code | Text | Yes (form) | ZIP/postal code. Required by the back-office form; the API rule itself allows it to be empty |
| City | Text | Yes | City name |
| Country | Select | Yes | Country. On a new location it pre-fills from the selected business profile's country, and stays editable |
| Geolocation | Map | Yes (to save) | Interactive map to set pin |
| Latitude | Number | Yes (to save) | Auto-filled from map pin (pinpoint.lat) |
| Longitude | Number | Yes (to save) | Auto-filled from map pin (pinpoint.lng) |
Business Logic:
- Geolocation map allows clicking to set coordinates
- The map never auto-places a pin. Click the map, drag the marker, pick an address from Search address, or use Edit manually to type coordinates
- Latitude/longitude (
pinpoint.lat/pinpoint.lng) are not enforced by the form's field validation, but the save still fails without them: the backend derives the location's timezone and Google address from the pin and returns "We failed to get the address details from the pinpoint location. Please try again later." when there is no usable pin - If the geocoded country of the pin does not match the selected Country, the save is rejected with "Country code mismatch. Please check your pinpoint location."
- The map pin is also required for online-ordering readiness (see the Ready / Partial / Incomplete badge); a location without a pin counts as missing geolocation for online ordering
- Coordinates used for delivery distance calculations and map display
- Address shown on receipts and order confirmations
Operating Hours
Define when customers can place orders at this location.
- Days: Monday through Sunday (checkbox per day)
- Add Times: Set open/close times per day (multiple time ranges supported)
- Select All: Apply same hours to all days
Business Logic:
- Hours determine when online ordering is available
- Outside operating hours, customers see "Location closed"
- Multiple time ranges per day supported (e.g., 11:00-14:00, 17:00-22:00)
Restricted Dates
Add dates when the location will be closed (holidays, renovations, etc.).
- Click "+" to add a restricted date
- Location will be unavailable for orders on these dates
- Each row can be a single date or, by enabling Date range, a span from a start date (
date_from) to an end date (date_until) — the end date must be on or after the start date - A "Repeats every year" (
yearly) checkbox makes a single date recur annually. This option is unavailable while a row is in date-range mode
Order Behavior
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| Customer prep time | Number (minutes) | Yes | 20 | Average time to prepare an order (the field shows the hint "Default: 20 minutes"; the Online Ordering page's read-only chip still labels the same value "Preparation time") |
Customer prep time is the only control in this section.
Business Logic:
- Customer prep time: Affects the earliest available pickup, delivery and online eat-in time
- Earliest time = Now + Customer prep time + Channel Delay (
takeout,deliveryoreat_in) - The same number is quoted in two places and they agree: the nearby-restaurants list customers browse before ordering, and the time-slot picker at checkout. (Verified:
app/RawModels/Location.php:2001-2018is the single rule;getOnlineOrderingPrepTime()at:2072-2087andapp/Services/OrderCapacity/OrderCapacityService.php:86-89both call it.)
- Earliest time = Now + Customer prep time + Channel Delay (
Emily-drafted fields
Emily can pre-fill the location form for you. If you are not already on a location form she opens the new-location form (/settings/locations/new) first, then merges her draft into the fields. Every section she touched shows a chip reading "Emily filled this — review and Save" — the sections wired up for this are the name/description/type/language block, contact details and category, address and map pin, operating hours, restricted dates, and preparation time.
Nothing is saved until you click Save: the draft is inert, and the chip is only a marker in the back office — it is never sent to the server.
Business Rules
- A location name is required, but it is not required to be unique within the merchant account (the uniqueness check is not currently enforced)
- Phone is required — validation enforced
- A location can have only one of each profile type (business/payment, billing, branding); the billing profile is derived from the business profile
- A location can only be deleted while nothing references it. The delete is refused — naming the blocker — when any Device Profile, Device, Inventory, Item, Menu, Offer, Variant Group or Transaction still points at it, and it is refused outright for a location with active subscriptions. Deactivating (Status → Inactive) is the path for a location with history
- Deactivating a location is owner-only and cancels money. Setting Status → Inactive requires the
manage-location-billingpermission (Location Management group, granted to the merchant owner only by default — holdingedit-locationsis not enough), and it cancels the location's active Stripe subscriptions apart from any already set to stop at period end. Reactivating restores the location but does not re-create those subscriptions - Location status is also set automatically by the subscription lifecycle — Inactive when the last active subscription on the location is cancelled, Active again when a subscription on it becomes active — so it can change without anyone editing the location
- Operating hours must be set for online ordering to work
- Locations without operating hours are treated as always closed
- Customer prep time does not affect all order channels. It is applied to exactly three dining options on the online-ordering channel — delivery, pickup (takeout) and eat-in (For Here) — each with its own delay. Any other dining option gets a prep time of
0, and so do kiosk and table-QR ordering, which are immediate. (Verified:app/RawModels/Location.php:2003-2012— thematchmaps Delivery/Pickup/ForHere todelivery/takeout/eat_in, anddefault => nullshort-circuits toreturn 0;app/Services/OrderCapacity/OrderCapacityService.php:126-131returns0for any non-online-ordering channel and for table-QR sessions.) The value is still sent to kiosk devices assettings.average_prep_time_min(app/RawModels/Device.php:927); what the kiosk does with it is not verified here - A dormant backfill command exists and must not be run casually.
php artisan locations:backfill-average-prep-timeshipped to production with the prep-time unification but is unscheduled and has never been run anywhere. It refuses to run on production without--force, and its own error says why: it "changes a live prep promise and can pull the table-QR cutoff back" (app/Console/Commands/DataRepair/BackfillLocationAveragePrepTime.php:63-66,:78-80). Stamping the 20-minute default onto locations that currently read0would simultaneously raise their advertised prep time and move their Closing-Time-Minus-Prep-Time table-QR cutoff earlier. Running it is a product decision, not a cleanup. - Changes to location settings take effect:
- Online Ordering: On next page load
- Kiosk: After app sync/reload
Logic Flows
Location Selection (Online Ordering)
Customer opens Online Ordering
│
▼
Multiple locations?
├── Yes → Show location selector
│ Customer chooses location
│ Load location's menu and settings
│
└── No → Load single location automaticallyLocation-Scoped Settings
Location
├── Business Profile (business profile → derived billing; branding)
├── Operating Hours
├── Restricted Dates
├── Order Behavior
├── Menus (assigned)
├── Delivery Zones
├── Order Capacity
└── Devices (kiosks assigned)Customer Impact
- Kiosk: Uses assigned location's menu, branding, and settings
- Online Ordering: Location selector, hours, address displayed
- Receipts: Location name, address, phone printed
- Delivery: Location's delivery zones determine availability
FAQs
"How do I add a new location?"
"Where do I change my store's address?"
"How do I set opening hours for my location?"
"Can I have different menus per location?"
"Why is my location showing as closed?"
"How do I close my store for a holiday?"
"Where do I set the preparation time?"
"Can I use different branding per location?"
"Is the business profile (payment profile) required when I create a location?" No. The business profile is optional — you can save a location and configure payment later. If it's not set up, the location shows a "Payment not configured" chip in the Settings → Locations list. The chip appears whenever the location has no business profile; it is not suppressed for Square-integrated accounts, even though the Business Profile selector itself is hidden for them.
"Which profile is actually mandatory to create a location?" None. Business (payment), Billing and Branding profiles are all optional at creation — the form submits with none of them selected, and the API accepts all three as empty. A fresh merchant can create their first location before setting up branding or billing. The form still pre-selects a default for each profile type if one is marked as default, so they often look pre-filled.
"What is the 'Ready / Partial / Incomplete' badge next to my location?" It's an online-ordering completion indicator. A location is Ready only when Address, Business hours, and Geolocation (map pin) are all set; Partial if some are set; Incomplete if none. Hovering the badge lists exactly which fields are missing.
"My location says it's missing 'Geolocation' even though I typed the address — why?" The map pin (latitude/longitude) is tracked separately from the typed address and is required for online ordering. Drop a pin on the map (or use "Edit manually" to enter coordinates) in the Address section — an address with no pin still counts as missing geolocation.
"How do I deactivate a location instead of deleting it?" Go to Settings → Locations, click the location to open it, and use the Status selector in the header to switch between Active and Inactive. The status chip in the locations list is only a label — the selector inside the location is the control. If the location has active subscriptions, you'll get a confirmation dialog and must type the location name to deactivate.
"I can't find a button to set my location to inactive / I see my location but can't switch it off." Two things are usually behind this. First, the control is inside the location, not on the list: the Settings → Locations list shows the status as a coloured chip, but you change it by opening the location and using the Status selector in its header (it only appears for a location that already exists). Second, changing status needs the Manage Location Billing permission (
manage-location-billing), which only the merchant owner holds by default — someone who can edit the location's other fields still cannot deactivate it. If you are not the owner, ask them to make the change or to grant you that permission."What happens when I set a location to Inactive?" Its active subscriptions are cancelled with Stripe — apart from any already set to stop at the end of the current period, which run out on their own. A Square-linked location normally has the new status pushed to Square as well. Nothing else learns of it: Deliveroo is re-sent the location's opening hours only, with no status, and MplusKassa, Lightspeed, ShopCaisse and Kassanet are not contacted at all — so deactivating in Upvendo does not close the location on Deliveroo or on your till. That billing impact is why only the owner can do it, and why you're asked to type the location name to confirm when subscriptions are active. You can switch back to Active at any time, but that does not bring the cancelled subscriptions back; they have to be subscribed again.
"My location changed to Inactive (or back to Active) and nobody touched it." Location status follows subscriptions. When the last active subscription on a location is cancelled, the location is set to Inactive automatically; when a subscription on it becomes active again, it is set back to Active. If the status and the selector seem to disagree, look at the location's subscriptions first.
"I want to close my shop for a while — should I deactivate the location?" No. Deactivating is a billing action and it cancels the location's subscriptions. To stop taking orders for a day, a holiday or a longer stretch, use Business Hours or Restricted Dates instead — those close the location without touching its subscriptions.
"What's the difference between deactivating and deleting a location?" Deactivating sets the status to Inactive and can be undone — though it cancels the location's active subscriptions on the way, and switching back to Active does not re-create them, so it is the location that is reversible, not its billing. Delete Location cannot be undone, and it only works while nothing still points at the location — you'll be asked to type the location name to confirm. In practice delete is for a location you set up but never used: as soon as it has transactions (or an active subscription) it can't be deleted at all, and deactivating is the way to take it out of service.
"Why won't my location delete?" Something is still using it. The refusal names what — devices, device profiles, items, menus, offers, variant groups, inventories or transactions. Detach those first. Transactions and active subscriptions can't be detached, so a location with order history should be set to Inactive rather than deleted.
"How do I set a recurring closure, like the same holiday every year?" In Restricted Dates, add a date and tick "Repeats every year" so it recurs annually. You can also switch a row to Date range mode to close across a span of consecutive days.
"I changed the business profile and got a warning — what does it mean?" "Changing the business profile re-onboards in-person payments: this location's terminals will be unpaired and must be re-paired afterwards." The warning appears only when the newly chosen business profile has an in-person payment provider. Continue only if you're prepared to re-pair the terminals.
"Where do I choose the billing profile for a location?" You normally don't. Pick the location's Business Profile and the billing profile that belongs to it is filled in and shown underneath ("Billed through billing profile …"). You only choose by hand when the business profile has more than one billing profile, or when there is no business profile to derive from (for example on a Square-integrated account). If it says "No billing profile yet", use Set up billing to create one on that business profile's Billing tab.
"Can I set the timezone for my location?" There is no timezone field -- not on the location, and not in account settings. The timezone is derived from the location's map pin: when you drop or move the pin the backend looks the timezone up from those coordinates (falling back to the postal code if that lookup fails) and stores it. So the way to correct a wrong timezone is to correct the pin under Address -> Geolocation and save; opening hours, order slots and reports follow from it. A location that has never resolved one is treated as
Europe/Brussels. (Verified:upvendo-backendapp/Services/BackOffice/Settings/LocationService.php:223and:254-255,app/Services/Common/TimezoneService.php:58,99, fallbackapp/RawModels/Location.php:518-520;upvendo-backofficerenders no timezone input anywhere.)"Why can't I edit the type on one of my locations?" Locations synced from MplusKassa have type locked because it comes from the MplusKassa branch and can't be overridden in Upvendo. (
timezoneis listed alongside it as locked, but no timezone field is rendered for anyone, so the lock is not something a merchant can see.) The Location Name is editable even for MplusKassa-synced locations — you can rename it freely; the original POS branch name is kept and shown as a read-only hint under the Location Name field (e.g.Imported from POS as "<name>") for reference."How do I export my locations?" On the Settings → Locations list, click Export (top right). It downloads an Excel file named
locations_export_<date>.xlsxand respects any active search filter."Is a postal code required for a location address?" Yes. Address Line 1, Postal Code, City and Country are all required by the form; only Address Line 2 is optional. (The API rule for postal code allows it to be empty, but the form won't submit without it — and Stripe card-terminal registration needs a valid postal code.) The Country field also auto-syncs to match your map pin, so dropping/moving the pin can update the country.
"Why do I see a 'Card terminal setup failed' warning on my location?" Your location's business profile uses Stripe for in-person (card terminal) payments, and Stripe rejected the location's address when trying to register a matching Terminal Location — most often an invalid or incomplete postal code. Double-check the address (especially Postal Code) under Address and save again; the warning banner on the form and the "Card terminal sync failed" chip in the locations list both clear automatically once a sync succeeds.
Troubleshooting
Saving a location fails with "The name has already been taken" → Location names are not required to be unique and that check is no longer applied on save, so a current save should not produce it. If you do see it, you are almost certainly not saving a location: the same message is raised for the things that are unique per merchant -- payment, billing and branding profiles, menus, items, devices, device profiles, display groups, modifier groups and offers. Check which form you are on. (Historically the check did run on locations and would reject an edit that only changed the address; that is fixed. Verified: the rule is commented out at
upvendo-backendapp/Http/Requests/BackOffice/Settings/Location/StoreLocationRequest.php:111-119; the message comes fromapp/Rules/UniqueInConnectionWithModel.php:98.)Location not showing in online ordering → Check if operating hours are set and location is enabled
Wrong times showing → Check the map pin (the timezone is derived from it, there is no timezone field) and the operating hours
Location shows as closed → Check operating hours and restricted dates
Map pin in wrong place → Click on map to reposition or enter coordinates manually
Can't save location → Ensure phone number is filled in (required field)
"My location is not found" / location not ready for online ordering → This is almost always a missing map pin (Geolocation). Open the location in Settings → Locations, go to Address → Geolocation, and click the map to drop a pin (or use "Edit manually" to enter coordinates), then Save. The typed address does not set the pin on its own; a location with no pin (or a pin at
0,0) keeps showing "Missing: Geolocation" and stays Partial/Incomplete for online ordering."Card terminal setup failed" warning / "Card terminal sync failed" chip → The location's business profile uses Stripe for in-person payments and Stripe rejected the address when syncing the Terminal Location (commonly a bad postal code). Fix the address under Address and save; the warning clears automatically once the next sync succeeds.
Can't find a control to deactivate a location / can't set it to Inactive → The Status selector is in the header of the location itself, not on the Settings → Locations list (where status is shown as a read-only chip), and it only appears for a location that already exists. If you can see the selector but the change is refused, you are missing the Manage Location Billing permission (
manage-location-billing) — it is owner-only by default and is not included in Edit Locations.A location switched to Inactive (or back to Active) on its own → Status follows subscriptions: cancelling the last active subscription on a location deactivates it, and a subscription becoming active reactivates it. Check the location's subscriptions rather than the selector.
Assistant Guidance
When answering questions about locations:
- Use clear navigation: "Go to Settings → Locations"
- For new locations, walk through the form sections in order
- If location appears closed, check: operating hours, restricted dates, timezone
- For multi-location merchants, clarify which location they're asking about
- Mention that a location picks one Business Profile (its billing follows from it) and a Branding Profile — do not tell merchants to pick a payment profile and a billing profile separately
- Preparation time affects when customers can place orders — suggest 15-30 min for most restaurants
- For MplusKassa-synced locations, only type and timezone are locked — the name is editable (the original POS name stays visible as a hint)
- A "Card terminal setup failed" warning or "Card terminal sync failed" chip means Stripe rejected the location's address (usually the postal code) while syncing the card terminal — point the merchant to fix the address, not the business profile itself
- "I can't set it to inactive" is a locations question even when it isn't asked on the Locations page. Merchants ask this from wherever they happen to be. Send them to Settings → Locations → open the location → Status in the header, and say plainly that the status chip in the list only displays the status and does not change it — that mismatch is usually what they are stuck on
- Always mention the permission when answering a deactivation question. Changing status needs Manage Location Billing (
manage-location-billing), owner-only by default and not part of Edit Locations. A merchant who "cannot find the button" may simply not be the owner - Never present deactivating as a way to close temporarily. It cancels the location's subscriptions, and reactivating does not restore them. When someone wants to stop taking orders for a period, point them at Business Hours or Restricted Dates instead
- Never imply that deactivating propagates to a merchant's other systems. Square is the only connected system that learns the new status. Deliveroo is re-sent opening hours only, and MplusKassa, Lightspeed, ShopCaisse and Kassanet are not contacted at all — so a merchant who deactivates in Upvendo is still open on those. Say so rather than letting them assume it carried across
- If a merchant reports a status they did not set, check subscriptions before anything else — status is flipped automatically in both directions by subscription lifecycle
Relations
Depends On
- Merchant Account: Locations belong to merchant
- Profiles: Business profile (with derived billing) and Branding profile assigned to locations
Affects
- All location-scoped features:
- Menus
- Delivery Zones
- Order Capacity
- Devices
- Business Hours
- Inventory