Release Notes - version 2.023.21

We are pleased to announce a new release of KoboToolbox comprising the following components:

  • KPI version 2.023.21
  • KoBoCAT version 2.023.21
  • Pyxform version 1.9.0, unchanged from the previous release
  • Enketo Express: 6.1.0 [Enketo has been rolled back to the previous release; see posts below]


This is primarily a maintenance release with few user-facing changes:

PR Description
kpi#4419 Add Amharic as a UI translation and change German language code
Add a UI Translation for Amharic and change the UI language code for German
kpi#4321 Fix the mandatory asterisk not updating properly
Previously mandatory asterisk in Form Builder (next to row name) was only updated on initial opening of the form. Now it also updates whenever it is being changed in the row settings.
kpi#4442 Update radio and checkbox styles
Simplified and more modern styles for checkboxes and radio inputs
kpi#4426 TagsInput component cleanup
Slightly update the styles for tags editing to better fit with new UI look.

Other changes

Of interest to self hosters

PR Description
kobocat#883 Update Helm version, namespace, deployment name for beta staging environment
kpi#4280 Add NLP usage to Users’ Statistics superuser report
kpi#4285 Create asset_usage endpoint
Create asset_usage endpoint from the per_asset_usage field in the service_usage endpoint
kpi#4418 update django allauth version from 0.52.0 → 0.54.0
Updated django-allauth, fixing an issue where OpenID Connect social providers wouldn’t pre-populate the email field at signup.
kpi#4438 Update default sign-up text

Of interest to developers

PR Description
kobocat#877 Replace deprecated constants in GitLab CI
kpi#4291 Add endpoint for Stripe webhook
Made dj-stripe webhook endpoint accessible to connect to Stripe for payments
kpi#4305 Switch to Stripe prices instead of plans
Switch Stripe integration from (legacy) plans to prices model.
kpi#4309 Add Organization Owner’s email to Organization model
Add the Organization Owner’s email to the Organization model to allow it to meet dj-stripe requirements
kpi#4315 Add documentation to Products endpoint
kpi#4317 Stripe Checkout link endpoints
Adds two KPI endpoints, one that generates a Stripe checkout session and returns a payment link, and one that creates a Customer Portal link.
kpi#4329 Add tests for the Stripe checkout link and customer portal API endpoints. Also fixes some issues with the endpoints discovered while getting tests passing.
kpi#4330 Add subscription tiers
kpi#4333 Create a request callback method for dj-stripe
Create a callback function for dj-stripe to use a custom subscriber model
kpi#4335 Stripe subscription management
Changes the redirects after Stripe sessions to point to the proper URL. Add ‘Manage’ button to the currently subscribed plan, which redirects to the Stripe customer portal. Moves the Your Plan display based on the logged-in user’s current plan.
kpi#4371 Endpoint to list purchased one-time add-ons
<Adds a new internal endpoint at api/v2/stripe/addons that lists any one-time add-ons purchased by the logged-in user’s owned organization. Needed for the Your Active Add-ons section of the Plans page.
kpi#4385 Add the plans page for subscriptions with Stripe. Users are able to see current plan and upgrade through Stripe checkout to a different subscription plan.
Also removes a too-narrow assertion in
kpi#4392 Add success message after Stripe checkout
Adds a success popup when a user returns from a successful transaction at Stripe.
kpi#4398 Remove [Button triggers] from frontend strings
Move the [button triggers] outside of the string to be translated to avoid confusion as to whether or not it should be translated by volunteers
kpi#4400 Show correct UI on plans page when there are inactive/multiple plans
Fixes an issue that caused the Plans page to falsely show the user as belonging to no plan when they had a subscription that wasn’t active.
kpi#4417 Always recreate fonts when syncing npm dependencies in dev mode
Fix error when /jsapp/fonts folder is missing while building the front-end assets in dev mode.
kpi#4420 Fix flashing plan banner
Added the loading animation for when data is being fetched and when the data is updating. The plans and included banner won’t show until all data has completed loading especially after upgrading.
kpi#4424 Billing page multisite compatibility / Change subscription route
Changes the ID field of Organizations to work with dj-stripe webhooks on multiple sites.
Adds an API route to change existing Stripe subscriptions to a different price.
kpi#4433 Replace deprecated constants in GitLab CI
Fixed an issue that was causing GitLab CI to fail during the build step.
kpi#4437 Show “your plan” only on the correct annual/monthly setting
When page redirects the banner now only shows on the monthly/annual plan you upgraded to when you toggle between the two filters. It will load the filter to show based on what you are subscribed to. If there is no plan subscribed then show annual community plan by default. When subscribed to the pro plan show on the opposite filter a ‘change plan’ button so the user has a call to action when their plan is not visible.
kpi#4452 Billing MVP live test fixes
Fixed an issue where plans would show up in the wrong order.
Fixed an issue that caused add-ons to show up in the plans section.
Made multiple plans or cancelled plans properly reflected on the Billing page.
kpi#4458 Check for dj-stripe before attempting to migrate Subscriber foreign keys
Fixes a migration for Organizations that was not working.
kpi#4478 Require authentication to check for existence of usernames via the user detail endpoint
kpi#4479 Remove asset list from user serializer
kpi#4480 Expunge remnants of Font Awesome
kpi#4485 Update helm version and namespace for beta staging environment
kpi#4498 Prevent Node.js 18 provided by Debian 12 from taking precedence over the Node.js 16 package provided by NodeSource
The python:3.10 Docker base image has moved from Debian 11 to Debian 12, necessitating a workaround to continue using Node.js 16.

Previously deployed as hotfix 2.023.12b

PR Description
kpi#4451 Display long-run warning for migration 0050 only where appropriate
kpi#4449 Add a status filter in Django Admin to filter objects in trash
It narrows down the list of objects matching the status filter.
kpi#4448 Fix an occasional error when a project is deleted
Fix 'NoneType' object has no attribute 'annotate' error that happens when a project is deleted but its related KoBoCAT form has already been deleted.
kpi#4447 Clean up Celery autoscale settings
kpi#4443 Improve long-running trash-bin tasks duration
Make deletion tasks run quickly and increase the amount of time they are allowed to run
kobocat#879 Autoscale Celery between 2 and 6 workers and allow configuration via environment variables
kobocat#878 Stop returning 500 for failed authentication to the media endpoint

The widgets issue (e.GlobalReset) with Enketo 6.1.0 that prompted rolling back to the previous version has now been fixed, and a new release 2.023.21a is now running on Thanks for your patience.


Deployment to is now complete and the top post has been updated accordingly.


Effective immediately on both servers, we have rolled back Enketo again due to this issue:

For self hosters, this change is tagged as release 2.023.21b.

1 Like