Skip to main content

Sales

First-time workspace setup

After Integrations (setup step 12) and Listings (step 13), link units on Channels and monitor availability here — see Getting Started — Distribution & channels (optional). Complete core setup steps 1–15 before channel imports at scale. Workflow pairing: Modules — Setup sequence after go-live.

The Sales module is where you review portfolio availability and rent levels, edit monthly prices in bulk, and manage channel manager connections to external platforms.

Direct access

Open the Sales module at platform.vivin.app/sales. Primary tab routes include /sales/overview, /sales/multicalendar (Multicalendar — availability timeline), /sales/pricing (Pricing — monthly rent grid), and /sales/channels. Legacy bookmark /sales/calendar redirects to /sales/pricing. Bookmarks to /sales/channel-manager open the Channels tab. See Deep Links for all routes.

Tab URLs

Any unknown Sales tab slug (without a documented legacy alias) redirects to /sales (Overview) so the address bar matches the tab you see. Legacy /sales/calendar redirects to /sales/pricing (the Pricing grid). See Deep Links — Invalid, legacy, and mistyped URLs.

Pair with other modules

Month-range KPIs live in Analytics; reconcile Overview heatmaps with Dashboard Vacant Units and Bookings → Timeline. When a dip looks tied to one listing type or tenant segment, use Select tags / Select listing types here first, then Bookings — Other filters tenant category and Finance — Tenant category filterPortfolio KPI review — Step 6. During Portfolio KPI review — Step 7, pair occupancy/revenue reconciliation with AI usage API (landlord_chat, utility_bill_extraction) when assistant or utility-bill extraction volume should explain operational cost. Channel-imported reservations with unpaid schedules can surface payment overdue rows — row-click opens the booking for Handling a Late Payment — Step 1. Section-to-doc pairing: Sales section cross-reference. Hub tab matrix: Modules — Module cross-reference.

The module has four tabs: Overview (KPIs, occupancy forecast, and availability views), Multicalendar (unit × time Gantt without rent cells — route /sales/multicalendar), Pricing (listing × month grid with occupancy and monthly rents — route /sales/pricing), and Channels (integrations list and per-unit linking).

