Municipal sites for PNRR measure 1.4.1

In short
Two Italian municipal sites in Drupal 9, taken through measure 1.4.1 of Italy's Recovery and Resilience Plan in one year with I.T.Svil: content migrated to the municipal model's types, the Maggioli platform's services on the site, and single sign-on with SPID and CIE built with a custom Drupal module and Shibboleth.

With I.T.Svil (opens in a new tab) I worked on two Italian municipal sites in Drupal 9 and took them through the assessment for measure 1.4.1 of Italy's Recovery and Resilience Plan (PNRR), «Citizen experience: improvement of the quality and usability of digital public services», in one year. The full technical account, from the assessment to single sign-on with SPID and CIE, is in the linked article.

Who builds Municipal sites for PNRR measure 1.4.1, and since when

Client
Two municipalities, with I.T.Svil
Sector
Public administration Recovery and Resilience Plan
Role
Drupal developer, with I.T.Svil
Year
2025

What Municipal sites for PNRR measure 1.4.1 is built with

Drupal PHP Docker

What problem Municipal sites for PNRR measure 1.4.1 solves

The two municipalities had a Drupal site whose content structure differed from the municipal model, and their online services, pagoPA payments, applications and bookings, on a separate Maggioli platform with its own login.

How Municipal sites for PNRR measure 1.4.1 solves the problem

Content types rebuilt on the model and content migrated with a custom script; Maggioli service pages read from their APIs; tuning and caching for performance; single sign-on and single logout between site and platform, with a Drupal module written from scratch, Shibboleth as Service Provider in a container behind Traefik and the tax code as the only user key; training for the editorial teams on content and events.

What Municipal sites for PNRR measure 1.4.1 achieved

Two municipalities taken through measure 1.4.1 in a year of work; single sign-on with SPID and CIE was completed in 2025.

Where the two sites started from

The two municipalities already had a Drupal site, with a content structure far from the municipal model. Their online services lived on the Maggioli platform, with a separate login: citizens looked for them outside the municipality's site and logged in a second time.

Measure 1.4.1 funds municipalities after an assessment, a check of the conformity criteria of the Designers Italia model. Many criteria are about structure: the first-level menu entries in the model's order, the titles of second-level pages, topics taken from the European vocabulary EuroVoc, the mandatory items of every service page. On those two sites they touched almost every page.


What I did on the two sites

  • Content: I rebuilt the content types and vocabularies on the types of the Designers Italia municipal model, and migrated the existing content onto them with a custom script.
  • Theme: the base is bootstrap_italia for Drupal, with a subtheme bringing the municipal model's styles.
  • Services: pagoPA payments, applications and case files, and appointment booking from the Maggioli (opens in a new tab) platform each have their own page on the municipality's site, read from Maggioli's APIs.
  • Performance: tuning and caching, to serve pages ready-made and keep them above the Lighthouse threshold the model asks for.
  • Single sign-on: whoever logs in on one site is already in the other, and whoever logs out of one leaves both, through a remote logout at the provider.
  • SPID and CIE: an external authentication intermediary verifies the identity, Shibboleth completes the flow, and the module I wrote finds or creates the Drupal user from the tax code.
  • Editorial teams: I took the administrations through several training stages, above all on creating content and managing events.

How I migrated the content

The model defines the types: services, offices, documents, news, events, places, people in the administration, each with its own fields and links. I created the matching content types and vocabularies in Drupal, then a custom script reorganised the existing content onto them.

Rewiring the structure was the complex part, because types, fields, vocabularies, the menu tree and the links between pages all changed together. An old article could become a news item, a document or an office page, depending on what it told. The sorting rules all lived in the script, so they were fixed and run again in one place.


How the Maggioli services reach the site

The services are delivered by the Maggioli platform, which syncs and exposes their pages through its APIs. The municipality's site reads those APIs and presents each service with the page the model asks for, including the administration's maximum response time. The actual action, paying, submitting an application, booking, leads to the platform.

The service catalogue stays where the services are delivered, and the citizen starts from the municipality's site to reach the service.


How single sign-on is built

Part Role
Traefik routes authentication requests to the container before passing them on to Drupal
Shibboleth SP in a dedicated container: completes the SAML flow, and its session cookie can be read only there
Authentication intermediary handles SPID and CIE
Custom Drupal module receives the identity, uses the tax code as key, opens and closes the session

The module is written from scratch because the existing modules, spid and samlauth, assume that Drupal talks directly to the identity provider, while here Drupal sat at the end of a chain and the session had to hold on the Maggioli platform as well.

Logout works both ways, like login. Maggioli's specification asks for it from anyone who turns on single sign-on, because a session left open on a shared computer exposes personal data. To recognise the user the site keeps only the tax code: every piece of data the site keeps out is one less to protect.

This part took us much of 2025, because of the number of systems that had to talk to each other. The work ran smoothly, because Maggioli's documentation on the API integration was clear and thorough.


How the two sites stay above the Lighthouse threshold

Criterion C.SI.4.1 asks for a Lighthouse score of at least 50, in mobile mode, on every page of the site, and below that threshold the municipality publishes an improvement plan. On both sites we did tuning and worked on caching, to serve pages ready-made, including the ones that read the services from the Maggioli APIs.


Who I worked with

I did the project with I.T.Svil (opens in a new tab). On the other side were Maggioli, with the service platform and its documentation, and the municipalities' editorial teams. The staff who followed the training were skilled, and the sessions went entirely on the rules of the model: which type to use, how to write a service page, how to handle an event with its dates, its venue and the link to the office organising it.


What changes for a new project

Drupal 9 has been out of support since 1 November 2023, so a project today starts from Drupal 10 or 11, with a version of bootstrap_italia that supports them. And since the 28 March 2025 revision of Maggioli's specification, logging in with the CIE goes through OpenID Connect: the single sign-on bridge has to be designed on that flow.


Sources

All sources were checked on 1 October 2026.

Giorgio Alfredo Pagano
AI modified

This text was translated by AI.

How was AI used?

Translated from the Italian original with AI assistance, then read and corrected by a person, who holds editorial responsibility.