diff --git a/app/ecolyo.6902519e815472ed17cd.js b/app/ecolyo.36b93cf6072f8532d8ac.js
similarity index 99%
rename from app/ecolyo.6902519e815472ed17cd.js
rename to app/ecolyo.36b93cf6072f8532d8ac.js
index f42890de79dcf72d6cb4a922d6ba7b5d003a14fb..46a99c45708d3e67b50539af4595bf475443568c 100644
--- a/app/ecolyo.6902519e815472ed17cd.js
+++ b/app/ecolyo.36b93cf6072f8532d8ac.js
@@ -25633,16 +25633,8 @@ Object.defineProperty(exports, "__esModule", {
 });
 exports.default = void 0;
 
-var _regenerator = _interopRequireDefault(__webpack_require__("o0o1"));
-
 var _objectSpread2 = _interopRequireDefault(__webpack_require__("MVZn"));
 
-var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("yXPU"));
-
-var _classCallCheck2 = _interopRequireDefault(__webpack_require__("lwsE"));
-
-var _createClass2 = _interopRequireDefault(__webpack_require__("W8MJ"));
-
 var _cozyClient = __webpack_require__("SH7X");
 
 var _doctypes = __webpack_require__("D2hQ");
@@ -25656,341 +25648,144 @@ var _luxon = __webpack_require__("ExVU");
   enterModule && enterModule(module);
 })();
 
-function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
-
 var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
   return a;
 };
 
