The likely causes, ranked
Roughly in order of how often each one turns out to be the real answer.
1. The platform cached the old version
The most common reason a correct fix appears not to work. Platforms fetch once and hold on to what they found, sometimes for a long time. The tags are fine; you are looking at a memory. Use the platform's own debugger to force a fresh fetch.
2. There are no Open Graph tags at all
Very common on older sites and hand built pages. Nothing to read means nothing to show, and the platform falls back to a bare grey box.
3. The image URL is relative, not absolute
The tag says /assets/og.jpg. Your browser resolves that against your domain automatically. A platform fetching from its own servers has nothing to resolve it against. It must be the full https://yourdomain.com/assets/og.jpg.
4. The image is not publicly reachable
Behind a login, on a staging server, blocked by hotlink protection, or sitting behind a firewall rule that treats unknown fetchers as bots. The test is simple and decisive: open the image URL in a private browser window with no session. If you cannot see it there, neither can the platform.
5. The image is the wrong shape, too big, or too slow
Wildly wrong ratios get cropped strangely or rejected. A very heavy file may time out on one platform while succeeding on another, which is why a link previews on WhatsApp and not on LinkedIn. 1200 by 630 and a sensible file size avoids all of it.
6. The page is only assembled by JavaScript
Platform fetchers read the HTML your server returns. They generally do not run your scripts. If the tags are injected client side, they may as well not exist. The check is to view page source, which shows what the server actually sent, rather than the inspector, which shows what the browser built afterwards.
7. A plugin or theme is fighting you
Two plugins each writing og:image produce duplicate tags and unpredictable results. If you find two, that is your answer.