diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py
index c0f27229954af0929764e29430474ef2a8dbe9ca..dfa8ae508ea738d7055f48e106df137a110c2157 100644
--- a/brian_dashboard_manager/grafana/provision.py
+++ b/brian_dashboard_manager/grafana/provision.py
@@ -14,6 +14,8 @@ from brian_dashboard_manager.config import DEFAULT_ORGANIZATIONS, STATE_PATH
 from brian_dashboard_manager.grafana.utils.request import AdminRequest, \
     TokenRequest
 
+from brian_dashboard_manager.services.api import fetch_services
+
 from brian_dashboard_manager.grafana.organization import \
     get_organizations, create_organization, create_api_token, \
     delete_api_token, delete_expired_api_tokens, set_home_dashboard
@@ -36,6 +38,7 @@ from brian_dashboard_manager.templating.gws import generate_gws, \
     generate_indirect
 from brian_dashboard_manager.templating.eumetsat \
     import generate_eumetsat_multicast
+from brian_dashboard_manager.templating.services import create_service_panels
 from brian_dashboard_manager.templating.render import render_dashboard
 
 logger = logging.getLogger(__name__)
@@ -356,6 +359,33 @@ def _provision_interfaces(config, org_config, ds_name, token):
             yield from folder
 
 
+def _provision_service_dashboards(config, org_config, ds_name, token):
+    """
+    Fetches service data from Reporting Provider
+    and creates dashboards for each customer with their services
+    """
+    logger.info('Provisioning Service dashboards')
+    folder_name = 'Service POC'
+
+    # hardcode the org for the POC
+    if org_config.get('name') != 'GÉANT Staff':
+        return []
+
+    if is_excluded_folder(org_config, folder_name):
+        # don't provision Services folder
+        delete_folder(token, title=folder_name)
+    else:
+        folder = find_folder(token, folder_name)
+        with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
+            services = fetch_services(config['reporting_provider'])
+            dashes = create_service_panels(services, ds_name)
+            for dashboard in dashes:
+                rendered = render_dashboard(dashboard)
+                yield executor.submit(create_dashboard,
+                                      token,
+                                      rendered, folder['id'])
+
+
 def _provision_gws_indirect(config, org_config, ds_name, token):
     # fetch GWS direct data and provision related dashboards
     logger.info('Provisioning GWS Indirect dashboards')
@@ -507,6 +537,7 @@ def _delete_unknown_folders(config, token):
         # General is a base folder present in Grafana
         'General',
         # other folders, created outside of the DASHBOARDS list
+        'Service POC',
         'GWS Indirect',
         'GWS Direct',
         'Aggregates',
@@ -521,6 +552,7 @@ def _delete_unknown_folders(config, token):
     for folder in all_folders:
         if folder['title'] in folders_to_keep:
             continue
+        logger.info(f'Deleting unknown folder: {folder.get("title")}')
         delete_folder(token, uid=folder['uid'])
 
 
@@ -598,6 +630,8 @@ def provision(config):
         ds_name = datasource.get('name', 'PollerInfluxDB')
 
         managed_dashboards = itertools.chain(
+            _provision_service_dashboards(
+                config, org_config, ds_name, token_request),
             _provision_interfaces(
                 config, org_config, ds_name, token_request),
             _provision_gws_indirect(