django-invitations is the reusable app for gated sign-up
Generic invitations app for Django
At a glance
- What is it?
- django-invitations is a JazzBand project providing a generic invitation flow for Django, with an adaptable backend and support for django-allauth, so a site can require an invitation before registration. The package is GPL-3.0, supports Django 3.2 through 5.0, and the repository carries translation tooling and a test matrix for the allauth integration.
- Who is it for?
- django-invitations suits a Django project that needs registration to be gated, whether that is a closed community tool, a research platform with a limited cohort, or an internal tool where accounts are issued by an administrator, because it ships the flow rather than making you write one, and because the allauth support means it can sit inside an authentication stack you already use.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 5 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 24, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A generic invitation flow, and what generic means here
django-invitations is described in one line as a generic invitations solution with an adaptable backend and support for django-allauth, and that single sentence contains the design. A Django application that wants to require an invitation before someone can register has a fairly fixed shape of behaviour, an invitation exists, it is bound to an email address, it can be used once, it expires, and the registration form checks it. The word generic here means that the application does not decide how that behaviour is stored or administered. The backend is adaptable, which is the phrase the readme uses, and the implication is that the storage and management layer can be replaced or extended by the project using it, rather than the package dictating a model and a migration set. That is the difference between a reusable app and a recipe. For a project that wants to issue invitations from an admin, or from a billing system, or from a CSV import, an adaptable backend is the difference between a week of work and an afternoon. What the readme does not spell out is the interface contract, so the documentation at the read the docs site is where you would look before committing.
The allauth support is the reason the project exists as a package
Support for django-allauth is called out separately in the description, and the repository layout shows how seriously that integration is taken. Alongside the main test settings module there is a separate settings module named for the allauth case, and a separate test urls module, which is the pattern of a package that has to prove it works both with the integration enabled and without it. That is the right way to test an optional dependency in a reusable Django app, and it is the reason the project can claim compatibility rather than just a note in the readme. The allauth ecosystem is the usual way Django projects handle sign-up, social login and the whole registration flow, and an invitations app that did not work inside it would be of limited use. The integration also changes what the invitation is for, since in an allauth based site the invitation is a gate in front of a flow that already exists, rather than a registration system of its own. The dependency list in the packaging keeps the hard requirements deliberately small, with Python and Django and nothing else, so allauth stays optional at install time.
Translation is treated as a first class concern
The Makefile at the top of the repository exists to serve one purpose, the translation workflow. The default goal is the second of two targets, and the first compiles the message catalogues from the source strings, running the Django management command that extracts messages for every locale without wrapping lines. The second target then compiles the catalogues into the binary form the runtime actually loads.
po:
cd invitations && python ../manage.py makemessages -a --no-wrap
mo: po
cd invitations && python ../manage.py compilemessagesThe clean target removes the compiled files, which tells you they are build artefacts rather than committed files. A reusable app that is going to be installed into projects with any number of user interfaces needs its strings extracted, translated and compiled, and doing that with a Makefile wired to the Django tooling is the conventional approach. The presence of a locale directory inside the app package is the other half of the story, since that is where the catalogues live. It is a small detail, and it is a decent signal about the state of the project, because an app that ships translations has an actual international user base rather than an English only afterthought.
The test and packaging setup is modern Django practice
The development tooling is the usual modern Python stack, and the packaging file shows it plainly. The project is built with poetry-core, the managed tool is poetry, and the development dependencies are pytest with the Django plugin, pytest-cov and coverage, flake8 for linting, black for formatting, freezegun for controlling time in tests, tox for running the matrix, and pre-commit for the hook-based workflow. The presence of freezegun is worth a second look, because an invitations app is precisely the kind of package where the current time decides the outcome, since an invitation expires and a registration window closes, and a test suite that depends on the wall clock is a flaky suite. Freezing time is how you test expiry without waiting. The black configuration targets Python 3.10 with a line length of 88 and excludes the migrations directory, and there is a separate tox configuration for running the suite across environments, plus a coveragerc and a pre-commit configuration at the top level. The repository also keeps a CHANGELOG, a CONTRIBUTING guide and a documentation directory that feeds the read the docs build.
The supported version matrix is broad, the release history is not
The packaging metadata declares the package as version 2.1.0, licensed GPL-3.0-only, maintained by JazzBand, with the classifiers listing a development status of production and stable, and it enumerates support for Django 3.2, 4.0, 4.1, 4.2 and 5.0 alongside Python 3.8 through 3.12. The requirement itself is loose, with Python at a caret constraint on 3.8 and Django at 3.2 or newer, which is what a reusable app should do, since the point of the package is to be installed into projects that pin their own versions. The git history tells a different story from the metadata, though. The release list contains 2.1.0 from 2023-11-22 and 2.0.0 from 2022-09-28, and the last push to the default branch was on 2026-10-19, so the branch is receiving work well after the last tagged release. The practical read is that the code is maintained while the published versions move slowly, so if you pin a version from PyPI you are pinning something from 2023, and if you track the default branch you are tracking unreleased work.
JazzBand governance is part of what you get
The project is a JazzBand project, and the readme says so in the contributing section: contributors are expected to adhere to the JazzBand contributor code of conduct, and the guidance is to read the contributing guide in the repository first. JazzBand is a collective that hosts many Python packages under shared governance, and being part of it means the project benefits from a maintainer group rather than a single person, along with shared infrastructure for releases and documentation. It also means the expectations are written down somewhere other than the maintainer's preferences. The practical reasons to care are continuity and review. A reusable app that you intend to keep in a project for years is easier to depend on when the governance says the project is not one person's hobby, and the fact that the maintenance metadata lists the maintainers as JazzBand rather than an individual is the operational expression of that. The license is GPL-3.0-only, which is the standard choice for JazzBand packages and worth checking against your own distribution plans before you install it in a closed source product.
Editorial conclusion
django-invitations suits a Django project that needs registration to be gated, whether that is a closed community tool, a research platform with a limited cohort, or an internal tool where accounts are issued by an administrator, because it ships the flow rather than making you write one, and because the allauth support means it can sit inside an authentication stack you already use. It is the wrong choice for a project that needs a public sign-up with occasional moderation, since that is a different problem, and the wrong choice if you need features the adaptable backend does not model, because the readme does not describe what the backend interface covers. Verify three things before you adopt it: which Django versions your project runs and whether they are in the supported range, whether the allauth integration is required by your stack or optional for you, and how the app stores and expires invitations, which the readme leaves to the documentation. The licence is GPL-3.0-only, the last push was on 2026-10-19, and the newest tagged release is 2.1.0 from 2023-11-22.
Frequently asked questions
What does django-invitations do?
It is a generic invitations solution for Django with an adaptable backend and support for django-allauth, so a project can require an invitation before a user can register. It is packaged as a reusable app called invitations.
Which Django and Python versions does django-invitations support?
The packaging metadata lists Django 3.2, 4.0, 4.1, 4.2 and 5.0 with Python 3.8 through 3.12, and the dependencies require Python 3.8 or newer and Django 3.2 or newer. The project is licensed GPL-3.0-only and maintained by JazzBand.
How is the django-allauth integration tested?
The repository carries a separate settings module for the allauth case alongside the main test settings, plus a separate test urls module, so the suite exercises the package both with the integration enabled and without it. The allauth dependency itself is not a hard requirement of the package.
How are translations built in django-invitations?
The Makefile drives the Django tooling, with a po target that extracts messages for every locale without wrapping lines and an mo target that compiles them, and a clean target that removes the compiled files. The catalogues live in the locale directory inside the app package.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/jazzband-django-invitations)Was this useful?