Ballast or chemical anchors, the waterproofing detail at every penetration, how far to set the array back from a parapet, and the dead load question on a slab that has already been re-screeded twice.
The complaint never arrives in the first year. It arrives in the second monsoon, as a damp patch on a top floor ceiling that follows a straight line, and the straight line is a row of anchor bolts. By then there are modules over the top of it, and finding the actual entry point means demounting part of the array.
An RCC roof is a much friendlier place to build than a tin shed, but it has one failure mode that a shed does not: every fixing you make is a hole through the layer that keeps water out of the building. There are only two ways to deal with that, and both of them have a price.
A ballasted system holds the array down with weight. Nothing is drilled, the waterproofing stays intact, and the whole installation is reversible, which matters if the building is leased or if the membrane is under a guarantee that a drill bit would void. The cost is load, and it is not a small one. Ballast has to resist wind uplift on its own, and uplift is worst exactly where you have least room to put weight, at the roof edges and corners. The result is that a ballasted layout carries far more mass at the perimeter than in the middle of the field.
Two things make ballast work and are routinely skipped. The first is tying the array together so that it behaves as one block: uplift on any single module is then resisted by the weight of everything it is connected to, not just by the blocks under that module. The second is a protection layer between the ballast and the membrane, usually a slip sheet or a rubber pad, because a concrete block resting directly on a bituminous or liquid-applied membrane will abrade it as the frame moves with temperature. Check also that the friction assumption in the design matches the actual roof finish. A wet, algae-covered screed is not the surface the calculation assumed.
A penetrating system trades that load for holes. Fewer, smaller, more predictable fixings and much less dead load, at the price of a waterproofing detail that has to be right at every single point. On an older slab where the load capacity is the binding constraint, penetration is often the only workable answer, and the leak risk is entirely a question of workmanship rather than of concept.
The third option, still the most common on Bangladeshi roofs, is a cast concrete plinth. It has a habit of combining the disadvantages of both. It adds most of the weight of ballast, and if it is cast onto the existing waterproofing then that waterproofing can never be renewed. Plinths also dam water. Cast a continuous line of them across the fall of a roof and you have built a low wall, water ponds behind it, and the slab sits wet through the monsoon. If plinths are used, they need drainage gaps in every run and a properly formed detail where they meet the deck, not a smear of mortar.
This is the sequence that keeps a roof dry. Each step exists because skipping it has caused a leak somewhere.
Sequence matters as much as detail. The waterproofing work should be completed, tested and signed off as its own hold point before a single rail is lifted. If the array goes on first and the leak appears later, every subsequent conversation is about who pays for the demount.
If the building has a membrane still under guarantee, the guarantee almost certainly excludes penetrations made by anybody other than the membrane contractor. That is a real commercial issue and it is easier to solve before the contract than after. The usual answer is to bring the original waterproofing contractor in as a subcontractor for the penetration details, get their sign-off on the sequence, and have the guarantee extended in writing over the new work. Budget for it. The alternative is a solar plant that has quietly cancelled the roof warranty on a building worth many times more than the plant.
A parapet is the shading object everybody forgets, because at noon in April it casts almost nothing and the roof looks clear. The design case is not April noon.
The geometry is simple. Shadow length on the horizontal equals the height of the obstruction divided by the tangent of the sun's altitude, projected along the sun's azimuth. Bangladesh sits at roughly 21 to 26 degrees north, so at the winter solstice the noon sun is somewhat above 40 degrees altitude, and in the hours either side of noon it is much lower. The worst case a designer normally works to is the shadow at a stated time either side of solar noon on the shortest day, and the choice of that window is a commercial decision about how much winter morning generation the owner is willing to give away. Make it explicitly, with a shading simulation on the surveyed geometry, rather than by applying a rule of thumb to a parapet nobody measured.
Two practical consequences follow. First, the setback on the southern parapet is the large one, and on a small roof it can cost a whole row. Second, and more important, a partly shaded module drags down every other module in its string. If a bottom row is going to be shaded for part of the winter, either leave it out or put those modules on their own MPPT input so the loss stays local. Bringing one shaded module into a healthy string is the most expensive way to gain a module.
While you are measuring the parapet, measure everything else: overhead water tanks, the stair headroom, lift machine rooms, exhaust cowls, the mobile tower on the neighbouring building, and any adjacent plot where a taller building is likely to go up. That last one is a judgement call, and it is better made openly at design stage than discovered in year three.
The array itself is light. Modules, rails and clamps spread over a roof add a fraction of what the slab was designed to carry as live load. Ballast is a different matter, and so is a field of concrete plinths, and the two together on an old roof are how a slab gets overloaded by a solar project.
Three things need checking, and only a structural engineer can close them out:
Where drawings do not exist, which is most of the time, the route is a measured survey with rebar scanning to establish slab thickness and reinforcement, a materials assessment, and a calculation by an engineer who signs it. On a genuinely marginal roof, an in situ load test is cheaper than the alternative.
One last thing that gets designed out and then built back in by accident: keep the roof drains clear and keep a walkway. An array installed hard against a parapet with no access strip traps leaves, dust and bird litter behind it, blocks the outlet, and turns the roof into a shallow tank. That failure has nothing to do with the fixings, and it floods buildings all the same.