This is an extremely broad question that has been asked by our newest clients on numerous occasions. It is easy to provide multiple factors that could be causing this situation to occur, but when talking to a client, its tough to provide them with a multiple factor answer instead of a clear-cut solution to the problem.
This issue could be caused by various factors such as not bidding enough on relevant keywords or not running enough relevant keywords to be matched up with the search query, but in my experience I have found that this issue always has to do with long tail search queries and low search volume. Before I dive into how I came to my conclusion, let me show you how I was able to write off the other factors.
Not bidding enough could be a likely reason for the issue and can be tested in a variety of ways such as, looking at our search impression share (Impressions you received divided by the estimated number of impressions you were eligible to receive) for each keyword or by looking at the Max. CPC for the top ad spot. However, in the case of long tail keywords, this is almost never the case because long tail keywords do not generate enough impressions to require higher bids.
Not running relevant keywords is also possible, but very unlikely because the client should know the list of keywords that are running and should be running relevant search queries to see if their ad will appear. Regardless, you should take a look at your keyword list and compare it to the search query to see if you need to add shorter tailed keywords that are likely to receive more impressions. My recommendation is to use broad match modified keywords to capture the search queries that your more precise (phrase and exact match type) keywords might not capture.
After writing off the most common factors that would contribute to this problem, I noticed that the clients search queries were identical to our long tail keywords with a "low search volume" keyword status. This status signifies that there are not enough searches to run your ad, but in many cases, ads will appear for that search query. Despite the informational tooltip that Google provides on low search volume, there is not that much common knowledge as to how ads are chosen for search queries matched to low search volume keywords. As a result, I decided to find out more about low search volume and what it really means:
What does "low search volume" mean?
-Keywords marked as "low search volume" represent low search traffic on Google and as a result, Google temporarily makes these keywords inactive so that they don't trigger your ads.
-If the number of search queries for these keywords increases even a small amount, they will be reactivated and will start triggering your ads to show again. Note: Google's system checks and updates this status once per week.
Why does Google deactivate keywords?
-Typically the keyword is too specific and obscure, so keeping these keywords out of ad auction helps AdWords serve ads more efficiently and reduces the volume of keywords on the system. Before the system stops a keyword for auction, it evaluates searches worldwide for that keyword within the past year.
Why are my competitor's ads showing up for my search query if we are bidding on keywords that exactly match the search query?
-Despite running a keyword that exactly matches the search query, our keyword has been deactivated because no one else has replicated that search. In this case, Google matches the terms used within the search query to shorter tailed keywords, and runs the ads for those keywords instead. This is the exact reason why this issue is occurring.
-Keep longer tailed keywords active because even the smallest amount of search queries will activate the keyword and run your ad. Remember: It takes a week for the system to notice the search traffic and determine that the keyword should be activated.
-Add shorter tailed keywords to your ad group that will generate more volume (broad match modifier match type). It is possible that these keywords will end up being picked to appear for the search query.