Website2026-08-21

Ivković Prevoz — one site for firewood, transport and towing

A company from Leskovac does three things that have nothing in common: sells firewood, drives goods by truck around Serbia and tows vehicles. All three are searched for with different words, at different times of the year, and all three are contracted by phone. That's why this is one page without any contact form, on which every path leads to a call.

Ivković Prevoz site homepage with the title Quality firewood
First screen - wood, transportation and hauling in one title, then the call button
Client
Ivković Prevoz
Activity
Firewood, truck transport of goods and vehicle towing
Area
Wood and towing: Leskovac, Lebane and surroundings · Transportation: all of Serbia
Type
One-page site with three service sections
Contact channel
Phone, no contact form
Technologies
Custom PHP 8.3 · Nginx · JSON-LD · Consent Mode v2
Site
ivkovicprevoz.rs
Status
Live site, under active maintenance
Technology
Custom PHP 8.3 · Nginx + FastCGI keš · JSON-LD schema · Consent Mode v2
01

Problem and context

What does Ivković Prevoz do

Ivković Prevoz is a company from Leskovac that does three jobs at once. It sells firewood — beech, oak and hornbeam — with delivery and unloading in Leskovac, Leban and the surrounding area. He drives goods by truck throughout the territory of Serbia. And he tows vehicles with a trailer to Leskovac, Lebane, Vlasotince, Grdelica, Bojnik and the wider area.

The wood is delivered by the meter, in a length of one meter, and the unloading to the desired place is done by the company. On the website, beech is described as the best quality for firewood due to its long heat and little ash, oak as a hard wood with a very long burning time, hornbeam as a more favorable variant that ignites quickly. Those are the descriptions of the offer, not our measurement.

Towing is the most urgent part of the job. This includes a breakdown on the road, but also a more peaceful case — a man who bought a car in another city and wants someone to drive it to him. Truck transport is the only part that leaves the district: from Subotica to Vranje, as it says on the website.

Works from Monday to Saturday, from 7 a.m. to 8 p.m., on Sundays by appointment. There are two phone numbers and no other address — no form, no email, no social media profile. For the site, it is not a limitation but a starting point.

Our services section with cards for sale of wood, trucking and hauling vehicles
Our services - sale of firewood, truck transport and towing of vehicles
02

What needed to be solved

The task was not "make a site for a carrier". It was for one address to serve three businesses that do not have the same customer, the same area or the same season.

  • Three different searches, one page. Someone types "firewood Leskovac" in August, someone "towing service Leskovac" in the middle of the night, someone "truck transport Serbia" from the office. The same page must answer all three, without ever seeming to have gone astray.
  • Different area according to the service. Wood is delivered in Leskovac and Leban, transport goes all over Serbia, haulage covers five places in the district. One sentence like "we cover all of Serbia" would be incorrect for two out of three services and would cost a call.
  • Everything is negotiated by phone. There are no warehouses with counter opening hours, no catalogs with unit prices. Price depends on quantity, distance and term — it's a conversation, not a form.
  • The telephone is both a device and a channel. A man whose car stopped on the way to Grdelica is looking at the website on a small screen, on a weak connection, with one hand.

From that last condition came the biggest decision on the project: the page is made so that it loads quickly even on a bad connection, even at the cost of not having photos on it.

Types of firewood - beech, oak and hornbeam with a description of each type
Types of firewood - beech, oak and hornbeam, each with its own description
03

One page, three jobs

The site is one-sided. All content is in one PHP file, and the navigation anchors are: home, services, types of wood, transportation, towing, contact. There are only two real subpages to that, both legal — the privacy policy and the terms of use.

The decision to keep it one page rather than a site of five was deliberate. Three thin sides that share the same phone, the same footer and the same scope of work are snatching away from each other for the browser, and for the owner, they mean three places to maintain instead of one. A company this size changes content several times a year — one page that's always right is worth more than five that diverge.

For this to work, each service was given its own full-fledged entity, not a paragraph. Section of services gives three cards — wood, transportation, towing — and below it each is elaborated separately: types of wood with a description by type, transportation with six items about coverage and vehicles, towing with six situations in which it is called.

The shipping area is separated into its own box in contact, with three separate lines — wood, transportation, towing — because they are different. It's one of the few places where it's better to repeat yourself than to be brief.

Ivković Prevoz website on the phone
Same site on phone — first screen and call button
04

Site without contact form

There is no contact form on this page. There is no input field, anywhere.

The reason is the same as for any tradesperson working in the field all day: a form creates an expectation that no one fulfills. The visitor sends an inquiry, waits for an answer, does not receive it and calls someone else. In the case of towing, it is even more severe — someone stranded at the roadside will not wait for an answer to an email, he calls the first number he sees.

Instead of a form, the page carries ten prominent call links: a button in the header, a button in the first screen, a call at the end of the transport section, a call at the end of the towing section, both numbers in kontakt, in the final call and in the footer. The two numbers are separated by purpose as the company uses them.

