I built a vacation rental platform for my tiny apartment
I have an apartment in a small coastal village outside Castelsardo in northern Sardinia. The kind of place that sits empty most of the year while I work remotely from a different part of the island.
A while back I decided to rent it out during the summer months. I signed a seasonal mandate with a local agency. Then, once I'd signed, they stopped telling me anything useful — which dates were booked, at what price, who was staying. I'd ask and get vague answers. The information was there; it just wasn't flowing in my direction anymore.
The obvious alternative was Airbnb and Booking — both solid platforms with real reach that I already use as a guest. However, the fees can be high and I wanted something I controlled directly: a page for the apartment that I could update myself, where guests could see availability and send requests straight to me, without a middleman deciding what I could and couldn't see about my own property.
So I built my own Portale Case Vacanze (scrappy naming, I'll come up with something better...) by using Nuxt and Vue, plus @nuxt/content as I wanted a quick and easy way to add new pages (same as this website where sections are defined in .yml files and blog posts in .md files).
The idea is simple: owners can create a mini-site for their property — photos, description, calendar, optional services with pricing, a form for direct availability requests. No commission. The platform sits alongside Airbnb and Booking rather than replacing them; the idea is eventually to sync calendars across all three so that availability is always consistent without manual updates.
The Via Siena 16 page has been live for a while and we've had bookings through it.
The part I underestimated was the bureaucracy.
Renting out a vacation property in Italy is not a simple thing. There's the SCIA — the notification you have to file with your municipality to declare yourself a short-term rental operator. There's the tassa di soggiorno, a tourist tax that varies by municipality and that you're responsible for collecting and remitting. There's the Alloggiati Web portal — a system run by the Ministry of the Interior where you're legally required to submit the personal details of every guest within 24 hours of check-in. And in Sardinia specifically there's ROSS1000, the regional tourism registry where accommodation facilities have to register and report occupancy data.
None of this is explained anywhere in a useful way. The Alloggiati portal has a UI that looks like it was built in 2003 and last updated in 2007. ROSS1000 has documentation, but the documentation assumes you already know what it's talking about. The municipalities have different rules and different forms. The fines for non-compliance are not small.
So the platform currently handles the direct channel side reasonably well. The bureaucracy side it doesn't handle at all, which means every owner using it is on their own for the compliance piece — exactly the part they need the most help with.
That's the next thing to build: a step-by-step system that walks you through check-in and check-out, tells you what to file and when, and ideally integrates with Alloggiati and ROSS1000 directly. Whether direct API access to those systems is actually possible is something I'm still working out. The Alloggiati portal has a web service interface. ROSS1000 is less clear.
The dashboard also needs work. Right now it shows you your properties and not much else — no occupancy data, no revenue tracking, no sense of how the season is going. And the calendar sync with Airbnb and Booking is the other obvious gap: both expose iCal feeds, consuming them to keep the Portale calendar updated automatically is technically straightforward. I haven't done it yet.
The thing about building for yourself is that you know exactly when it's good enough. The mini-site is good enough. The direct request flow is good enough. The rest isn't yet — and I have a list of what "good enough" would look like, which is more than I can say for the agency I started with.