Third-floor flat, no outdoor space at all, Labrador puppy at 9 weeks. Fully clean by 11 weeks. Here is exactly what we did, because I read forty guides that all assumed a garden.
One spot, chosen by us, never moved during training. A plastic tray with a puppy pad on the utility balcony. Not two spots. Not "wherever she goes is fine". One.
The schedule, which is the whole thing. Out to the spot: on waking, after every meal, after every play session, and every 45 minutes otherwise. Yes, 45 minutes. Yes, including through the night for the first fortnight — I set an alarm for 2am and I would do it again, because two weeks of bad sleep bought us a clean dog for the next decade.
Stand there and say nothing. No playing, no talking. Boring. If nothing happens in four minutes, back inside, and try again in fifteen. Playing outside teaches the pup that going out is playtime and it will hold it in to make the trip last.
The moment she finished, praise like a lunatic and a treat within two seconds. Two seconds. Five seconds is too late, the dog has already connected the treat to whatever it is doing now.
Accidents: clean it with an enzyme cleaner, not with Dettol or phenyl. This is the bit almost everyone here gets wrong. Anything with ammonia in it smells like urine to a dog and marks the spot as the toilet. Biological washing powder dissolved in water works if you cannot find a proper enzyme cleaner.
Never punish a puddle you did not see happen. The dog cannot connect it. All you teach is that you are unpredictable and that weeing in front of you is dangerous — so it starts going behind the sofa instead, and now you have a much harder problem.
What I would skip second time: the pee-attractant spray. Did nothing. And I would not bother with bells on the door until the pup is already reliable — we tried it at 10 weeks and just ended up with a dog who rang a bell for fun.