Skip to main content

Debugging Template Logic

When your template doesn't produce the expected output, here are some techniques to figure out what's going on.

Common issues and fixes​

Variable not showing up​

If {{my_variable}} renders as blank, check these things:

  1. Is the variable name correct? — variable names are case-sensitive. {{Name}} and {{name}} are different
  2. Is it in your JSON? — open the Sample JSON tab and make sure the key exists
  3. Is it nested? — if your JSON has {"user": {"name": "Mike"}}, use {{user.name}}, not {{name}}
  4. Is it empty? — the variable might exist but have an empty value. Use {{ my_var | default("MISSING") }} to confirm

Template syntax error​

If you see an error when rendering, look for:

  • Unclosed tags — every {% if %} needs {% endif %}, every {% for %} needs {% endfor %}
  • Missing braces — make sure you have {{ and }} (two of each)
  • Typos in tag names — {% fore %} instead of {% for %}

Loop not rendering​

If a {% for %} loop produces no output:

  1. Check that the variable is actually a list/array in your JSON
  2. Make sure the JSON array isn't empty
  3. Verify you're using the correct variable name

Debugging techniques​

Output the raw JSON value to see what data you're working with:

<pre>{{ my_variable | json }}</pre>

This renders the variable as formatted JSON, which helps you see the structure.

Use default filter to detect missing values​

<p>Name: {{ name | default("** NOT SET **") }}</p>
<p>Email: {{ email | default("** NOT SET **") }}</p>
<p>Items count: {{ items | length | default(0) }}</p>

Check variable type​

If you're not sure what type a variable is, output it in different ways:

<p>Raw value: {{ my_var }}</p>
<p>Length: {{ my_var | length }}</p>
<p>As JSON: {{ my_var | json }}</p>

Test conditions step by step​

If a complex condition isn't working, break it into parts:

<!-- Instead of this: -->
{% if user.role == "admin" and user.active and items | length > 0 %}

<!-- Test each part separately: -->
<p>Role: {{ user.role }}</p>
<p>Active: {{ user.active }}</p>
<p>Items count: {{ items | length }}</p>

Quick Preview vs Generate PDF​

Quick Preview (Ctrl+Q) renders the HTML in the browser instantly. It's great for checking template logic quickly, but it doesn't include headers, footers, or PDF-specific settings.

Generate PDF produces the actual PDF file with all settings applied. Use this to verify the final output, including page breaks, margins, and headers/footers.

Use Quick Preview for rapid iteration and Generate PDF for final verification.

Getting help​

If you're stuck:

  • Double-check your JSON structure in the Sample JSON tab
  • Review the Jinja2 documentation for syntax details
  • Reach out to support — the team is responsive and happy to help