Golden Pets Hotel
website for a small-breed dog boarding hotel in Belgrade
A dog boarding hotel that has been running for years had a site frozen in 2019, on a page builder that has since been shut down because of a security vulnerability. The job was to build a new site, carry over everything Google had known for years and not add a single form along the way — the owner explicitly asked that nothing be reduced to automation.
- Multi-page website
- Belgrade
- August 2026
- 12 min read
- PHP 8.5
- No database
- WebP and srcset
- Schema.org
- Customer
- Golden Pets Hotel
- Industry
- Boarding for small-breed dogs, grooming and transport
- City
- Belgrade
- Type
- Multi-page website with a price list and gallery
- Technologies
- PHP 8.5 · no database · WebP · Schema.org
- Website
- hotelpansionzapse.com
- Status
- Live site, with content and email handled by us

01 / 11
What Golden Pets Hotel does
Golden Pets Hotel is a boarding hotel for small-breed dogs in Belgrade, in the Braće Jerković neighborhood. The dogs do not stay in kennels but in a house and a fenced yard adapted to small breeds, free to move around all day. Drop-off and pick-up are during opening hours, from 9 a.m. to 9 p.m., and the dogs are supervised 24 hours a day.
The hotel is registered with the relevant national authorities, so payment by bank transfer is also possible. The staff were trained in caring for animals in boarding facilities and shelters at the Faculty of Veterinary Medicine in Belgrade, and the attending veterinarian, Nebojša Milivojević, DVM, does checkups and minor treatments at the owner's request while the dog is staying. A veterinary report is required for stays longer than three days, and the hotel is open 365 days a year, holidays included.
Dogs up to fifteen kilograms are accepted. Along with the stay come grooming and bathing by arrangement, daily basic hygiene and transport of the dog from the home address to the hotel and back. TV Pink's Nacionalni dnevnik and the show “Novo jutro” both ran segments about the hotel — a part of its history that until then had lived only on social media and now has its own place on the site.

02 / 11
What we were moving away from
The site we inherited was a WordPress install frozen in 2019: core 4.9.26, WooCommerce 3.5, Yoast 11, and a theme bought on a template marketplace that was written for a plumbing company and then repurposed for the hotel.
The problem was not the age but the fact that the site could not be updated. The entire page layout was built in the page builder KingComposer, which wordpress.org closed in February 2022 because of a security vulnerability — there are no more downloads and no developer. If you remove it, the pages are left as bare text full of shortcodes; if it stays, so does a hole nobody patches anymore. That is why “update everything” was not an option even on paper, however it looked from the admin dashboard.
On top of that came a store nobody used. The theme's demo products — a T-shirt, a hoodie, a cap, a belt — sat in the database and were dutifully reported to Google through the store's sitemap. A dog boarding hotel whose indexed pages carry the names of products from someone else's template is not a problem you solve with better copy.
The same owner's second domain, goldenpets.rs, was not a simple redirect. A whole older WordPress lived there: the home page did redirect, but the inner pages still returned content. Two live sites with the same texts mean duplicate content for search engines and twice the attack surface, so that domain had to be part of the job too.

