I interviewed at a big startup that recently IPO'd and was offered a staff engineer role verbally after the interview loop concluded. I've been in touch with the recruiter to get a formal offer for around 3 weeks now but it just keeps getting delayed.
Three weeks is significantly longer than I've experienced between the verbal confirmation and written offer. Do you have details of the offer or just the confirmation that you will be getting an offer?
I'd ask for details of the offer even if the company needs more time to put it together formally (i.e. in writing). This will help you get a sense of how this offer compares with the others.
If the offer is competitive, use it as leverage with the other pending offers.
If the offer is not competitive, I'd mostly ignore this company and focus on the others.
Can you ask them for an ETA when the offer may come, along with an explanation of why it's taking so long? This may also indicate chaos or disorganization within the company which you'd want to avoid.
I recommend sending back a clarifying email listing out all the components of the verbal offer. Getting an email in writing is a step closer to a written offer all things considered.
Something along the lines of "I just wanted to make sure I captured the offer communicated on X date clearly, so I can make the most informed decision and make an apples-to-apples comparison vs. the other offers I have on hand"
Feel free to modify this based on how hard you want to push for closure. I would recommend keeping in the part about comparing vs. other offers you have though.
If you have the ability to walk away (which you do with competing offers), you have the room to be more aggressive with negotiation and pushing for things in general. I would keep following up every 2-3 days and share the context behind your leverage (i.e. your competing offers).
And as Rahul mentioned, 3 weeks is weirdly long and unprofessional. 2 weeks is the upper bound from my experience. My Meta offer actually took 2 weeks to come in - It took so long that I thought I had been rejected 😅