diff --git a/README.md b/README.md
index 67d7d63d05d0238a346f9eb5045521dc52079893..a428072be37b9ae67fe2ede4125c0f25e1911667 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,8 @@ GCSE Computer Science Challenge
 ```
 git clone https://github.com/TheJoeCoder/PizzaPalace
 cd PizzaPalace
-pip install -r requirements.txt
 cd server
+pip install -r requirements.txt
 cp config.py.example config.py
 python app.py
 ```
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 19acec61d8f3aca4a7ea87bfd4f5894938b6df6a..0000000000000000000000000000000000000000
--- a/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-flask==2.3.2
\ No newline at end of file
diff --git a/server/app.py b/server/app.py
index d8fbbf5dc79661127645cc4bbe129406c87117d5..00768a7238029f09888a8fbee0625a8eace8ee97 100644
--- a/server/app.py
+++ b/server/app.py
@@ -1,5 +1,6 @@
-import json, uuid, logging
+import json, uuid, logging, requests
 from flask import Flask, request, jsonify, Response
+from pymongo import MongoClient
 
 logger = logging.Logger(__name__)
 
@@ -7,6 +8,11 @@ app = Flask(__name__)
 
 import config
 
+# Connect to MongoDB
+client = MongoClient(config.mongo_uri)
+
+db = client[config.mongo_db]
+
 with open("pizza_types.json","r") as f:
     pizza_types = json.loads(f.read())
 
@@ -158,7 +164,7 @@ def get_cart_total():
     grand_total = subtotal + config.delivery_flatrate
     return "{\"status\":200,\"message\":\"ok\",\"subtotal\":" + str(subtotal) + ",\"delivery_rate\":" + str(config.delivery_flatrate) + ",\"total\":" + str(grand_total) + ",\"breakdown\":" + json.dumps(breakdown) + "}", 200
 
-@app.route("/cart/confirmorder")
+@app.route("/cart/confirmorder", methods=["POST"])
 def confirm_order_cart():
     # Get cart id and key from request
     cart_id = request.args.get("id")
@@ -175,8 +181,25 @@ def confirm_order_cart():
         address = json.loads(address)
     except:
         return gen_invalid_message("address")
-    # TODO place order and clear cart
-    return "{\"status\":500,\"message\":\"not implemented\"}"
+    # Build order
+    order = {
+        "address": address,
+        "items": cart["items"]
+    }
+    # Add order to database
+    order_id = db.orders.insert_one(order).inserted_id
+    # Post webhook
+    webhook_data = {
+        "username": "PizzaBot",
+        "content": config.webhook_content_prepend + str(order_id)
+    }
+    webhook_response = requests.post(config.webhook_url, json=webhook_data)
+    if (webhook_response.status_code != 200):
+        logger.error("Webhook failed with status code " + str(webhook_response.status_code))
+    # Remove cart from existing carts
+    del open_carts[cart_id]
+    # Return order ID
+    return "{\"status\":200,\"message\":\"OK\", \"code\":\"" + str(order_id) + "\"}", 200
 
 if (__name__ == "__main__"):
     app.run(debug=True, host="0.0.0.0")
\ No newline at end of file
diff --git a/server/config.py.example b/server/config.py.example
index 56d4b0bc60c7c089912175d372440e18d7b46a71..18d41237b75010ffa98963c91ba431ac26a8c18c 100644
--- a/server/config.py.example
+++ b/server/config.py.example
@@ -1,2 +1,5 @@
 webhook = "https://example.com/webhook"
-delivery_flatrate = 0
\ No newline at end of file
+webhook_content_prepend = "New order received! Order ID: "
+delivery_flatrate = 0
+mongo_uri = "mongodb://localhost:27017/"
+mongo_db = "pizza_palace"
\ No newline at end of file
diff --git a/server/requirements.txt b/server/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..752eee95b78ce109a339fc64edb6d9181b73d9e6
--- /dev/null
+++ b/server/requirements.txt
@@ -0,0 +1,3 @@
+flask==2.3.2
+pymongo[srv]==4.3.3
+requests==2.29.0