-var UsageEventService = /*#__PURE__*/function () {
-  function UsageEventService() {
-    (0, _classCallCheck2.default)(this, UsageEventService);
+class UsageEventService {
+  /**
+   * addEvent
+   * @param {Client} client
+   * @param {AddEventParams} params
+   * @returns {Promise<UsageEvent>} usageEvent added
+   */
+  static async addEvent(client, params) {
+    const usageEvent = (0, _objectSpread2.default)({}, params, {
+      eventDate: _luxon.DateTime.local().setZone('utc', {
+        keepLocalTime: true
+      }).toString(),
+      startDate: params.startDate ? params.startDate.toString() : undefined,
+      aggregated: false
+    });
+    const {
+      data
+    } = await client.create(_doctypes.USAGEEVENT_DOCTYPE, usageEvent);
+    return this.parseUsageEventEntityToUsageEvent(data);
   }
+  /**
+   * addEvent
+   * @param {Client} client
+   * @param {AddEventParams} params
+   * @returns {Promise<UsageEvent>} usageEvent added
+   */
 
-  (0, _createClass2.default)(UsageEventService, null, [{
-    key: "addEvent",
-    value:
-    /**
-     * addEvent
-     * @param {Client} client
-     * @param {AddEventParams} params
-     * @returns {Promise<UsageEvent>} usageEvent added
-     */
-    function () {
-      var _addEvent = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(client, params) {
-        var usageEvent, _yield$client$create, data;
-
-        return _regenerator.default.wrap(function _callee$(_context) {
-          while (1) {
-            switch (_context.prev = _context.next) {
-              case 0:
-                usageEvent = (0, _objectSpread2.default)({}, params, {
-                  eventDate: _luxon.DateTime.local().setZone('utc', {
-                    keepLocalTime: true
-                  }).toString(),
-                  startDate: params.startDate ? params.startDate.toString() : undefined,
-                  aggregated: false
-                });
-                _context.next = 3;
-                return client.create(_doctypes.USAGEEVENT_DOCTYPE, usageEvent);
-
-              case 3:
-                _yield$client$create = _context.sent;
-                data = _yield$client$create.data;
-                return _context.abrupt("return", this.parseUsageEventEntityToUsageEvent(data));
-
-              case 6:
-              case "end":
-                return _context.stop();
-            }
-          }
-        }, _callee, this);
-      }));
-
-      function addEvent(_x, _x2) {
-        return _addEvent.apply(this, arguments);
-      }
-
-      return addEvent;
-    }()
-    /**
-     * addEvent
-     * @param {Client} client
-     * @param {AddEventParams} params
-     * @returns {Promise<UsageEvent>} usageEvent added
-     */
-
-  }, {
-    key: "addEventIfDoesntExist",
-    value: function () {
-      var _addEventIfDoesntExist = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(client, params, filterParams) {
-        var events;
-        return _regenerator.default.wrap(function _callee2$(_context2) {
-          while (1) {
-            switch (_context2.prev = _context2.next) {
-              case 0:
-                _context2.next = 2;
-                return this.getEvents(client, filterParams);
-
-              case 2:
-                events = _context2.sent;
-
-                if (!(events.length <= 0)) {
-                  _context2.next = 5;
-                  break;
-                }
-
-                return _context2.abrupt("return", this.addEvent(client, params));
-
-              case 5:
-                return _context2.abrupt("return", null);
-
-              case 6:
-              case "end":
-                return _context2.stop();
-            }
-          }
-        }, _callee2, this);
-      }));
-
-      function addEventIfDoesntExist(_x3, _x4, _x5) {
-        return _addEventIfDoesntExist.apply(this, arguments);
-      }
-
-      return addEventIfDoesntExist;
-    }()
-    /**
-     *
-     * @param {Client} client
-     * @param {string} konnectorSlug
-     * @returns
-     */
-
-  }, {
-    key: "udpateConnectionAttemptEvent",
-    value: function () {
-      var _udpateConnectionAttemptEvent = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(client, konnectorSlug) {
-        var query, _yield$client$query, usageEventEntity, updatedEvent, saved;
-
-        return _regenerator.default.wrap(function _callee3$(_context3) {
-          while (1) {
-            switch (_context3.prev = _context3.next) {
-              case 0:
-                _context3.prev = 0;
-                //Get last Connection attempt Event
-                query = (0, _cozyClient.Q)(_doctypes.USAGEEVENT_DOCTYPE).where({
-                  type: _usageEvent.UsageEventType.KONNECTOR_ATTEMPT_EVENT,
-                  target: konnectorSlug,
-                  result: 'error'
-                }).sortBy([{
-                  eventDate: 'desc'
-                }]).limitBy(1);
-                _context3.next = 4;
-                return client.query(query);
-
-              case 4:
-                _yield$client$query = _context3.sent;
-                usageEventEntity = _yield$client$query.data;
-
-                if (!usageEventEntity) {
-                  _context3.next = 12;
-                  break;
-                }
-
-                updatedEvent = (0, _objectSpread2.default)({}, usageEventEntity, {
-                  result: 'success'
-                });
-                _context3.next = 10;
-                return client.save(updatedEvent);
 
-              case 10:
-                saved = _context3.sent;
-                console.log('saved', saved);
+  static async addEventIfDoesntExist(client, params, filterParams) {
+    const events = await this.getEvents(client, filterParams);
 
-              case 12:
-                _context3.next = 17;
-                break;
+    if (events.length <= 0) {
+      return this.addEvent(client, params);
+    }
 
-              case 14:
-                _context3.prev = 14;
-                _context3.t0 = _context3["catch"](0);
-                console.error(_context3.t0);
+    return null;
+  }
+  /**
+   *
+   * @param {Client} client
+   * @param {string} konnectorSlug
+   * @returns
+   */
 
-              case 17:
-              case "end":
-                return _context3.stop();
-            }
-          }
-        }, _callee3, null, [[0, 14]]);
-      }));
 
-      function udpateConnectionAttemptEvent(_x6, _x7) {
-        return _udpateConnectionAttemptEvent.apply(this, arguments);
+  static async udpateConnectionAttemptEvent(client, konnectorSlug) {
+    try {
+      //Get last Connection attempt Event
+      const query = (0, _cozyClient.Q)(_doctypes.USAGEEVENT_DOCTYPE).where({
+        type: _usageEvent.UsageEventType.KONNECTOR_ATTEMPT_EVENT,
+        target: konnectorSlug,
+        result: 'error'
+      }).indexFields(['type', 'target', 'result']).sortBy([{
+        eventDate: 'desc'
+      }]).limitBy(1);
+      const {
+        data: usageEventEntity
+      } = await client.query(query);
+      console.log('usageEventEntity', usageEventEntity);
+
+      if (usageEventEntity) {
+        const updatedEvent = (0, _objectSpread2.default)({}, usageEventEntity, {
+          result: 'success'
+        });
+        const saved = await client.save(updatedEvent);
+        console.log('saved', saved);
+      } else {
+        console.log('NO ATTEMPT EVENT');
       }
+    } catch (err) {
+      console.error(err);
+    }
+  }
+  /**
+   * updateUsageEventsAggregated
+   * @param {Client} client
+   * @param {string[]} ids
+   * @returns {Promise<boolean>} return true if all events are updated
+   */
 
-      return udpateConnectionAttemptEvent;
-    }()
-    /**
-     * updateUsageEventsAggregated
-     * @param {Client} client
-     * @param {string[]} ids
-     * @returns {Promise<boolean>} return true if all events are updated
-     */
-
-  }, {
-    key: "updateUsageEventsAggregated",
-    value: function () {
-      var _updateUsageEventsAggregated = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(client, events) {
-        var _iterator, _step, event;
-
-        return _regenerator.default.wrap(function _callee4$(_context4) {
-          while (1) {
-            switch (_context4.prev = _context4.next) {
-              case 0:
-                _iterator = _createForOfIteratorHelper(events);
-                _context4.prev = 1;
-
-                _iterator.s();
-
-              case 3:
-                if ((_step = _iterator.n()).done) {
-                  _context4.next = 15;
-                  break;
-                }
-
-                event = _step.value;
-                _context4.prev = 5;
-                _context4.next = 8;
-                return client.save((0, _objectSpread2.default)({}, event, {
-                  aggregated: true
-                }));
-
-              case 8:
-                _context4.next = 13;
-                break;
-
-              case 10:
-                _context4.prev = 10;
-                _context4.t0 = _context4["catch"](5);
-                console.log(_context4.t0);
-
-              case 13:
-                _context4.next = 3;
-                break;
-
-              case 15:
-                _context4.next = 20;
-                break;
-
-              case 17:
-                _context4.prev = 17;
-                _context4.t1 = _context4["catch"](1);
-
-                _iterator.e(_context4.t1);
-
-              case 20:
-                _context4.prev = 20;
-
-                _iterator.f();
-
-                return _context4.finish(20);
-
-              case 23:
-                return _context4.abrupt("return", true);
-
-              case 24:
-              case "end":
-                return _context4.stop();
-            }
-          }
-        }, _callee4, null, [[1, 17, 20, 23], [5, 10]]);
-      }));
 