On phones, a number bar stays at the bottom of the screen, which is not lost when scrolling. It comes from a common component that sits in one place for a whole fleet of sites, so a fix to it spreads everywhere at once — which has already paid off, because one version of it had a style inserted in a place that W3C validation doesn't accept.

The side benefit is easily overlooked: a page without any input fields has nothing to receive from the machine. No spam, no anti-robot gate, no inbox filling up with junk.

05

Towing — one service, several search terms

Section about towing is written differently from the rest of the page, because it is requested differently.

People search for the same service as "towing service", "vehicle towing", "roadside assistance", "car towing" and "vehicle transport". These are not synonyms to be listed in one line — they are different search intents arising from different situations. That's why the section has six units that cover the situation, not the service: car towing, light delivery vehicles and vans, breakdown on the road, transport of the purchased vehicle from another city, area covered and response time.

Organizing the content by situation does two things at once. It gives the visitor a line that matches their situation in two seconds, instead of reading a general description of the service. It gives the search engine the text that answers the query in the form of a sentence, not just two words.

Towing is the only service on the site that is also represented in the structured data as separate, with the listed five places covered — Leskovac, Lebane, Vlasotince, Grdelica and Bojnik. Wood and transportation are offered by the company, while towing also appears as a standalone service because customers search for it independently.

06

The page that loads without a single photo

This is the most unusual thing about the project and it is worth saying openly: there is not a single photo on the entire page. No <img>, no <picture>, no request to the image server.

The background of the first screen is a vector illustration written directly into the style of the page — several shapes and circles in earth tones, without a single kilobyte of download. Everything else that looks like an image are icons from the same icon family and emoji characters. The palette is earthy and warm, pulled from one place in style: wood brown, two shades of fire orange, and a cream foundation.

The practical consequence is that the party on the phone has nothing to wait for. No big picture above the fold, no gallery that loads while scrolling, no photo that moves under your finger when it finally reaches its dimensions.

So that it doesn't sound like bragging: this is also a limitation. A photo of a stacked metric beech tree, a truck in the field and a tow trailer with a vehicle on it would be the strongest thing this page could have — such a picture sells better than any description. When such photos exist, they are the first thing that should enter this site, with optimization that will not turn them into a burden. For sharing on networks there is already a special image, which is not loaded on the page itself.

07

Fonts, icons and cache on the server

When there are no images, the first display is blocked by fonts and icons. That is why they are arranged in order.

The site is used by Inter and Montserrat. Both have been taken off Google's servers and are now served from the same domain, and the rules for them are written directly into the page header, so the first view doesn't wait for any additional style files. The four editions of the font that are actually used are announced to the browser in advance, so that it does not discover them until it encounters the first text. A side benefit of switching to your own domain: no request goes to a third party before the visitor clicks anything.

The family of icons went the same way — from someone else's network to our server, because the icon arriving from the side that is currently slow is not an icon but an empty square.

In front of PHP stands nginx with a ready-made cache. The response is stored for an hour, and if PHP fails for any reason, the visitor gets the latest correct version instead of an error. The cache is refreshed in the background and locked while it is being prepared, so ten simultaneous visits to the cold cache do not make ten of the same jobs.

Measured in May 2026, after the first round of fixes: desktop 96/100/100/100 and mobile 73/100/100/100. That number on mobile isn't pretty, and there's no point in embellishing it — the brunt is the analytics script, which is the largest single file on the page. Delaying its loading until the first interaction would have raised the score, but it touches the moment when consent is requested for cookies, so it was not done in a hurry. Fonts and icons have since been transferred locally, which has reduced that burden.

08

Cards that disappeared on the phone

The most interesting failure of this site was not seen in the code or on the computer.

Service cards, wood types and other blocks enter the view with a slight slide from the bottom. This is done by an observer that reports when an element enters the field of view. It was set to only respond when an element is visible at a tenth of its height — which sounds reasonable, and ninety-nine percent of the time it is.

The problem arises with the jumpy scroll. When a visitor clicks on a menu item, presses the end of page button, or swipes their phone in a flash, a lower card can stop at eight percent visibility. The observer then does not receive any calls — because the threshold has not been crossed — so the card remains completely transparent. Forever, until the page is refreshed. On the page that is completely navigated through anchors from the menu, this is not a rare case, but a common way of moving.

The result was that two cards remained invisible on the phone. A client may not describe this as a bug; they simply see a page with missing content.

The fix was two-part: the threshold lowered to zero, and in the same call a pass through all the still undetected blocks with the rule to detect them even if they have already passed above the screen. Checked afterwards on the live site — no block remains hidden. It's also worth remembering how this was found in the first place: a gentle 200-pixel scroll does not reproduce the glitch. It requires a large scroll jump to reproduce.

09

What no one would report

