I feel like the question is very broad but I'll try to tackle it in the best way possible.
- Start with low-fi wireframes to iron out the features and interactions.
- Use a prototype tool like Adobe XD or InVision to make a hi-fi wireframe/mockup/prototype.
- Iterate here until all the problems are flushed out.
- Avoid using random data at all costs. Always use actual content (except in step 1)
Goes without saying but, this is the most important part of any process. Gathering requirements shouldn't be just a way of listing down the requirements. It's very important to understand the requirements. Figure out how much the customer understands the domain, are they competent enough to understand wireframes, who are their end users, what does the end user want ...
There's literally no limit to the amount of information you can gather during the first phase. If you're wondering why this is pertinent to the question, then here's the reason.
It helps you understand how abstract or specific the wireframe needs to be.
Based on the size of the project, define how big each step needs to be. And that defines what should be the first step.
For a small project, just prepare a low-fi mock using Balsamiq, let all the stakeholders agree on the items on the screen and the interaction flows and then go straight for a prototype with XD or a POC with dummy data (try and get some data from the customer)
For a big project, it makes sense to start with hand-drawn wireframes, then a low-fi wireframe (using Basamiq or something), then a hi-fi wireframe/prototype (using Invision or Adobe XD) and in the end, maybe even a working POC.
Iterate Quickly and Efficiently
Whatever method and tool you use for wireframing or mockups, make sure it's easy to update. Keep iterating until you find the right fit and try to avoid dumping too many changes onto a single iteration. And don't forget to log each iteration as a separate version and KEEP ALL THE VERSIONS! Trust me, I learnt the hard way.