03 / 11
A phone call instead of a form
The first thing the owner asked for was that nothing be reduced to automation. No online booking, no calendar of open slots, no request waiting somewhere for approval. Someone leaving their dog in another person's care first wants to hear a voice on the other end, and the hotel wants to ask about breed, age, habits and dates before confirming anything.
The site does still have a short inquiry form, where you enter the dog's breed, preferred dates and important notes, and the contact page lists the channels people use to get in touch anyway: phone, Viber, WhatsApp and Instagram. A floating call button with a Viber shortcut next to it appears throughout the site, and the header now also has a “Call us” button.
When the only conversion is a call, the phone number is the most sensitive piece of data on the site. What we found: every tel: link dialed the number without its last digit. The displayed text was correct, so nothing was visible to the naked eye — the bug only revealed itself through a call that did not go through. For a business like this, that is the single most expensive mistake a site can have.
The second rule is one number across the whole site. The older number, which still appears in directories today, was deleted everywhere at the owner's request — together with the constants that held it, so it would not come back on its own with some later change.
04 / 11
Site structure and content
The site has a home page and four pages — about the hotel, gallery, news and contact — plus individual news pages and a privacy policy. Nothing more. The hotel has one service and one location, so any extra page would be an empty hallway.
The home page follows the order of the questions a dog owner asks: what is this place, what does the dog do there all day, what else can be arranged, how much does it cost, what does it look like and how do I get in touch. Right below the intro is a strip with the four things people check most often — insurance for the dog during the stay, stays without kennels, a vet on call 24 hours and a registered hotel that accepts payment by bank transfer.
The About us page carries a longer text about the house and yard, about the staff adapting to the dog's rhythm rather than the other way around, and an invitation for owners to come for a visit with their dog before booking anything. There is also a “They wrote about us” section with a newspaper clipping, which used to sit in the middle of the gallery and spoil it.
The news was carried over from the old site, and something unpleasant turned up: the publication dates were wrong, one of them even attached to the wrong article, and two posts claimed things the source does not say — among other things, that the team had been guests in a TV studio, when the source says the hosts visited the hotel. The dates were corrected from the old site's RSS feed, and the texts were rewritten to what can be backed up. A site that makes false claims about itself is worse than a site that claims nothing.
05 / 11
A price list that answers before anyone asks
The prices are on the home page, in three packages and one box for discounts. The standard package is marked as the most popular, the second adds food provided by the hotel, and the third is daycare — a day stay while the owner is at work, with a monthly price and shorter periods possible by arrangement. Discounts are agreed for longer stays and for two dogs from the same household, and holidays cost no extra. That last point is exactly what people look for in December, when competitors charge more.
Dog transport has its own price, which starts from the amount listed on the site and then depends on the part of town. It was written that way on purpose: the hotel has no street-by-street table and never will, but a starting figure means the conversation does not begin from zero.
A small bug from the build that shows why a price list is not just text: the price unit was hard-coded, so the monthly daycare price was shown as a daily one. The figure was right, the meaning wrong, and on the most expensive package at that. Now every package carries its own unit.
Published prices are a decision, not an oversight. The hotel takes calls all day, and every call that starts with “how much does it cost” wastes time for both sides. Anyone who still calls after reading the table is calling because the price works for them.
06 / 11
Photos, gallery and logo
The client sent twenty-eight of their own photos. Sixteen of them made it into the gallery and every one of them has a dog in it. The request was clear — no empty rooms or dog beds anywhere, because a boarding hotel is not sold by its interior but by how the dogs look while they are there.
The grid shows a smaller version, and a click opens a larger one in the image viewer. Every photo also has a narrow variant for small screens, so a phone downloads what it actually needs instead of the full image. After that, the whole grid of sixteen images weighs about 210 kilobytes — before, nine images pulled in twice as much.
AVIF was tried and rejected. On these photos — older, grainy, shot on a phone — AVIF came out larger than WebP. A format that is better on average was not better here, so measurement decided, not a rule from a guide.
The logo arrived as a photo of a printed logo, with a moiré pattern across the whole area. The processing went in steps: removing the pattern, separating the dark mark from the background and compositing it onto an even yellow circle. From that came the logo, the favicon, the icons for adding to a phone's home screen and the browser theme color. If a vector file arrives one day, it will be sharper; until then, this is the most that could be pulled out of that one photo.
07 / 11
Technical implementation
The new site is written by hand in PHP 8.5. No WordPress, no plugins, no page builder and no database. The whole site is two files with the shared layer, one file for each page and one stylesheet.
The content is kept separate from the presentation, in a single data file: name and slogan, the facility address and the company's registered office, company registration number and tax ID (PIB), phone, opening hours, social profiles, intro slides, price list packages, extra services and news. Changing a price means changing one line, not hunting for a number across ten pages.
Why no database: the content changes rarely and one person changes it. A database here would be one more system that can go down and one more backup that has to be made. This way the whole site is a folder that can be copied in a second, and every text change shows up as a diff in a plain text file.
The facility address and the registered office are kept separate in the code, with a comment explaining why: the registered office goes only into the legal block of the footer, while the contact details and schema carry the facility address. The facility's street has since been renamed, so the old name appears next to the new one — maps still show the old one, and people still search by it.
One trap from the server configuration is worth writing down. Adding a single header inside the PHP block quietly wiped out all the security headers inherited from the parent block — the rule is that headers are not added to but replaced at the level where they are mentioned. The fix is to include the set of security headers again in that very block. The site works the same either way, so the gap goes unnoticed until the headers are measured.
08 / 11
One hundred thirty-nine URLs that could not be allowed to disappear
The old site had been in the index for years and had 139 known URLs. That is the one asset a move to a new site can destroy in a single day, and in such a way that the damage only shows a few months later.
That is why the new pages were put up on the old paths — about, gallery, news and contact kept the URLs they already had, so those URLs did not even need to be redirected. Versions with the .php extension permanently lead to the clean ones.
For 82 old URLs without a counterpart, a server-level redirect map was made. A small trap: the long keys in that map require a larger hash bucket size, otherwise the server refuses to start, with an error that does not mention a single URL.
Seventy-six URLs did not get a redirect but a 410 status — demo products, an empty multilingual branch, a category with no content and the old system's infrastructure. The difference is in the message: a redirect says “this has moved here”, while 410 says “this is gone, drop it from the index”. Pushing everything left over to the home page is the most common mistake in moves like this, and search engines read it as noise.
The old sitemaps point to a single new one. After the move, every URL was checked one by one on the live domain, and all of them responded as planned. The new pages were also submitted through IndexNow, so indexing started the same day.
The site carries LocalBusiness data with the address, opening hours, phone, company registration number and tax ID (PIB), price range and social profiles, and the subpages also carry BreadcrumbList. For a local business, that markup is what ties the site to its profile on maps.
09 / 11
Speed, accessibility and a line through the scroll
Three loading bugs were found and removed: the preload hint targeted a different URL from the one the browser actually picks, so the hero image was downloaded twice; all four intro slides loaded immediately, even though they are shown one at a time; and on the subpages the largest image was marked as lazy-loaded, which slowed down exactly the thing display speed is measured by.
Accessibility was done as part of the job, not as an add-on. Inactive slides and the closed menu were taken out of the keyboard tab order, because invisible elements were catching focus; button contrast was raised from 3.16:1 to 5.16:1; the removed focus outline was replaced with a visible indicator; the image viewer keeps focus while it is open; and tab markup without matching panels was replaced with a plain group, because it promised screen readers behavior that did not exist.
At a width of 390 pixels, the menu button stuck out 23 pixels past the edge of the screen, so the menu could not be opened on one of the most common phone sizes. For a site where most visitors come from phones, that meant dead navigation, and in a desktop browser you never see it.
The site's visual signature is a thin line that winds through the sections and draws itself as you scroll, with a small dot at its head. Its rhythm is deliberately uneven — it slows down before each section and catches up between them, so it follows the reading instead of running ahead of it. Below 1100 pixels it switches off, as it does for visitors who have asked their system for less motion on screen.
10 / 11
No cookies, no consent banner, with the legal part in place
The site makes no requests outside its own server. It has no analytics, social media pixels, embedded maps, external fonts, video player or bot check. Facebook and the map are plain links, not embedded frames that pull in visitor data.
As a result there are no cookies, so there is no consent window either. The privacy policy says so openly: there is nothing to consent to. A banner on a site that sets no cookies is a pointless nuisance, yet most sites have one because it gets copied from other sites.
The privacy policy was written for what the hotel actually collects — the owner's name, phone and email, information about the dog and its habits, the vaccination record and a veterinary report when needed. It also states how long the data is kept, who it is passed on to (a vet in an emergency, and the accountant when an invoice is requested) and how to request deletion. The company registration number and tax ID (PIB) are in the footer, as the Serbian Electronic Commerce Act requires of anyone offering a service through a website.
11 / 11
What the client ends up with
A site that can be maintained. No discontinued page builder, no plugins waiting for an update that will never come, no store that was never used but that Google kept reporting on for years.
The domain and email moved over along with the site. The hotel's mailbox, with several hundred messages, was transferred in full, and the client did not have to change the password or reconfigure the phone — the old login kept working. For someone who reads business email on one device and does not like fiddling with settings, that is the difference between a calm move and a day without email.
In practice, it now looks like this: a price is changed in one line, a new news item is added and immediately appears in the list and in the sitemap, the gallery is extended with new photos in the same format, and the phone link on the site calls the right number. Everything the old site had in the index is still in its place, it just leads to pages that open on a phone.
What was left off the site was left off on purpose. No booking, no chat window, no pop-up notifications. The hotel still works by phone, and the site is there so people call already knowing what to expect.
On a phone
The same site, in your hand.
Most visitors come from phones, so the layout, buttons and images are arranged for the small screen first.

