# Troubleshooting

Start with the **Overview** tab of the [plugin settings](https://docs.affkraft.com/dinodds/plugin-settings#overview): it shows the feed status, the last error, the number of upcoming matches per league and warnings about problems it can see.

## The table shows a loading animation forever, or "Odds could not be loaded"

The page only holds an empty table; the visitor's browser loads the odds from your website's [REST endpoint](https://docs.affkraft.com/dinodds/rest-api). If that request fails, the script tries the older `admin-ajax.php` route, and shows the error only if that fails too.

1. Open `https://your-site.com/wp-json/dinodds/v1/odds?league=nfl` (use one of your leagues) in a browser. You should see JSON. If you see an error page, a login prompt or a block page, something is stopping the request.
2. Security and firewall plugins, hosting firewalls and some CDN rules block or restrict the WordPress REST API for logged-out visitors. Allow requests to `/wp-json/dinodds/v1/` (and `admin-ajax.php`) for everyone. Plugins that "disable the REST API for visitors" will break DinOdds tables.
3. Check the browser console for JavaScript errors. Scripts broken by a "minify/combine/delay JavaScript" optimization are a common cause: exclude the DinOdds script from it.
4. Visitors need JavaScript enabled to see the odds.

## Nothing is shown at all

* The shortcode needs a `league`. Without one, nothing is output. Check the spelling of the shortcode, and that it's in a place where WordPress runs shortcodes (post content, a Shortcode block, a text widget).
* If you use the block, make sure a league is chosen in the block settings.
* A theme or page builder that doesn't run shortcodes or render dynamic blocks in that location will not show it. Try the post content first.

## The table says no matches are available

* **The league isn't in your feed.** The league slug must be one of those listed on the Overview tab. Choose leagues in your [AffKraft account](https://affkraft.com/account), then save your Client ID again in the plugin sidebar.
* **No upcoming games.** A league that is out of season has none (it's dimmed and flagged on the Overview tab). Games that have already started are not shown. Game times are US Eastern.
* **Single match not found.** `away` and `home` must both be given and match the team names in the feed exactly. Use the **Match** list in the [shortcode generator](https://docs.affkraft.com/dinodds/plugin-shortcodes#shortcode-generator) or the block to pick the game. Once the game starts it disappears, and the table says no matches are available.

## A sportsbook is missing, or has no link

* Only sportsbooks in your feed are shown. Sportsbooks are chosen in your [AffKraft account](https://affkraft.com/account). After changing the selection, click **Change** next to the Client ID in the plugin sidebar and save the same Client ID.
* A sportsbook listed in `bookies` that isn't in your feed is ignored.
* Sportsbooks without an affiliate link are flagged **Missing** on the [Sportsbooks tab](https://docs.affkraft.com/dinodds/affiliate-settings).

## Odds look outdated, or the feed status is red

* Open the Overview tab. **The last update failed** shows the reason. **Feeds are out of date** means no successful update for over two hours.
* Updates run through WP-Cron. If your site gets little traffic or `DISABLE_WP_CRON` is on without a system cron job, they don't run. See [Scheduling](https://docs.affkraft.com/dinodds/scheduling).
* Make sure your server can make outgoing requests to the feed server (`feeds.dinomatic.com`) and, for plugin updates, to `api.affkraft.com`. Some firewalls block them.
* An expired subscription, or a website (domain or IP) that isn't allowed in your account, gets access refused. Check your settings in your [AffKraft account](https://affkraft.com/account) and see [DinoFeeds API](https://docs.affkraft.com/dinodds/api).
* Click **Update now** to try again right away. It works at most once every 5 minutes; if you click too soon, the message says how long to wait.
* If updates stopped after deactivating the plugin, reactivate it. The hourly update is scheduled again on activation (and restored automatically when a Client ID is set).

## The Client ID is rejected

Make sure there are no spaces before or after the key, your subscription is active, and your server can reach the feed server. See [Plugin Setup](https://docs.affkraft.com/dinodds/plugin-setup).

## Caching

Page caching is safe with DinOdds. The page contains no odds, only a placeholder, and the browser loads the odds from the REST endpoint. A caching plugin, host cache or CDN can cache the page for as long as you like without showing stale odds.

The REST response is cached until the next scheduled feed update (at least 60 seconds, at most one hour), through its `Cache-Control` header. Odds can therefore be as old as the last feed update, but never older.

* **After updating to 1.7**, purge your page cache once. Pages cached by earlier versions still carry the old markup (they keep working through the legacy route, but you won't get the new behaviour until they are rebuilt).
* If a CDN or optimization plugin caches `/wp-json/` responses for longer than the header says, exclude `/wp-json/dinodds/v1/` from that rule so the odds stay fresh.
* After changing a logo, link or the [Display](https://docs.affkraft.com/dinodds/colors) settings, purge the page cache if you still see the old version: logos and links are part of the odds markup, and the highlight colour is added to the page's styles.

## The settings page or the block are missing

The block needs the block editor (WordPress 6.0 or newer). The settings page is in the **DinOdds** menu and only shows for Administrators. The AI & Abilities tab works only on WordPress 6.9 or newer, see [AI & Abilities](https://docs.affkraft.com/dinodds/ai).

## Still stuck?

[Contact support](https://affkraft.com/contact) and include your DinOdds and WordPress versions and what the Overview tab shows.
