diff --git a/pass/app/Key.js b/pass/app/Key.js
index ff875a4ffdf62d14e3e1434b6b7645aa3ebdd39d..1fb5480db3c119729dd6b23c5c6938f33a0d7859 100644
--- a/pass/app/Key.js
+++ b/pass/app/Key.js
@@ -287,7 +287,7 @@ class Key {
       );
     }
 
-    return redis_commands.exec().then(async () => {
+    return redis_commands.exec().then(() => {
       this.#changes = [];
       return this;
     });
diff --git a/pass/app/Payment.js b/pass/app/Payment.js
index 8f0cf6d132adcba78c872262315f17d30082a245..16be80e39ed1e63d5d265ca73377e38ed8e4c707 100644
--- a/pass/app/Payment.js
+++ b/pass/app/Payment.js
@@ -149,10 +149,11 @@ class Payment {
     insert_data.created_at = dayjs().format("YYYY-MM-DD HH:mm:ss");
     return Payments()
       .insert(insert_data, "*")
-      .then((result) => {
+      .then(async (result) => {
         if (result.length !== 1) {
           return Promise.reject("Error creating payment.");
         }
+
         return new Payment(result[0]);
       });
   }
diff --git a/pass/app/PaymentReference.js b/pass/app/PaymentReference.js
index 787ce1a830b04a7c78e4cac0c547a3402af8f447..4fcd47afe900d28defa614f3be0e6cdf2b0828cc 100644
--- a/pass/app/PaymentReference.js
+++ b/pass/app/PaymentReference.js
@@ -5,6 +5,7 @@ const Key = require("./Key");
 
 const dayjs = require("dayjs");
 const Payment = require("./Payment");
+const Zammad = require("./Zammad");
 
 /**
  * @typedef {Object} PaymentReferenceDB
@@ -285,12 +286,12 @@ class PaymentReference {
    * @param {string} [data.payment_processor_id]
    * @param {Object} [data.payment_processor_data]
    *
-   * @returns {Payment}
+   * @returns {Promise<Payment>}
    */
   async createPayment(data) {
     data.payment_reference_id = this.id;
     return Payment.CREATE_NEW_PAYMENT(data).then((payment) => {
-      this.getKey(true).then(async (key) => {
+      return this.getKey(true).then(async (key) => {
         await this.setExpiration(dayjs().add(10, "year"));
         let charge_amount = Math.round(
           (payment.price / this.price) * this.amount
@@ -308,7 +309,9 @@ class PaymentReference {
             dayjs().add(config.get("keys.expiration_years"), "year")
           );
         }
-        return key.save().then(() => payment);
+        return Zammad.CREATE_NOTIFICATION(charge_amount, payment.price, payment.payment_processor.serialize().processor_name)
+          .then(() => key.save())
+          .then(key => payment);
       });
     });
   }
@@ -323,7 +326,7 @@ class PaymentReference {
       let expiration = dayjs().add(config.get("keys.expiration_years"), "year");
       return this.setExpiration(expiration).then(() => {
         key.charge_key_order(this.amount, this.id, expiration);
-        return key.save();
+        return Zammad.CREATE_NOTIFICATION(this.amount, 0, "Manual").then(() => key.save());
       });
     });
   }
diff --git a/pass/app/Zammad.js b/pass/app/Zammad.js
new file mode 100644
index 0000000000000000000000000000000000000000..c4f693a0790c19f26bbf4e06919a26c467f02811
--- /dev/null
+++ b/pass/app/Zammad.js
@@ -0,0 +1,53 @@
+const config = require("config");
+
+class Zammad {
+
+    /**
+     * Creates a notification in the configured Zammad instance
+     * 
+     * @param {number} token_amount
+     * @param {number} $price
+     * @param {string} $payment_method
+     * 
+     * @returns {Promise<boolean>}
+     */
+    static async CREATE_NOTIFICATION(token_amount, price, payment_method) {
+        // Check if notifications are turned on
+        try {
+            if (config.get("app.zammad.enabled")) {
+                let zammad_url = config.get("app.zammad.url") + "/api/v1/ticket_articles";
+
+                let zammad_data = {
+                    "ticket_id": config.get("app.zammad.notification_ticket_id"),
+                    "subject": "Neue Bestellung",
+                    "body": `Tokens: ${token_amount}\nBetrag: ${price.toFixed(2)}€\nZahlungsart: ${payment_method}`,
+                    "content_type": "text/plain",
+                    "type": "web",
+                    "internal": false,
+                    "sender": "Agent",
+                    "time_unit": "15"
+                }
+                return fetch(zammad_url, {
+                    method: "POST",
+                    headers: {
+                        "Content-Type": "application/json",
+                        "Authorization": `Token ${config.get("app.zammad.api_key")}`
+                    },
+                    body: JSON.stringify(zammad_data)
+                }).then(response => {
+                    return true;
+                }).catch(e => {
+                    console.error(e);
+                    return false;
+                })
+            } else {
+                return true;
+            }
+        } catch (e) {
+            console.error(e);
+            return false;
+        }
+    }
+}
+
+module.exports = Zammad;
\ No newline at end of file
diff --git a/pass/app/payment_processor/Manual.js b/pass/app/payment_processor/Manual.js
index 780b58a7003379605e84c9e67eb3fdbaa742b8c2..6cd083c2c7d724797a51f611f6ad0c45e6d5193e 100644
--- a/pass/app/payment_processor/Manual.js
+++ b/pass/app/payment_processor/Manual.js
@@ -4,6 +4,10 @@ const i18next = require("i18next");
 class Manual extends PaymentProcessor {
   #note;
 
+  static get NAME() {
+    return "Manual";
+  }
+
   /**
    *
    * Constructs a new manual Payment
diff --git a/pass/app/payment_processor/PaymentProcessor.js b/pass/app/payment_processor/PaymentProcessor.js
index 704ed09ab815da276565e3ad521bcb32fad6f511..7c831972235fedf1034fa7cd60a9bda6b9380382 100644
--- a/pass/app/payment_processor/PaymentProcessor.js
+++ b/pass/app/payment_processor/PaymentProcessor.js
@@ -2,6 +2,9 @@ const i18next = require("i18next");
 const PaymentReference = require("../PaymentReference");
 
 class PaymentProcessor {
+  static get NAME() {
+    throw new Error("Function NAME() must be implemented");
+  }
   constructor() {
     if (this.constructor === PaymentProcessor) {
       throw new Error("Cannot instantiate abstract class");
diff --git a/pass/config/default.json b/pass/config/default.json
index ff9d71efd2d46adbcff066ce2363660a21d0baef..9c6bac7411c61f32037a8bf4d888cf29a5ef7a8b 100644
--- a/pass/config/default.json
+++ b/pass/config/default.json
@@ -17,17 +17,17 @@
       "app_id": "<OPEN ID APP ID>",
       "app_secret": "<OPEN ID APP SECRET>"
     },
-    "civicrm": {
-      "enabled": false,
-      "url": "<ENTER_CIVICRM_URL_HERE>",
-      "user_id": "<USER_ID_THAT_GETS_CONTRIBUTIONS>",
-      "api_key": "<ENTER_CIVICRM_API_KEY_HERE>"
-    },
     "osticket": {
       "enabled": true,
       "url": "<OSTICKET_URL>",
       "api_key": "<OSTICKET_API_KEY>"
     },
+    "zammad": {
+      "enabled": false,
+      "url": "<ZAMMAD_URL>",
+      "api_key": "<ZAMMAD_API_KEY>",
+      "notification_ticket_id": "0"
+    },
     "accent": {
       "apiUrl": "https://translate.metager.de",
       "apiKey": "",
diff --git a/pass/routes/checkout/micropayment.js b/pass/routes/checkout/micropayment.js
index 71bedbcc5aa626ecd262b10c6c34ce8fba8da314..c663fe8b20acd84a082fc2c1df45847d2a440b3c 100644
--- a/pass/routes/checkout/micropayment.js
+++ b/pass/routes/checkout/micropayment.js
@@ -34,7 +34,7 @@ router.get("/event", (req, res) => {
             payment_processor_id: req.query.auth,
             payment_processor_data: req.query,
           })
-          .then(() => redirect_url);
+          .then(async payment => redirect_url);
       } else {
         return redirect_url;
       }