Questions
What clients ask.
Why doesn't the site have online booking?
Because the owner did not want it. Before taking in a dog, the hotel has to ask about breed, age, habits and health record, and a calendar of open slots cannot handle that. So the site leads to a phone call, Viber and WhatsApp, where the conversation is over in a minute.
Why a new site rather than fixing the existing WordPress?
Because the existing one could not be updated. The entire page layout was built in a page builder that was officially closed because of a security vulnerability — without it the pages fall apart, and with it the hole stays open. On top of that, the theme was written for a different line of business, so the design could not be fixed without a rewrite either.
Who changes the prices and adds news?
We change the content, because the site deliberately has no admin panel. Prices, opening hours and news sit in one place in the code and are changed in a single line. For a site with a few pages and a price list that gets touched once a year, an admin panel would be more maintenance work than it is worth.
What happened to the old site's Google rankings?
The new pages were put on the same URLs the old ones had, so the most important paths did not even need redirecting. For old URLs without a counterpart, a redirect map was made, and junk from the old system was given a status that tells search engines it is gone. After the move, every URL was checked one by one.
What happened to the hotel's second domain?
It was running another live WordPress with the same texts — only the home page redirected, while the inner pages still worked. Now that whole domain points to the one site, which removed a duplicate from the index and one neglected system that needed maintaining.
Why is there no cookie prompt on the site?
Because the site does not set a single cookie and does not send a single request outside its own server — no analytics, pixels, external fonts or embedded maps. When there is nothing to track, there is nothing to consent to, so a banner would just be a nuisance.
Related projects
From the same field.

Medica Centar
Zlaja 2015
Tehnički Pregled Stanković 964