Four-tab Sales shell (#1747)

Current management builds (since #1747, merged June 2026) expose four Sales tabs: Overview, Multicalendar (/sales/multicalendar — unit × time Gantt without rent cells), Pricing (/sales/pricing — monthly rent grid), and Channels. Legacy bookmark /sales/calendar redirects to /sales/pricing. Older deployments that predate #1747 used a three-tab shell where the monthly rent grid lived at /sales/multicalendar — if you still see that layout, deploy a current build before following route-specific steps below.

Directory load failures

When the shared Sales data request fails on first load, the whole module shows a red alert card under the page header — Failed to load sales data. Please try again. — with optional server detail and a Retry button. All four tabs (Overview, Multicalendar, Pricing, Channels) are blocked until the fetch succeeds; this is not the same as filters that match zero listings.

A successful fetch with no rows for your search still shows the normal empty grid — not this error state. See Glossary — Directory list load failures and FAQ — list page load failures.

Mobile and narrow layouts

Sales uses the shared management bottom tab bar on viewports below 768px (same breakpoint as Operations):

PatternWhen it appliesWhat changes
Bottom tab barBrowser width < 768pxFixed footer tabs switch between Overview, Multicalendar, Pricing, and Channels. The page adds bottom padding (pb-20) so grid content is not hidden behind the bar.
In-tab tab pillsMulticalendar, Pricing, or Channels active on narrow widthThe sticky pill strip under the page header is hidden on these tabs. Each tab body renders its own salesTabRow — the same four tab pills repeated at the top so you can switch views without scrolling back to the module header.
Desktop≥ 768pxOne sticky pill strip under the Sales header for all tabs; Multicalendar, Pricing, and Channels do not duplicate pills inside the tab body.

On Channels, the in-tab row may also show platform icon chips on the right (your enabled marketplace integrations) beside the tab pills.

Sales — Pricing tab on a narrow viewport with in-tab pill row and bottom tab bar (four Sales tabs)

Field use vs Operations phone shell

Narrow Sales layout is a responsive pattern — you can still open Dashboard, Bookings, and other modules from the mobile drawer. It is not the Operations-only phone route guard that locks non-Operations URLs on actual mobile phone user agents. See Operations — Phone-only operations shell.

Sales Overview Tab

Screenshot freshness

Sales Overview full-page capture refreshed 2026-06-22 03:25 UTC (VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL npx tsx tools/capture-sales-overview-tab-screenshot.ts — replaces a prior Retool editor leak).

Overview tab

Pair with other Sales sections

The Overview tab is the default /sales view. It combines a KPI strip, the same Occupancy forecast chart family used on the Dashboard, and an Availability over time workspace so you can see where units go free and how many listings are free on a given day.

KPI cards

CardWhat it shows
Occupancy rateShare of listings with an active stay or block today (bookings plus unavailabilities such as manual blocks or short-term iCal), with occupied vs total counts.
TodayHow many listings count as free rooms today, with optional subtitle segments for mid-term stays, short-term (for example Airbnb / Booking.com style) stays, and manual blocks when those buckets are non-zero. Refunded-but-active stays still count as occupied for this headline so the number matches the Dashboard Today card and Multicalendar Available now; other Overview KPIs (for example Revenue this month) keep using non-refunded booking sets.
Ending this monthCount of bookings whose move-out falls in the current calendar month.
Cached Overview vs live “Today”

Most Sales → Overview metrics (occupancy rate, revenue, forecast bars, availability charts) come from a cached snapshot refreshed on a schedule. The Today / free rooms headline is the exception — it is recomputed live on each load so it always agrees with Multicalendar → Available now and the Dashboard Today card. After availability changes, refresh the tab before you compare Today with a chart that may still reflect the prior cache window. Preferences → Vacant Unit Preference (Include manual blocks) also applies to Today, Available Now, occupancy bars, and Multicalendar Available now / Date range filters — manual operator blocks no longer suppress those surfaces; OTA/iCal and booking-linked holds still do.

| Revenue this month | Expected rent for the current month, calculated proportionally for partial stays (not only full-month contracts). |

Use the info icons on each card in the product for the full in-app definitions.

Occupancy forecast

The wide chart on the right reuses the Occupancy forecast interaction from the Dashboard (past plus forward window, horizon controls, occupied counts and ADR context). See Dashboard — Occupancy Forecast for behaviour detail. For a month-end reconciliation pass that compares these KPIs with Analytics and Finance, use Portfolio KPI review.

Availability over time

Below the KPI row, Availability over time helps you spot when units go free and how many units are free in each bucket.

View modes

  • Timeline — each listing is a row of horizontal bars showing continuous free periods (between bookings and blocking unavailabilities). Pick a horizon (7d, 15d, 1m, 3m, 6m) to set how far forward the axis runs. Hover a bar for dates; click the chart on a day to open a popover listing all free units that day (and open a listing from there when your role allows).

Sales — Availability over time timeline with day-click popover listing free units on the selected date

  • Daily, Fortnightly, or Monthly — aggregated bar charts: each bar is how many listings are free for the entire day, fortnight, or month in that bucket. Use the period-count buttons (for example 30 Days or 6 Months) to change how many bars you see. Click a bar to highlight it and list the free units in that period.

Availability popover (partial load)

The free-unit list inside the day-click or bar-click popover loads in a second request after the main Overview KPIs and charts render. If that follow-up fetch fails, the popover shows Failed to load free units in red italic text while the rest of the tab stays usable — this is not the module-level Failed to load sales data card that blocks all four Sales tabs (see Directory load failures).

What still worksWhat failed
KPI strip, Occupancy forecast, and availability chartOnly the unit names inside the open popover

Close the popover (×), click another day or bar, or refresh the page after connectivity recovers. When the fetch succeeds but nothing is free in that bucket, the popover shows No free units in this period instead — that is a normal empty outcome, not an error.

Sales — Availability over time Daily bar popover with Failed to load free units while KPIs and chart remain visible

Screenshot freshness

Free-unit popover partial-load capture refreshed 2026-06-15 02:15 UTC (VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL npx tsx tools/capture-sales-overview-free-units-popover-load-error.tsGET /app-loader/sales/overview/free-units mocked to 503 after bar click).

See Glossary — Directory list load failures (Sales Overview popover row) and Portfolio KPI review when reconciling free-unit counts with Dashboard or Analytics.

Sales Availability Calendar Heatmap

The capture above shows the timeline-style availability view: coloured free windows per unit row, with the horizon selector in the header.

Sales Availability Over Time Chart

The second capture illustrates an aggregated availability mode (daily / fortnightly / monthly bar chart), including the view toggle next to the horizon controls.

Multicalendar tab (availability timeline)

Pair with other Sales sections

Multicalendar pairs with Bookings — Timeline view and Audit module — same-day turnover: Glossary — Same-day turnover. Full pairing matrix: Sales section cross-reference.

The Multicalendar tab uses route /sales/multicalendar. It is a unit × time Gantt in the same family as Bookings → Timeline, but scoped to Sales filters and without rent cells — mid-term bookings, short-term channel blocks, and manual unavailabilities only.

Scale and navigation

  • Day / Week / Month — switch the time axis granularity (same control family as Bookings Timeline).
  • Today — jump the viewport to the current date.
  • Listing axis — infinite scroll loads listing rows in batches as you scroll vertically.
  • Booking bar click — opens the booking detail sidebar from Sales without leaving the module.

Filters mirror the Pricing toolbar so you can scope the same portfolio slice on both tabs: Search, Available now / Date range, Number of rooms (min/max on units registered per property, #2151), Select tags, Select listing types, and Select properties (server-driven picker with chips).

  • Available now / Date rangeAvailable now keeps listings vacant today (no active booking; manual blocks exclude the row unless Preferences → Vacant Unit Preference is Include manual blocks). Date range opens Start date and End date pickers: with both dates set, only listings free on every day from start through end remain; with only a start date, only listings free on that single day remain. The timeline refetches when dates change (debounced). See the same semantics on Pricing — Toolbar filters.

Sales — Multicalendar toolbar with Date range selected and the calendar picker open (Start date / End date)

Sales — Multicalendar after a start–end date range is applied — pill shows selected dates and the timeline refetches to vacant-only rows for that window

Multicalendar date-range filter captures refreshed 2026-06-18 01:05 UTC (VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL VIVIN_DOCS_PROPERTY_SEARCH=AA-11-5D VIVIN_DOCS_DATE_RANGE_CAPTURE=both npx tsx tools/capture-sales-multicalendar-date-range-filter-screenshot.ts).

Sales — Multicalendar toolbar with Select tags and Select listing types controls

Sales — Multicalendar Select tags dropdown open on the toolbar

Sales — Multicalendar Select listing types dropdown open on the toolbar

After you pick tags and listing types, removable chips appear under the toolbar (with Clear all) while the timeline refetches:

Sales — Multicalendar active tag and listing-type filter chips on the toolbar

Multicalendar tag/type toolbar captures refreshed 2026-06-13 13:45 UTC (VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL VIVIN_DOCS_PROPERTY_SEARCH=AA-11-5D npx tsx tools/capture-sales-multicalendar-tags-types-toolbar-screenshot.ts). The Pricing tab uses the same Select tags / Select listing types controls — see Toolbar filters and export.

Sales — Multicalendar tab with Day / Week / Month scale, Sales filters, and unit × time availability bars (example search: AA-11-5D)

Walkthrough: on Multicalendar, filter to a property, click a booking bar, and open the booking detail sidebar without leaving Sales (captured on local management frontend with #1747; staging may lag until deploy).

Pricing tab (monthly rent grid)

Pair with other Sales sections

Pricing grid pairs with Listings — Rent Value tab — respect invoiced floor (rent) before lowering cells. Full pairing matrix: Sales section cross-reference.

The Pricing tab uses route /sales/pricing (the pill label reads Pricing in the English UI). It is the listing × month workspace: each row is a unit, each column is a calendar month, and cells show rent with occupancy blocks (bookings and unavailabilities) drawn behind the prices. Legacy bookmark /sales/calendar redirects to /sales/pricing.

Sales — legacy /sales/calendar bookmark redirects to the Pricing grid at /sales/pricing

Sales Multi-calendar — pricing grid with unit-only row labels in the first column and monthly rent cells

Reading the grid

  • Row label (first column) — The sticky left column shows the unit (listing) internal name only (for example AA-11-5D-R2). Property/building names are not repeated on every row; use Select properties chips, Search, and Select tags when you need building context.
  • Bookings appear as coloured spans in the month cells (active reservations).
  • Manual blocks and other unavailabilities use distinct styling so you can tell them from mid-term stays and short-term/channel blocks.
  • Short-term iCal imports (for example Airbnb or Booking.com calendar feeds) use the pink Short-term tint. Hover a block to read dates and a platform label; raw feed text such as CLOSED - Not available on Booking.com imports is shown as Booking.com in the tooltip (same normalization as the unit Calendar in Listings).
  • Rent is shown in each cell; cells without an explicit monthly override still reflect the listing’s configured rent where applicable.
  • Custom monthly overrides use the teal rent label; default inherited rent stays neutral grey until you set an explicit month price.
  • Recently edited cells (same browser session, after Apply on Edit Price) get a light blue background so you can spot which units and months you just changed before you scroll away or refresh. The highlight is session-only — it clears on a full page reload and does not mean the price is unsaved.

Grid legend

Below the toolbar, a Legend strip decodes occupancy colours, rent anomalies, and the current-day marker on the grid:

Legend item (English UI)Meaning
Mid-termBlue-tinted cell background — mid-term stay occupancy in that month.
Short-termPink-tinted background — short-term or channel-style blocks.
Manual blockAmber-tinted background — manual unavailability (not a paid booking).
VacantWhite / neutral cell — no booking or block covering that month.
Large change vs adjacent monthsAmber ring around a rent cell when the month’s price jumps sharply versus neighbouring months on the same row — investigate before publishing or syncing channels.
TodayRed vertical line across the grid — current calendar date for orientation when scrolling wide ranges.

The legend is read-only reference text; it does not filter rows. Large change rings are persistent until rents normalize or you edit the outlier month. Session blue highlights after Edit Price → Apply are separate — they show what you changed in the current browser session only (see Reading the grid above).

Sales Multi-calendar — toolbar filters and occupancy/rent legend strip above the pricing grid

Toolbar filters and export

Use the toolbar above the grid to narrow the row set:

  • Search — matches tenant, listing, email, property label, and related text on the row.
  • Available now / Date rangeAvailable now keeps listings that are vacant today. Date range uses Start date and End date pickers: with both dates set, only listings free on every day from start through end remain; with only a start date, only listings free on that single day remain.

Sales — Pricing toolbar with Date range selected and the calendar picker open (Start date / End date)

Sales — Pricing grid after a start–end date range is applied — pill shows selected dates and rows refetch to listings free across the whole window

Pricing date-range filter captures refreshed 2026-06-18 01:05 UTC (VIVIN_DOCS_SALES_TAB=pricing VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL VIVIN_DOCS_PROPERTY_SEARCH=AA-11-5D VIVIN_DOCS_DATE_RANGE_CAPTURE=both npx tsx tools/capture-sales-multicalendar-date-range-filter-screenshot.ts).

  • Min rent / Max rent — optional range pill; clear with the control beside the pill when set.
  • Number of rooms — optional min / max on how many units (listings) are registered under each property (#2151). Opens a popover like the rent-range pill; invalid min > max shows an inline error. Sent to the listings directory as minRooms / maxRooms and pairs with the same filter on Bookings → Other filters → Advanced.
  • Select tags / Select listing types / Select properties — multi-select chips. Select listing types filters by the same type labels configured under Settings > Categories. Select properties uses a server-driven property picker (search + infinite scroll over properties, not a single upfront list). Use Clear all (when filters are active) to reset search, view, rent range, rooms range, tags, types, and properties in one action. See Glossary — Listing type (filter) and the captures below (Pricing grid) and on the Multicalendar tab (timeline Gantt).

Sales — Pricing toolbar with Select tags and Select listing types controls above the rent grid legend

Sales — Pricing Select tags menu open with tag options from Settings &gt; Categories

Sales — Pricing Select listing types menu open with type options from Settings &gt; Categories

After you pick tags and listing types, removable chips render under the legend strip while the grid refetches:

Sales — Pricing active tag and listing-type filter chips with scoped rent grid rows (example AA-11-5D)

Pricing tag/type toolbar captures refreshed 2026-06-13 13:45 UTC (VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL VIVIN_DOCS_PROPERTY_SEARCH=AA-11-5D npx tsx tools/capture-sales-pricing-tags-types-toolbar-screenshot.ts).

Select properties uses a server-driven search picker: open the control, type to search property names on the server (debounced), and scroll the menu to load more matches in chunks. Each row shows the internal property code with the address on a second line. Selected properties appear as removable chips in the toolbar.

Sales Multi-calendar — Select properties menu with server search and property rows (example AA-11-5D)

Export downloads the currently filtered grid as CSV or Excel from the Export split button. Open Export, then choose CSV or Excel (.xlsx). The file reflects search, Available now / date range, rent range, tags, and properties active on the tab — not only the rows currently scrolled into view.

If the export fails, Vivin shows a toast (Failed to export.) — retry after checking filters or connectivity. See Glossary — Export and download failures.

Sales Multi-calendar — Export menu (CSV / Excel) on the pricing grid; download reflects current filters (example search: AA-11-5D)

Listing grid loading (infinite scroll)

The Pricing row list is server-paged like Listings and Bookings: the first request loads an initial batch of units, and scrolling near the bottom of the grid fetches the next batch automatically (no Load more button).

  • Scroll for more — When you approach the bottom of the pricing grid, the next batch loads. While the request runs, skeleton rows appear at the bottom (listing label plus month cells).
  • Filters reset the list — Changing search, Available now, date range, rent range, tags, or properties clears the grid and starts again from the first batch. Export always reflects the full filtered result set, not only rows currently on screen.

Sales — Multi-calendar grid loading the next page of listing rows with skeleton placeholders at the bottom

Bulk price editing

  1. Click individual cells, drag to select a rectangle of cells (multiple units and months), or click a month column header to select that month for every listing row currently loaded in the filtered grid.
  2. When you release the mouse (or after a column-header click), the Edit Price popover opens for the selection. Choose Set price (replace the cell value) or Adjust by (add or subtract euros), enter the amount, and choose Selected cells only or All months (fix price).
  3. Click Apply to persist; the grid refreshes with updated monthly rents. Use Cancel to discard the selection without saving.
  4. After a successful Apply, affected cells keep a pale blue tint for the rest of the session so you can audit a bulk pass without re-opening Edit Price.

Column-header selection respects the active Select properties / tag filters and infinite-scroll rows already on screen — narrow the portfolio first when you want a seasonal repricing pass across a subset.

Sales Multi-calendar — month column header selected across loaded listing rows with Edit Price popover (Set price / Adjust by)

Sales Multicalendar — drag-selected month cells with Edit Price popover (Set price / Adjust by)

Walkthrough: drag-select cells on one listing row, open Edit Price, switch to Adjust by, then Cancel (demo does not save staging rents).
Walkthrough: click a month column header to select that month for every loaded listing row, open Edit Price, then Cancel without saving (example property AA-11-5D).
Business Rule

Rent changes made in the Pricing grid apply to future pricing for that unit and month. They do not retroactively change rent on existing bookings that already fixed their rent at creation.

Time-on-axis availability (today vs upcoming)

For a time-on-axis view of bookings and blocks without month rent cells, use one of these surfaces:

  • Sales → Multicalendar (/sales/multicalendar) — portfolio Gantt with Day / Week / Month scale, Sales toolbar filters, and booking-bar click into detail (see Multicalendar tab).
  • Sales → Overview → Availability over time — per-unit free windows or aggregated bar charts (see Overview tab).
  • Bookings → Timeline — dense unit × time Gantt across the whole portfolio when you need the Bookings module context (for example Only bookings toggle and contract workflows).
Multicalendar vs Overview vs Pricing vs Bookings Timeline
  • Overview — account-level KPIs plus Availability over time charts (aggregated or per-unit free windows).
  • Multicalendar (/sales/multicalendar) — unit × time Gantt without rent cells, scoped to Sales filters; click a booking bar to open booking detail.
  • Pricing (/sales/pricing) — month cells with rent and bulk Edit Price workflows.
  • Bookings Timeline — portfolio Gantt from the Bookings module when you need Bookings-specific toggles and navigation patterns.

Channel Manager

Pair with other Sales sections

Channels pairs with Settings > Integrations and Listings — Channels tab — imported bookings with unpaid schedules surface payment overdue rows. Full pairing matrix: Sales section cross-reference.

The Channels tab connects Vivin to external booking platforms so availability and pricing stay aligned across marketplaces you enable in account settings.

Sales Channel Manager Integrations List

Connected platforms

The grid lists platforms your account has turned on under Settings > Integrations that also appear as Sales channel columns in the product today: Inlife, Uniplaces, RoomLess (Spacest), Spotahome, Housing Anywhere, the Vivin booking engine, Erasmus Life Lisboa, Airbnb, and Booking.com — only enabled integrations appear as columns you can filter and act on.

Platforms enabled in Settings but not in this grid

Channex, Edu Portugal, Idealista, and Coliving can be enabled under Settings > Integrations and affect bookings, Finance filters, and per-unit Listings > Channels links, but they do not currently render as columns on Sales > Channels. For Channex ARI sync and mapping, see Integrations — Channex; use Listings > Channels (and Vivin support for UUID mapping) rather than this grid.

How calendar synchronization works

When a booking is created in Vivin (manually or imported), the corresponding dates are blocked on other connected channels according to your integration rules. When a booking is created on an external platform and imported into Vivin, those dates are reflected here and blocked elsewhere as configured.

Setting up a new integration

  1. Go to Settings > Integrations
  2. Enable the platform and complete its setup (API keys, iCal URLs, or linking flows as guided)
  3. Return to Sales > Channels to link each unit to its external listing where required

See Integrations for platform-specific steps.

Business Rule

Enabling an integration does not automatically map every unit — you still link listings in Channel Manager (and satisfy each platform’s requirements) before sync is meaningful.

Toolbar filters and export

Above the grid, use Search units, Select properties, and the Filter by platform control (only platforms enabled in Settings > Integrations appear as columns). Export downloads the currently filtered rows as CSV or Excel (vivin-channel-manager-YYYY-MM-DD.csv / .xls). Export failures surface as a toast — see Glossary — Export and download failures.

Search units is debounced (~1 second) and matches the unit’s internal name, property label, tenant or email fields on the row, and stored platform external ids on enabled integrations (for example an Airbnb listing id or Uniplaces external key). Paste an OTA id when you know the link but not the Vivin unit code. Pricing search does not include integration ids — use Channels when you are hunting by marketplace reference.

Sales — Channels tab, Search units filtered by a Uniplaces external id (758115) with property chip AA-11-5D; grid narrows to unit AA-11-5D-R3

Filter by platform is a dropdown anchored next to Search units. All shows every enabled platform column; each other option lists a platform name only (no counts in the menu). Pick a platform to narrow the grid to units that have an active link on that marketplace (externalId set — same semantics as a green Connected / View cell).

Column header counts — In the sticky grid header, each platform column shows a small number under the platform name. That figure is how many currently filtered rows have an active integration on that column — it updates when you change Search units, Filter by platform, or Select properties chips. It is not a fixed account-wide total; scope the grid first when you need a building-specific link count.

Sales — Channels tab, platform column headers with per-column active-link counts under each marketplace name

Column header counts capture re-verified 2026-06-22 01:20 UTC (tools/capture-docs-enrichment-3005.ts).

Select properties uses the same server-driven search picker as Pricing: open the control, type to search buildings on the server, and add one or more properties. Leave the picker empty to include all units in the account.

After you add buildings, removable chips render on a second row directly under the Channels toolbar (internal property name on each chip; × removes one building without clearing Search units or the platform filter). The grid, infinite scroll batches, and Export all respect the scoped property list — changing search, platform filters, or property chips resets pagination from the first batch so rows from a previous filter do not linger on screen.

The open picker menu is the same control as on Pricing (server search + infinite scroll; each row shows internal code and address):

Sales Multi-calendar — Select properties menu with server search and property rows (example AA-11-5D)

Sales — Channels tab with Select properties filter chip and scoped unit grid (example property AA-11-5D)

The Channels unit table uses the same infinite scroll pattern as Pricing: an initial batch loads first; scrolling near the bottom fetches more rows with skeleton placeholders while the next page is in flight. Changing search, platform filters, or properties resets the list from the first batch (exports still include every row that matches the filter).

Sales — Channels tab loading the next page of unit rows with skeleton placeholders at the bottom

The skeleton row pattern on Channels matches Pricing (listing label plus platform cells); only the column layout differs. If the Channels-specific capture is unavailable in your checkout, the same loading UX appears on Pricing — see the screenshot in Pricing tab (monthly rent grid) above.

Each export row includes:

ColumnContent
Unit NameListing label (internal name, public name, or listing id)
VIVIN iCalPer-unit outbound iCal feed URL: {your Core API host}/ical-integration/listings/{listingId}/iCal.ics — the same URL pattern you can copy from the grid actions column or when linking a unit in the integration modal
Platform columnsOne column per enabled integration (for example Airbnb, Booking.com) — Yes / external id when linked, No when not; Excel exports may hyperlink View URLs for Airbnb / Booking.com iCal setups

Use the VIVIN iCal export column when you need a spreadsheet of subscribe links for OTAs or tools that accept iCal (VRBO, Tripadvisor, custom middleware) without opening every unit in Listings. The feed respects Short-term iCal Max Date and other availability rules configured on the account.

Copy iCal (per row) — The trailing actions column on the on-screen grid holds a Copy iCal control (clipboard icon) for every unit. Click it to copy that row’s outbound feed URL to the clipboard; success and failure surface as toasts (VIVIN iCal link copied / Could not copy the iCal link). The URL is the same {Core API host}/ical-integration/listings/{listingId}/iCal.ics pattern as the export column and the Airbnb / Booking.com wizard step 2 field — use Copy iCal for one-off pastes; use Export when you need many links at once.

Sales — Channels tab, actions column with Copy iCal clipboard control on each unit row (example property AA-11-5D)

Copy iCal column capture refreshed 2026-06-21 19:15 UTC (VIVIN_DOCS_BASE_URL=http://localhost:5173 VIVIN_DOCS_RECORD_API=$VITE_API_BASE_URL VIVIN_DOCS_PROPERTY_SEARCH=AA-11-5D npx tsx tools/capture-sales-channel-copy-ical-column.ts).

Sales Channel Manager — Export menu (CSV / Excel) on the Channels tab; export includes VIVIN iCal URLs per filtered row

When a unit is not linked on a platform, the cell shows No Integration; click View on a connected cell (or the equivalent control on your enabled platforms) to open the per-unit linking dialog without leaving the grid:

Sales — Channels tab, per-unit integration link modal opened from a View control in the grid

Airbnb and Booking.com (iCal two-way setup)

For Airbnb and Booking.com, clicking a No Integration cell opens a dedicated iCal wizard instead of a single URL field. The modal walks through three steps:

StepWhat you do
1Paste the platform’s private iCal export URL from their calendar / availability settings, then click Integrate so Vivin stores the inbound feed.
2Copy Vivin’s outbound feed URL (…/ical-integration/listings/{listingId}/iCal.ics) and add it on the OTA as an imported calendar (for example named Vivin Calendar).
3Click Sync to pull future unavailabilities from the platform calendar into Vivin. While the request runs, the button shows Syncing…; success and failure surface as toasts so you know whether the import finished without closing the modal.

The in-modal note explains that Vivin imports all unavailabilities from the platform calendar (including manual blocks), so the OTA calendar should only reflect availability you want exported.

Sales — Channels tab, Airbnb iCal setup modal with Integrate, outbound Vivin link, and Sync (example unit AA-11-5D-R1)

After a link exists, clicking the cell again opens manage view: Connected summary, read-only platform iCal link with Copy and Sync, and Delete integration to remove the mapping.

Use Sync in the initial iCal wizard (step 3) and from manage (connected Airbnb / Booking.com cells — read-only platform iCal row with Copy + Sync beside Delete integration) whenever the OTA calendar changed outside Vivin. You do not need to delete and reconnect first. While Sync runs, the button shows Syncing…; success and failure surface as toasts in both views.

When Sync is enough

Use Sync after you finish step 2, after editing blocks on the OTA, or from manage when you need a fresh import. New bookings created in Vivin still propagate to other channels through the normal integration rules; Sync is for importing blocks and reservations already on the platform feed.

Walkthrough: filter the Channels grid, open Export, then open a View link modal and close without saving (example search: unit AA-11-5D).

Manual unavailability

When you add manual unavailability on a unit in Listings, those dates are treated like other blocks for availability and, where integrations apply, propagate to external calendars. See Adding Manual Unavailability.

Sales guide subsection index

Pair with other Sales module guide sections

This index pairs Sales tab sections with Related subsections — use it when availability heatmaps disagree with Dashboard vacant units, Bookings — Timeline, or Analytics KPI charts. Full pairing matrix: Sales section cross-reference.

SubsectionWhen to open itPair with
Directory load failuresRed alert when first fetch failsGlossary — Directory list load failures, FAQ — list page load failures
Mobile and narrow layoutsBottom tab bar below 768pxDeep Links — Sales, Operations — Phone-only operations shell
Overview tabKPI strip, occupancy forecast, availability heatmapDashboard — Vacant Units, Analytics — Occupancy tab, Portfolio KPI review — Step 6
Multicalendar tab (availability timeline)Unit × time Gantt without rent cellsBookings — Timeline view, Audit module, Manual block hygiene
Pricing tab (monthly rent grid)Listing × month rent bulk editsListings — Rent Value tab, Glossary — Invoiced floor (rent), FAQ — Lower rent below invoiced
Channel ManagerIntegrations list and per-unit linkingSettings > Integrations, Listings — Channels tab, API Reference — iCal feeds
Deeper workflow readsStep-by-step procedures in this moduleCommon Workflows hub subsection index, Portfolio KPI review
Lockout catch-up after password recoverySign-in restored; module backlog accumulatedCommon Workflows — Lockout catch-up, Getting Started — Lockout catch-up, Resetting a Management User Password — Step 3
Pending manual receipt approvalRecorded bank transfers still pending until Approve paymentsCommon Workflows — Pending manual receipt approval, Finance — Pending manual payments, FAQ — Manual receipt still pending
Reject/revert mistaken receiptsDuplicate or wrong-booking receipts after ApproveCommon Workflows — Reject/revert mistaken receipts, Payment Allocation — Correcting mistaken receipts, Glossary — Credit note (payment reject/revert)
Notification row-click navigation/notifications row-click before channel KPI reviewCommon Workflows — Notification row-click navigation, Notification triage — Step 4, Channel Manager
Payment alert to receivables triagepayment overdue on channel-import schedulesCommon Workflows — Payment alert to receivables triage, Handling a Late Payment — Step 1, Notifications — Payment overdue alerts
Confirmation alert triageUpcoming channel-import alerts before Channels linkingCommon Workflows — Confirmation alert triage, Processing a New Booking — Step 5b, Channel Manager
Portfolio segmentation by tenant categoryReview one tenant segment across modulesCommon Workflows — Portfolio segmentation, Settings > Tenant categories, Finance — Tenant category filter, Tenants — Tenant category filter
Finance debt receivables triageChannel-import booking schedules may inflate receivables until alert triage and Debt Aging sign-offCommon Workflows — Finance debt receivables triage, Finance — Finance debt receivables triage, FAQ — Finance debt receivables triage hub, Overview tab, Handling a Late Payment collections (finance-overview-debt-aging-expanded-bucket.png, finance-overview-debt-aging-walkthrough-flow.mp4)
Finance Income status drill-downChannel-import schedules may inflate Scheduled segments — reconcile Income chart before month-end sign-offCommon Workflows — Finance Income status drill-down, Finance — Income status drill-down, FAQ — Finance Income status drill-down hub, Overview tab, Pricing tab (monthly rent grid) (finance-overview-income-status-in-debt-modal.png, finance-overview-income-drill-down-flow.mp4)
Cash flow forecast drill-downChannel-import collections may lag Income → Paid — reconcile Cash flow forecast before month-end sign-offCommon Workflows — Cash flow forecast drill-down, Finance Income status drill-down, Finance — Income chart and cash flow forecast, FAQ — Cash flow forecast drill-down hub, Overview tab, Portfolio KPI review — Cash flow forecast drill-down (finance-overview-cash-flow-all-payments-modal.png, finance-overview-cash-flow-day-view.png, finance-overview-cash-flow-drill-down-flow.mp4)
Sales section cross-referencePer-tab pairing matrixModule cross-reference, Listings guide subsection index

Sales section cross-reference

Use this table when one Sales tab or control naturally leads into another module, workflow, or concept — each row links to the docs you should read before or after acting in that section.

Sales tab / sectionPair with these docs
Directory load failuresGlossary — Directory list load failures, FAQ — list page load failures
Mobile and narrow layoutsGetting Started — narrow viewports, Deep Links — Sales
Overview tabDashboard — Vacant Units, Analytics — Occupancy tab, Manual block hygiene, Portfolio KPI review — Step 6, Portfolio KPI review — Step 7 (AI usage API), Bookings — Other filters tenant category, Finance — Tenant category filter, Tenants — Tenant category filter, Glossary — Tenant category
Multicalendar tab (availability timeline)Bookings — Timeline view, Audit module, Glossary — Same-day turnover, Portfolio KPI review — Step 6, Bookings — Other filters tenant category, Glossary — Tenant category
Pricing tab (monthly rent grid)Listings — Rent Value tab, Glossary — Invoiced floor (rent), FAQ — Lower rent below invoiced, Portfolio KPI review — Step 6, Finance — Tenant category filter, Bookings — Other filters tenant category, Glossary — Tenant category
Channel ManagerSettings > Integrations, Listings — Channels tab, API Reference — iCal feeds, Notifications — Payment overdue alerts, Handling a Late Payment — Step 1

Pair with other Sales module guide sections

Related below links this module to settings, concepts, workflows, and escalation paths. Pair Documentation map & escalation with Modules hub — Documentation map & escalation; pair Upstream & downstream workflows with Common Workflows — Workflow cross-reference. Topic-to-section pairing in sections above: Sales guide subsection index · Sales section cross-reference. Full hub matrix: Module cross-reference · Modules hub subsection index.

Documentation map & escalation

Pair with other Sales module guide sections
  • Modules hub — Hub pairing matrix across operator workspaces
  • Glossary — Term definitions used across sales and availability workflows

Upstream & downstream workflows

Pair with other Sales module guide sections

Deeper workflow reads

Pair with other Sales module guide sections

Workflow reads pair with Common Workflows hub subsection index and Workflow cross-reference. Each workflow sub-guide reciprocates with [Deeper workflow reads](../modules/sales/index.md#deeper-workflow-reads) anchors on Module documentation hubs bullets — hub parity: Modules hub — Deeper workflow reads. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Settings that shape Sales

Pair with other Sales module guide sections

Deeper concept reads

Pair with other Sales module guide sections

Operator modules (pairing surfaces)

Pair with other Sales module guide sections

Module hub bullets pair with Modules — Module cross-reference. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Pair with other Sales module guide sections
  • Create New menu — Quick path to Unit setup when a channel row needs linking
  • FAQ — Permission denied toast — Red You do not have permission to perform this action. toast when RBAC blocks a save; fix in Users → Role Permissions

Lockout catch-up after password recovery

Pair with other Sales module guide sections

Pending manual receipt approval

Pair with other Sales module guide sections

Reject/revert mistaken receipts

Check-out ledger cleanup before refund

Pair with other Sales module guide sections

Utility overage collections

Pair with other Sales module guide sections

Occupancy KPIs stay high while utility overage In Debt accumulates after bill posting — pair Multicalendar review with Finance collections. Hub parity: Common Workflows — Utility overage collections. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Cancellation collections before void

Pair with other Sales module guide sections

Check-out collections before refund

Pair with other Sales module guide sections

Handling a Late Payment collections

Pair with other Sales module guide sections

Check-out vs cancellation

Pair with other Sales module guide sections

Channel-import departures on Multicalendar need lifecycle exit routing — policy void → Cancelling a Booking frees availability via Canceled status; completed stay → Managing a Check-out Ended. Hub parity: Common Workflows — Check-out vs cancellation. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Deposit missing on Finance Deposits

Pair with other Sales module guide sections

Channel-import departures on Multicalendar do not show deposit portfolio rows — cross-check Finance → Deposits and clear toolbar date range when booking Deposit tab data exists but lifecycle cards are empty. Hub parity: Common Workflows — Deposit missing on Finance Deposits. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Notification row-click navigation

Pair with other Sales module guide sections

Channel-import /notifications row-click usually lands on Bookings first — open Channel Manager or Multicalendar tab when the alert cites availability or linking gaps after you verify booking context. Hub parity: Common Workflows — Notification row-click navigation. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Payment alert to receivables triage

Pair with other Sales module guide sections

Channel-imported reservations with unpaid schedules surface payment overdue rows — row-click into Bookings and finish Handling a Late Payment — Step 1 before you lower Pricing or treat Overview occupancy dips as availability gaps. Hub parity: Common Workflows — Payment alert to receivables triage. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Finance debt receivables triage

Pair with other Sales module guide sections

Channel-import booking schedules may inflate receivables until you finish alert triage and open Finance → Overview → Debt Aging. Hub parity: Common Workflows — Finance debt receivables triage. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Finance Income status drill-down

Pair with other Sales module guide sections

Channel-import schedules may inflate Scheduled segments — reconcile Income chart before month-end Top debtors sign-off. Hub parity: Common Workflows — Finance Income status drill-down. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Cash flow forecast drill-down

Pair with other Sales module guide sections

Channel-import collections may lag Income → Paid — reconcile Cash flow forecast All payments before month-end sign-off. Hub parity: Common Workflows — Cash flow forecast drill-down. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Confirmation alert triage

Pair with other Sales module guide sections

Upcoming Booking created / Payment received alerts on channel-linked units row-click into Bookings — finish Processing a New Booking — Step 5b and verify Channel Manager linking before you bulk-clear /notifications during import bursts. Hub parity: Common Workflows — Confirmation alert triage. Full pairing matrix: Sales section cross-reference · Module cross-reference.

New inventory to first booking handoff

Pair with other Sales module guide sections

Channel-linked go-live inventory pairs Onboarding a New Property — Step 5 and Step 7 Multicalendar tab verify before Processing a New Booking — Step 1 on first channel import. Hub parity: Common Workflows — New inventory to first booking handoff. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Property setup to first arrival handoff

Pair with other Sales module guide sections

Confirmation to check-in handoff

Pair with other Sales module guide sections

Channel-import Upcoming reservations need Processing a New Booking — Step 6 portal gates before Multicalendar turnover overlap checks (~7 days out). Hub parity: Common Workflows — Confirmation to check-in handoff. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Check-in to check-out handoff

Pair with other Sales module guide sections

Channel Ongoing bookings on Multicalendar entering departure week need Managing a Check-out — Step 1 — distinct from channel Upcoming overlap checks in Confirmation to check-in handoff. Hub parity: Common Workflows — Check-in to check-out handoff. Full pairing matrix: sales-section-cross-reference · Module cross-reference.

Check-out final utilities handoff

Pair with other Sales module guide sections

Channel bookings entering departure week on Multicalendar need final utility overage settlement before Managing a Check-out — Step 6 — distinct from occupancy-only Multicalendar review. Hub parity: Common Workflows — Check-out final utilities handoff. Full pairing matrix: sales-section-cross-reference · Module cross-reference.

WhatsApp per-booking messaging

Pair with other Sales module guide sections

Channel-import tenant message backlog pairs with Bookings → Communication during Multicalendar review — bell Inbox alone lacks channel booking context. Hub parity: Glossary — WhatsApp per-booking messaging hub · Common Workflows — WhatsApp per-booking messaging. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Bot reasoning (audit)

Pair with other Sales module guide sections

Channel-import bot backlog during Multicalendar review. Hub parity: Glossary — Bot reasoning (audit) hub · Common Workflows — Bot reasoning (audit). Full pairing matrix: Sales section cross-reference · Module cross-reference.

ChatBot settings

Pair with other Sales module guide sections

Account Settings → ChatBot pairs with Communication thread review — channel-import bot backlog during multicalendar review. Hub parity: Glossary — ChatBot settings hub · Common Workflows — ChatBot settings. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Rent reduction after invoicing

Pair with other Sales module guide sections

Multicalendar review during rate changes may surface live bookings where Change monthly rent is blocked by exported invoice totals — repricing starts on Bookings → Contract Info, not the calendar grid. Pair Bulk Hostkit invoicing for Issue credit notes (N). Hub parity: Common Workflows — Rent reduction after invoicing. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Same-day turnover coordination

Pair with other Sales module guide sections

Multicalendar Week scale on one unit row confirms departure and arrival bars on the same calendar day — pair with hub Common Workflows — Same-day turnover coordination before you treat overlap as a duplicate import or lower Pricing. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Occupancy KPI to block hygiene handoff

Pair with other Sales module guide sections

Multicalendar mystery blocks without a rate change pair with hub Common Workflows — Occupancy KPI to block hygiene handoff before Pricing edits — upstream Portfolio KPI review — Step 3 surfaces the dip. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Partly collected security deposit

Pair with other Sales module guide sections

Month-end invoicing (fixed date)

Pair with other Sales module guide sections

Multicalendar month-end rate review does not replace saving fixed Invoice date in Settings → Invoicing before Finance → Transactions bulk Issue allocation. Hub parity: Common Workflows — Month-end invoicing (fixed date). Full pairing matrix: Sales section cross-reference · Module cross-reference.

Bulk Hostkit invoicing

Pair with other Sales module guide sections

Multicalendar month-end rate review does not replace Finance → Transactions bulk Issue allocation — Hostkit pacing applies on the ledger toolbar. Hub parity: Common Workflows — Bulk Hostkit invoicing. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Directory list load failures

Pair with other Sales module guide sections

When the shared Sales first fetch fails, all four tabs show Failed to load sales data. Please try again. + Retry under the page header — distinct from filters that match zero listings. Pair Directory load failures with Manual block hygiene — Step 5 reconcile after hold cleanup. Hub parity: Common Workflows — Directory list load failures. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Portfolio segmentation by tenant category

Pair with other Sales module guide sections

Key glossary terms

Pair with other Sales module guide sections

API & companion guides

Pair with other Sales module guide sections

API bullets pair with API Reference hub. Full pairing matrix: Sales section cross-reference · Module cross-reference.

Module documentation hubs

Pair with other Sales module guide sections

Module hub bullets pair with Modules — Module cross-reference. Full pairing matrix: Sales section cross-reference · Module cross-reference.

  • Sales module — Portfolio availability, monthly rent editing, and channel manager connections (this page)
  • Utilities module — Bills Included ceiling model, Connections, AI bill upload, and tenant overage charges on payment plans (hub)
  • Operations module — Maintenance tickets, cash flows, check-in/out coordination, Draft ticket queues, and linked cash flows (hub)
  • Dashboard module — Post-login Today, Total debt, Vacant Units, and forecast KPI snapshot with bell notification triage (hub)
  • Analytics module — Month-range portfolio KPI charts (Overview, Revenue, Occupancy, ADR, RevPAR, Maintenance) with rankings and heatmaps (hub)
  • Listings module — Property wizard, Channels tab, Archived inventory, and unit management (hub)
  • Properties workspace — Legacy /properties URL redirects into Listings (hub)
  • Booking engine details — Rich marketplace payload editor via the Full integration pill (hub)
  • Finance module — Portfolio ledgers (Overview, Income, Contract Values, Transactions, Payouts, Deposits) with payment approval and deposit settlement (hub)
  • Tenants module — Tenant directory, profile sidebars, With Debt segmentation, and table expand for linked bookings (hub)
  • Inbox module — Portfolio-wide WhatsApp workspace with Dashboard bell Inbox sub-tab deep links (hub)
  • Notifications module — Full /notifications history with search, filters, and row-click navigation (hub)
  • AI Chat module — Vivin-internal AI Assistant using Landlord MCP tools for portfolio Q&A (hub)
  • Audit module — Portfolio-wide Manual Blocks and Discounts contract-value review (hub)
  • Account Settings — Workspace-wide financial policies, templates, integrations, and operational defaults (hub)
  • API Reference hub — Partner HTTP contracts, Swagger onboarding, and partial vs full feeds (hub)

Key business rules

Summary
  1. Blocked dates propagate by integration rules. New bookings and manual blocks should prevent double bookings across the channels you connect; exact behaviour depends on the platform and mapping.

  2. Pricing grid edits are forward-looking. Changing a month cell updates future rent for that slot; existing bookings keep the rent agreed when they were created. After Finance invoices a month, lowering that booking's net below the exported total is blocked by the invoiced floor — use credit notes in your accounting system when you truly need a lower invoiced amount. See FAQ — Lower rent below invoiced.

  3. Integrations are configured in Settings first. The Sales Channels tab surfaces status and linking for platforms already enabled on the account.

  4. Overview vs Multicalendar vs Pricing vs Bookings Timeline. Use Overview for account KPIs and aggregated availability charts; use Multicalendar (/sales/multicalendar) for a unit × time Gantt with Sales filters; use Pricing (/sales/pricing) for month-by-month rent and bulk Edit Price passes; use Bookings Timeline when you need the Bookings module Gantt and its toggles.