Sometimes incorrect optimization may prevent the delivery of the ad. There are a few things that you should check in case your campaign is having hard time getting impressions.
1. Too few conversions for the optimization goal
If you have some other optimization goal than Impressions or Reach, Facebook will try to deliver the ad only to those who are likely to convert. To be able to choose these people, Facebook needs enough data. A good rule of thumb is at least 20 lifetime conversions and a CVR that is higher than 0.5% with 1-day click-through window.
The more conversion data Facebook has, the better it will be able to optimize towards finding the people among the billion Facebook users who are the most likely to convert on your website after seeing your ad. Thus, the best practise is to ensure there is enough data by bidding high (at least early on when you launch the campaign/adset), to use big audiences, and to not have too many ads active at the same time in an adset (10-15 is the higher limit, depending on total budget).
2. Too few conversions for the billing event
If you are using some other billing event than Impressions, it's good to ensure that you are having enough conversions for that event (recommended 50 lifetime conversions, or minimum 25 in the first week). Facebook will be wary of delivering the ad, if the payment is unlikely to occur.
3. Bid is too low
A low bid means you will be winning fewer auctions. This means you have lower delivery, fewer conversions, less data for Facebook to optimize on, which in turn results into lower delivery. It's a kind of a vicious cycle. You can combat this by setting a high manual bid in the early lifetime of your campaign/adset.
Remember that some audiences may require higher bids than others. Try using Facebook's Automatic Bidding, it helps in most cases. Note, however, that sometimes even "autobid" has delivery issues as it still wants to avoid spending your budget too lavishly. In these cases, use a high manual bid.
4. Overlapping audiences
Only one ad from your Ad Account can enter the auction for a given ad impression. This means your campaigns can compete against each other due to duplicate targeting, which may cause delivery issue for one or both campaigns. You will not raise your own prices, since only one ad enters the auction — but you might experience underdelivery in one of the adsets. Read more in our blog post: Overcoming Targeting Challenges.
Our product engineer Juho made a good speech about the subject at Smartly.io Connect Stockholm, June 2017. See the video here.