I set Expires headers but my scores are low

On GTmetrix, you'll find Leverage Browser Caching under PageSpeed and Add Expires Headers under YSlow. Pingdom uses Leverage Browser Caching score and Webpagetest - Cache Static Content.

If you set Expires headers, take a look at the recommendations by opening up the score sections on GTmetrix or Pingdom or clicking on the score square on Webpagetest. If your Expires are properly set, then what you should see is only the 3rd party, external resources - fonts, analytics, social media, etc. These as a rule have short expirations and affect scores. This is outside of our control. If you only have a few, this will not affect your site speed much. If you have many, then you may want to cut down on their use or perhaps rethinking what tools you're using for social media, etc. Don't let the scores affect these decisions though - they don't matter in the end, only speed matters.

If you're getting a low score for Browser Caching on GTmetrix, it's showing your site's resources with short expirations, and you're using CloudFlare, then this can be fixed by setting Browser Caching (under Caching on CloudFlare) to a minimum of 16 days. PageSpeed is looking for "Far-future expirations " of over 14 days. Pingdom is looking for expirations of 7 days or longer. This may or may not be fine for your site, depending on how often your content changes. So if you need shorter expirations, don't let scores dictate, do what's best for your visitors and your objectives.