-      function updateUsageEventsAggregated(_x8, _x9) {
-        return _updateUsageEventsAggregated.apply(this, arguments);
+  static async updateUsageEventsAggregated(client, events) {
+    for (const event of events) {
+      try {
+        await client.save((0, _objectSpread2.default)({}, event, {
+          aggregated: true
+        }));
+      } catch (error) {
+        console.log(error);
       }
+    }
 
-      return updateUsageEventsAggregated;
-    }()
-    /**
-     * getEvents
-     * @param {Client} client
-     * @param {MongoSelector} filterParams
-     * @returns {Promise<UsageEvent[]>} usageEvent added
-     */
-
-  }, {
-    key: "getEvents",
-    value: function () {
-      var _getEvents = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(client, filterParams) {
-        var _this = this;
-
-        var desc,
-            query,
-            _yield$client$query2,
-            usageEventEntities,
-            usageEvents,
-            _args5 = arguments;
-
-        return _regenerator.default.wrap(function _callee5$(_context5) {
-          while (1) {
-            switch (_context5.prev = _context5.next) {
-              case 0:
-                desc = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : false;
-                query = (0, _cozyClient.Q)(_doctypes.USAGEEVENT_DOCTYPE).where(filterParams).sortBy([{
-                  eventDate: desc ? 'desc' : 'asc'
-                }]);
-                _context5.next = 4;
-                return client.query(query);
+    return true;
+  }
+  /**
+   * getEvents
+   * @param {Client} client
+   * @param {MongoSelector} filterParams
+   * @returns {Promise<UsageEvent[]>} usageEvent added
+   */
 
-              case 4:
-                _yield$client$query2 = _context5.sent;
-                usageEventEntities = _yield$client$query2.data;
-                usageEvents = usageEventEntities.map(function (usageEventEntity) {
-                  return _this.parseUsageEventEntityToUsageEvent(usageEventEntity);
-                });
-                return _context5.abrupt("return", usageEvents);
 
-              case 8:
-              case "end":
-                return _context5.stop();
-            }
-          }
-        }, _callee5);
-      }));
+  static async getEvents(client, filterParams, desc = false) {
+    const query = (0, _cozyClient.Q)(_doctypes.USAGEEVENT_DOCTYPE).where(filterParams).sortBy([{
+      eventDate: desc ? 'desc' : 'asc'
+    }]);
+    const {
+      data: usageEventEntities
+    } = await client.query(query);
+    const usageEvents = usageEventEntities.map(usageEventEntity => {
+      return this.parseUsageEventEntityToUsageEvent(usageEventEntity);
+    });
+    return usageEvents;
+  }
+  /**
+   * Retrieve UsageEvent from the UsageEventEntity
+   * @param {UsageEventEntity} usageEventEntity
+   * @returns {UsageEvent}
+   */
 
