diff --git a/exporter.py b/exporter.py
index d47e57aba9584c75cb30630ee94fd9c8200617a3..bc742d7a2be0488b76ed3930cca3d15f85f1915a 100755
--- a/exporter.py
+++ b/exporter.py
@@ -3,12 +3,14 @@ import requests
 from prometheus_client import start_http_server, Counter, Gauge
 from time import sleep
 import argparse
+import json
 
 metric_members = Gauge('matrix_channel_members_total', 'Members joined in room', ['room_id', 'canonical_alias', 'name'])
 metric_channel_types = Gauge('matrix_channel_types_total', 'Channels per type', ['type'])
 metric_channel_version = Gauge('matrix_channel_version_total', 'Channels per version', ['version'])
 metric_channel_state_events = Gauge('matrix_channel_state_events_total', 'State events per room',
                                     ['room_id', 'canonical_alias', 'name'])
+metric_channel_messages_absolute = Gauge('matrix_channel_messages_absolute', 'Messages per channel absolute', ['room_id', 'canonical_alias', 'name', 'type'])
 metric_channel_messages = Counter('matrix_channel_messages_total', 'Messages per channel', ['room_id', 'canonical_alias', 'name', 'type'])
 
 
@@ -22,21 +24,35 @@ def fetch_metrics(synapse_url, access_token):
     update_room_metrics(rooms)
 
     for room in rooms:
-        statefile = f"state/{room['room_id']}.end"
+        statefile = f"state/{room['room_id']}.state"
         url = f"{synapse_url}/_synapse/admin/v1/rooms/{room['room_id']}/messages"
-        messages = []
 
-        end = None
+        state = {}
         try:
             with open(statefile, 'r') as file:
-                end = file.read()
+                state = json.load(file)
         except OSError:
             print(f"No state file for room {room['room_id']} ({room.get('name', '')}) found. Fetching messages could take a while.")
+            state['messagecount'] = {}
+
+        for type in state['messagecount']:
+            metric_channel_messages.labels(
+                room_id=room['room_id'],
+                canonical_alias=room['canonical_alias'] if room['canonical_alias'] else '',
+                name=room['name'] if room['name'] else '',
+                type=type)
+
+            metric_channel_messages_absolute.labels(
+                room_id=room['room_id'],
+                canonical_alias=room['canonical_alias'] if room['canonical_alias'] else '',
+                name=room['name'] if room['name'] else '',
+                type=type).set(state['messagecount'][type])
 
+        messages = []
         while True:
             params = {}
-            if end is not None:
-                params['from'] = end
+            if 'end' in state:
+                params['from'] = state['end']
 
             result = requests.get(url, params=params, headers=auth).json()
 
@@ -44,7 +60,7 @@ def fetch_metrics(synapse_url, access_token):
                 messages.extend(result['chunk'])
 
             if 'end' in result:
-                end = result['end']
+                state['end'] = result['end']
             else:
                 break
 
@@ -55,8 +71,19 @@ def fetch_metrics(synapse_url, access_token):
                 name=room['name'] if room['name'] else '',
                 type=message['type']).inc()
 
+            metric_channel_messages_absolute.labels(
+                room_id=room['room_id'],
+                canonical_alias=room['canonical_alias'] if room['canonical_alias'] else '',
+                name=room['name'] if room['name'] else '',
+                type=message['type']).inc()
+
+            if message['type'] not in state['messagecount']:
+                state['messagecount'][message['type']] = 0
+
+            state['messagecount'][message['type']] += 1
+
         with open(statefile, 'w') as file:
-            file.write(end)
+            json.dump(state, file)
 
 
 def update_room_metrics(rooms):