The site undergoes regular checks. A few findings from them say more than any promise of maintenance, because none of them could be noticed by the client.

  • Addresses that lied about their existence. Requests for files not on the site — a service worker, an ad file, a shareable image when it wasn't — returned the entire homepage with an "ok" response. For the search engine, it is a page that exists, so a duplicate of the homepage is indexed under someone else's name. Now each of those addresses returns a real error or a real file.
  • A site that only worked for part of the visitors. The domain had an IPv6 address, and the server for this site only listened on IPv4. Visitors from IPv6-first networks were falling for someone else's default certificate and getting a browser warning. For them, the site looked like it had been hacked, but for everyone else, it worked flawlessly. Solved by adding listen [::]:443 ssl to the config.
  • Measuring before consent. The analytics were set up with no default opt-out, so they measured before the visitor clicked anything. Added full consent mode according to Consent Mode v2 standard with rejection as the starting state.
  • Contrast visible in sunlight. The main button and cookie bar had colors where the white text did not pass the readability threshold. The button has been moved to a darker red, the bar to a darker green. It's not an academic topic for a man looking at his phone outside, next to a broken down car.

In addition: four errors in the W3C check were reduced to zero, icons were generated from a single vector source in all formats required by devices, a manifest for adding to the phone's home screen and a contact file for reporting security flaws were added. The year in the footer is entered manually, not calculated from the date on the server.

10

SEO, schema and visibility

The title of the page in the search result contains all three services and the city, because the page is the only address for all three jobs. The description goes further and names the species of wood and both areas.

The page carries seven blocks of structured data. The company is described with the address, coordinates, working hours and the area it covers. In addition, there is information about the site, about the organization, about beech as a product, questions and answers, the section navigation and towing as a separate service with a list of places. The questions and answers are not embellishments — they are literally questions asked on the phone, the same ones heard on the other end of the line.

The sitemap has exactly three addresses: the homepage and two legal pages. Previously, it also contained addresses with hash fragments — anchors within the same page. An anchor is not an address and there is nothing to look for in the sitemap, because the same page is reported to the search engine several times under different names. The robots.txt file also lets AI browsers pass, and only bans maintenance routes.

The domain is verified in Google Search Console via a DNS record, not a file on the site — a verification that cannot be lost the next time you publish. The language is marked as Serbian, with alternatives for the Serbian speaking area and the default version, and with one canonical URL.

The limit of this approach is fair and worth knowing in advance: one page can rank for as many as one address can. If one day the towing outgrows the rest of the business, that section becomes its own page, and the anchor from it leads on. It's a half-day change, not a new site.

11

Outcome

What the client received

One address that is his, with a full set of security headers, an auto-renewable certificate, and code that sits on the server and can be copied and moved. No monthly subscription to the platform, no plugins that break on the next update, no panel that pops up twice a year.

Practically, the day looks like this. Someone is looking for firewood in Leskovac in September, opens the page on the phone, reads the difference between beech, oak and hornbeam, sees that it is delivered by the meter and that a company does the unloading — and calls. Someone else loses their car on the way to Bojnik, dials towing service, gets a page that opens immediately and a bar with a number at the bottom of the screen — and calls. The third is looking for a truck for goods and sees that the whole of Serbia is covered, so he calls too. All three calls arrive on the same phone, because that is the only channel that this company actually uses.

The legal pages are written for this business, not copied from someone else's site, and the text on them matches what the site actually does.

The site is still under active maintenance. What changes, changes on the live site, backed up before each change and checked in the real browser afterwards. On this project, it paid off at least three times — cards that only disappear on jumpy scrolling, a certificate that only a fraction of visitors see, and addresses that return a title instead of an error cannot be found by reading the code. They are found only when the site is actually opened and measured.

FAQ

Frequently asked questions

Why one page and not a multi-page site?

Because a company of this size changes content several times a year. Five thin sides that share the same phone and the same scope of work snatch each other in the search, and for the owner, they mean five places that can diverge. One side with strong sections keeps all the signal at one address and is always correct.

Why doesn't the site have a contact form?

Because this business is contracted over the phone. The price of wood depends on the quantity and distance, and towing is requested when no one is waiting for an answer to the email. The form would promise an answer that would not arrive. Instead, there are ten places on the page from which calls can be made, and on the phone there is also a strip with a number that does not get lost when scrolling.

How can one page be found for wood, and for transportation, and for towing?

So that each service has its own full-fledged unit with its own titles, and not a paragraph. The title and description of the page cover all three services and the city, and towing is also separated in the structured data as a separate service with a list of places covered.

Why are there no photos on the site?

Because they were not in a usable form at the time of creation, and the page had to open quickly on a weak connection. The background of the first screen is a vector illustration inscribed in the style, the rest are icons. When real photos of the works exist, they are the first thing that should enter this site.

Can the owner himself change the content?

No, and that is intentional. The content changes several times a year — when a service is added or hours of operation change. The admin panel costs more than it's worth for such a rhythm, so changes go through us, with a backup before each one.

What if the business grows — can a site like this be split?

It can. Each section is already a rounded whole with its own headings and its own anchor, so separating it into a separate page is done without rewriting the content. The anchor from the homepage remains and leads to the new page, so no split link stops working.

Next step

Have a project that needs to work better?

Send me your goal and current situation. I will reply with a concrete scope proposal.

Start a project