-      function getEvents(_x10, _x11) {
-        return _getEvents.apply(this, arguments);
-      }
 
-      return getEvents;
-    }()
-    /**
-     * Retrieve UsageEvent from the UsageEventEntity
-     * @param {UsageEventEntity} usageEventEntity
-     * @returns {UsageEvent}
-     */
+  static parseUsageEventEntityToUsageEvent(usageEventEntity) {
+    const usageEvent = (0, _objectSpread2.default)({}, usageEventEntity, {
+      eventDate: _luxon.DateTime.fromISO(usageEventEntity.eventDate, {
+        zone: 'utc'
+      }),
+      startDate: usageEventEntity.startDate ? _luxon.DateTime.fromISO(usageEventEntity.startDate, {
+        zone: 'utc'
+      }) : undefined
+    });
+    return usageEvent;
+  }
 
-  }, {
-    key: "parseUsageEventEntityToUsageEvent",
-    value: function parseUsageEventEntityToUsageEvent(usageEventEntity) {
-      var usageEvent = (0, _objectSpread2.default)({}, usageEventEntity, {
-        eventDate: _luxon.DateTime.fromISO(usageEventEntity.eventDate, {
-          zone: 'utc'
-        }),
-        startDate: usageEventEntity.startDate ? _luxon.DateTime.fromISO(usageEventEntity.startDate, {
-          zone: 'utc'
-        }) : undefined
-      });
-      return usageEvent;
-    }
-  }]);
-  return UsageEventService;
-}();
+}
 
 exports.default = UsageEventService;
 ;
diff --git a/index.html b/index.html
index f9f3da1d26eafcc88f6f478c613d56c589b10f1b..f22b104aff28c0beda236d98e37ef2f66bbd2a3d 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=0,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black">{{.ThemeCSS}} {{.CozyBar}}</head><body><div role="application" class="application" data-cozy-token="{{.Token}}" data-cozy-domain="{{.Domain}}" data-cozy-locale="{{.Locale}}" data-cozy-app-name="{{.AppName}}" data-cozy-app-slug="{{.AppSlug}}" data-cozy-app-name-prefix="{{.AppNamePrefix}}" data-cozy-app-editor="{{.AppEditor}}" data-cozy-icon-path="{{.IconPath}}"><script src="vendors/ecolyo.93391ce51226ea91283c.js"></script><script src="app/ecolyo.6902519e815472ed17cd.js"></script></div></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=0,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black">{{.ThemeCSS}} {{.CozyBar}}</head><body><div role="application" class="application" data-cozy-token="{{.Token}}" data-cozy-domain="{{.Domain}}" data-cozy-locale="{{.Locale}}" data-cozy-app-name="{{.AppName}}" data-cozy-app-slug="{{.AppSlug}}" data-cozy-app-name-prefix="{{.AppNamePrefix}}" data-cozy-app-editor="{{.AppEditor}}" data-cozy-icon-path="{{.IconPath}}"><script src="vendors/ecolyo.93391ce51226ea91283c.js"></script><script src="app/ecolyo.36b93cf6072f8532d8ac.js"></script></div></body></html>
\ No newline at end of file
diff --git a/services/aggregatorUsageEvents/ecolyo.js b/services/aggregatorUsageEvents/ecolyo.js
index 7cb066396858b3db0ef38f38a21ad29047b593fb..5a6bb8ad4991a0f6d9cf58abbb81bcd48829f90e 100644
--- a/services/aggregatorUsageEvents/ecolyo.js
+++ b/services/aggregatorUsageEvents/ecolyo.js
@@ -66432,12 +66432,13 @@ class UsageEventService {
         type: _usageEvent.UsageEventType.KONNECTOR_ATTEMPT_EVENT,
         target: konnectorSlug,
         result: 'error'
-      }).sortBy([{
+      }).indexFields(['type', 'target', 'result']).sortBy([{
         eventDate: 'desc'
       }]).limitBy(1);
       const {
         data: usageEventEntity
       } = await client.query(query);
+      console.log('usageEventEntity', usageEventEntity);
 
       if (usageEventEntity) {
         const updatedEvent = (0, _objectSpread2.default)({}, usageEventEntity, {
@@ -66445,6 +66446,8 @@ class UsageEventService {
         });
         const saved = await client.save(updatedEvent);
         console.log('saved', saved);
+      } else {
+        console.log('NO ATTEMPT EVENT');
       }
     } catch (err) {
       console.error(err);