diff --git a/lib/db-mysql.js b/lib/db-mysql.js
new file mode 100644
index 0000000..e46b3c3
--- /dev/null
+++ b/lib/db-mysql.js
@@ -0,0 +1,37 @@
+'use strict';
+
+const mysql = require('mysql');
+
+const config = require('komodo-sdk/config');
+
+const connectionLimit = config.mysql && config.mysql.pool_connection_limit ? config.mysql.pool_connection_limit : 0;
+
+const pool = config.mysql ? mysql.createPool({
+    connectionLimit: connectionLimit,
+    host: config.mysql.host || 'localhost',
+    database: config.mysql.database || 'komodo',
+    user: config.mysql.user || 'komodo',
+    password: config.mysql.password
+}) : null;
+
+exports.pool = pool;
+exports.query = pool.query;
+
+exports.format = (sql, values) => {
+    return new Promise((resolve, reject) => {
+        if (!pool) {
+            reject('Missing DB config');
+            return;
+        }
+
+        pool.getConnection((err, connection) => {
+            if (err) {
+                reject(err);
+                return;
+            }
+
+            resolve(connection.format(sql, values));
+            connection.release();
+        });
+    })
+}
\ No newline at end of file
diff --git a/lib/http-listener.js b/lib/http-listener.js
index ddfe9e8..f56d16c 100644
--- a/lib/http-listener.js
+++ b/lib/http-listener.js
@@ -8,6 +8,7 @@ const config = require('komodo-sdk/config');
 const logger = require('komodo-sdk/logger');
 
 const commandHandler = require('./command-handler');
+const messagesArchive = require('./messages-archive');
 
 const app = express();
 const port = config && config.listener && config.listener.http && config.listener.http.port ? config.listener.http.port : 32979;
@@ -16,24 +17,34 @@ function mainHandler(req, res) {
 
     if (!req.body) req.body = {};
 
-    if (req.body.do_not_forward_to_core || req.query.do_not_forward_to_core) {
-        logger.verbose('Ignoring message', { from: req.body.from || req.query.from, msg: req.body.msg || req.query.msg, do_not_forward_to_core: req.body.do_not_forward_to_core || req.query.do_not_forward_to_core });
-        res.end('OK');
+    if (!req.query.from && !req.body.from) {
+        res.end('ERROR. Undefined parameter: from');
         return;
     }
 
-    if (!req.query.report_port && !req.body.report_port) {
-        res.end('ERROR. Undefined parameter: report_port');
+    if (!req.query.msg && !req.body.msg) {
+        res.end('ERROR. Undefined parameter: msg');
         return;
     }
 
-    if (!req.query.from && !req.body.from) {
-        res.end('ERROR. Undefined parameter: from');
+    messagesArchive.insert(
+        {
+            origin_label: req.body.origin_label || req.query.origin_label || req.body.origin || req.query.origin,
+            origin_transport: req.body.origin_transport || req.query.origin_transport,
+            partner: req.body.from_raw || req.query.from_raw || req.body.from || req.query.from,
+            msg: req.body.msg || req.query.msg,
+        }, 
+        messagesArchive.DIRECTION_INCOMING
+    );
+
+    if (req.body.do_not_forward_to_core || req.query.do_not_forward_to_core) {
+        logger.verbose('Ignoring message', { from: req.body.from || req.query.from, msg: req.body.msg || req.query.msg, do_not_forward_to_core: req.body.do_not_forward_to_core || req.query.do_not_forward_to_core });
+        res.end('OK');
         return;
     }
 
-    if (!req.query.msg && !req.body.msg) {
-        res.end('ERROR. Undefined parameter: msg');
+    if (!req.query.report_port && !req.body.report_port) {
+        res.end('ERROR. Undefined parameter: report_port');
         return;
     }
 
diff --git a/lib/messages-archive.js b/lib/messages-archive.js
new file mode 100644
index 0000000..97dcde9
--- /dev/null
+++ b/lib/messages-archive.js
@@ -0,0 +1,42 @@
+'use strict';
+
+const logger = require('komodo-sdk/logger');
+const db = require('./db-mysql');
+
+const DIRECTION_INCOMING = 0;
+const DIRECTION_OUTGOING = 1;
+
+/**
+ * Menyimpan pesan ke dalam archive histori pesan di database
+ * 
+ * @param  {object} params - objek pesan yang akan disimpan
+ * @param  {string} [params.origin_label] - label origin
+ * @param  {string} [params.origin=UNKNOWN] - digunakan sebagai label origin jika tdk ditentukan
+ * @param  {string} [params.origin_transport=UNKNOWN] - transport, misal SMS, TELEGRAM
+ * @param  {string} params.partner - pengirim / penerima
+ * @param  {string} [params.msg] - isi pesan
+ * @param  {string} [params.message] - isi pesan, jika params.msg tidak terdefinisi
+ * @param  {number} direction - 0: incoming, 1: outgoing
+ */
+function insert(params, direction) {
+    if (!db.pool) return;
+
+    const query = `INSERT INTO messages SET created = NOW(), ?`;
+    const values = [{
+        origin_label: (params.origin_label || params.origin || 'UNKNOWN').trim(),
+        origin_transport: (params.origin_transport || 'UNKNOWN').trim(),
+        direction,
+        partner: params.partner.trim(),
+        message: (params.msg || params.message).trim(),
+    }];
+
+    db.query(query, values, (err) => {
+        if (err) {
+            logger.warn(`MESSAGES-ARCHIVE: DB ERROR on inserting message. ${err.toString()}`);
+        }
+    });
+}
+
+exports.insert = insert;
+exports.DIRECTION_INCOMING = DIRECTION_INCOMING;
+exports.DIRECTION_OUTGOING = DIRECTION_OUTGOING;
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 9c72da7..153158d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -287,6 +287,11 @@
         "tweetnacl": "^0.14.3"
       }
     },
+    "bignumber.js": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
+      "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ=="
+    },
     "binary-extensions": {
       "version": "1.13.1",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
@@ -2273,8 +2278,7 @@
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "optional": true
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
     },
     "isexe": {
       "version": "2.0.0",
@@ -2593,6 +2597,17 @@
       "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
       "dev": true
     },
+    "mysql": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz",
+      "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==",
+      "requires": {
+        "bignumber.js": "7.2.1",
+        "readable-stream": "2.3.6",
+        "safe-buffer": "5.1.2",
+        "sqlstring": "2.3.1"
+      }
+    },
     "nan": {
       "version": "2.14.0",
       "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
@@ -3013,8 +3028,7 @@
     "process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "optional": true
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
     "progress": {
       "version": "2.0.3",
@@ -3101,7 +3115,6 @@
       "version": "2.3.6",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
       "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "optional": true,
       "requires": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -3696,6 +3709,11 @@
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
+    "sqlstring": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
+      "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
+    },
     "sshpk": {
       "version": "1.16.1",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
@@ -3767,7 +3785,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "optional": true,
       "requires": {
         "safe-buffer": "~5.1.0"
       }
@@ -4075,8 +4092,7 @@
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "optional": true
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     },
     "utils-merge": {
       "version": "1.0.1",
diff --git a/package.json b/package.json
index 69d8c37..d0d2493 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
     "express": "^4.17.1",
     "express-ipfilter": "^1.0.1",
     "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git",
+    "mysql": "^2.17.1",
     "natural-compare-lite": "^1.4.0",
     "request": "^2.88.0",
     "yargs": "^13.2.4"