Flask
Add Fluxner analytics to your Flask app
Flask renders Jinja templates, and most apps extend a shared base layout, so the snippet goes into that layout's <head>. Flask exposes app.config to every template as config, so store the site ID there and reference it from the template.
Get your tracking snippet
In your Fluxner dashboard, open Site Settings → Tracking Script and copy your snippet. It looks like this:
<script src="https://fluxner.com/api/script.js?siteId=YOUR_SITE_ID" defer></script>YOUR_SITE_ID is the numeric ID of your site. If you self-host Fluxner on another domain, replace fluxner.com with your instance's domain.
Add the snippet to Flask
Configure the site ID
Flask loads any environment variable prefixed with FLASK_ into app.config when you call from_prefixed_env(). Set the values in your environment (flask run also reads a .env file when python-dotenv is installed):
FLASK_FLUXNER_INSTANCE_URL=https://fluxner.com
FLASK_FLUXNER_SITE_ID=YOUR_SITE_IDThen load them where you create the app:
from flask import Flask, render_template
app = Flask(__name__)
app.config.setdefault("FLUXNER_INSTANCE_URL", "https://fluxner.com")
app.config.from_prefixed_env()
@app.route("/")
def index():
return render_template("index.html")from_prefixed_env() parses values as JSON where it can, so a numeric site ID arrives as an int. It renders the same in the template.
If you keep configuration in a Python file or class instead, add FLUXNER_INSTANCE_URL and FLUXNER_SITE_ID there and load it with app.config.from_object().
Add the tag to your base layout
Open the template that your pages extend, usually templates/base.html (or templates/layout.html), and add the tag inside <head>:
<head>
<meta charset="utf-8">
<title>{% block title %}My App{% endblock %}</title>
{% if config.FLUXNER_SITE_ID %}
<script src="{{ config.FLUXNER_INSTANCE_URL }}/api/script.js?siteId={{ config.FLUXNER_SITE_ID }}" defer></script>
{% endif %}
</head>config is part of Flask's standard template context, so no context processor is needed. The {% if %} guard skips the tag when FLUXNER_SITE_ID is unset, so local development is not tracked unless you set the variable.
Templates that do not extend the base layout need the same tag in their own <head>.
Verify installation
Open your live site in a new tab and click through a few pages. Within a few seconds the pageviews appear in the Fluxner dashboard.
If nothing shows up:
- View the page source and search for
script.js?siteId=to confirm the snippet is on the page. - Open the browser Network tab and check that
script.jsreturns200and thatPOSTrequests go to/api/track. - Disable ad blockers, or set up a proxy so the script loads from your own domain.
- See the script troubleshooting guide for other common causes.
Troubleshooting
- Tag missing:
from_prefixed_env()reads the environment when the app is created, so restart the server after changingFLASK_FLUXNER_SITE_ID. Checkapp.config["FLUXNER_SITE_ID"]inflask shell. - Macros imported into other templates:
configis added to the render context, not to imported templates. A macro that outputs the tag must be importedwith context. - Content Security Policy: if you set one with Flask-Talisman or similar, add your Fluxner host to
script-srcandconnect-src, or proxy the script through your own domain. - Self-hosted instance: set
FLASK_FLUXNER_INSTANCE_URLto your own domain without a trailing slash; the template appends the script path to it.
Next steps
- Track custom events such as signups, purchases and button clicks.
- Identify users to connect sessions to accounts.
- Proxy the script through your own domain to bypass ad blockers.
- Script attributes let you skip or mask URLs and tag events.