Troubleshooting
A section is missing from a published policy
Almost always an unanswered question. A clause whose condition depends on an answer you have not given drops out silently — that is the design, because half a sentence is worse than none.
Open the policy: unanswered facts are listed under Warnings, each naming the question. The audit reports the same thing site-wide.
"This policy compiled to nothing"
Every clause was either switched off or gated behind an answer you have not given. Toss refuses to publish it, because a document with no sections is a heading with nothing under it — invisible on every screen that lists what exists.
Answer the required questions and recompile.
A policy 404s
Three things to check, in order:
- Has it been published? A compiled policy has no URL until you publish it.
- Is the URI format set? An empty pattern in Settings means no policy is reachable. The audit calls this critical.
- Is the entry enabled for that site?
Kit markup is not appearing
- Is the kit enabled in Toss → Kits, and does it need Pro?
- Is Place kit markup automatically on in Settings?
- Does the URI match Skip these paths?
- Is the response actually an HTML page? Toss does not touch JSON, XML or redirects.
If you turned automatic placement off deliberately, place them yourself — craft.toss.footerLinks()
and friends.
The footer links are empty
Only published policies are ever linked. If you have selected specific policies in the kit and
none of them is published yet, the kit renders nothing at all rather than an empty <nav>.
A tag still fires with consent declined
Consent gates the tags in the inventory. A tag pasted directly into a template is outside it, and nothing can hold it back.
Move it to Toss → Scripts and give it a category. The audit flags this combination — a cookie policy promising consent while non-essential tags load regardless is reported as critical, because it is a promise the site is breaking in writing on every page.
The consent banner will not go away
The revision has moved. Consent is recorded against the vendor list it was given for, so changing the inventory asks everybody again — consent to a list of vendors is not consent to a different one.
If it reappears on every page load, the save request is failing. Open the network tab: a 400
means the CSRF token was rejected, which happens on a statically cached page. The runtime already
retries once with a fresh token, so a persistent 400 usually means the action URL is being
rewritten or blocked upstream.
Embeds are not coming back after consent
|tossGate only rewrites <iframe> elements. A provider embedded with a <script> that writes an
iframe at runtime is not caught — put that script in the inventory instead, where it can be gated
properly.
The endorsement disclosure never appears
It inserts after the first <h1> or before the last </article>. If your template has neither,
nothing is inserted — deliberately, rather than guessing at a <div> and landing in your sidebar.
Either add one of those anchors, or turn automatic placement off and call
{{ craft.toss.disclosure() }} where you want it.
An acceptance was not recorded
Toss records at the end of the request, and only if the response is a redirect. A form that
re-renders on failure leaves no record, which is correct. A form that returns JSON on success also
leaves none — post to toss/acceptance/record from your own handler.
Check too that the agreement kit is enabled: the checkbox renders nothing when it is not.
A policy says it is out of date immediately after publishing
That should not happen. If it does, the stored stamp is unreadable — republish once and it clears.
Everything looks wrong after a composer update
Expected, and the point. A new clause library means the text has improved, and every policy that uses a reworded clause now reads as out of date. Open the diff, see which clause changed, and republish when you are happy.
craft toss/policies/check gives you the same answer in CI, and exits non-zero so a deploy can
stop on it.