diff --git a/src/highlanderticketing/handler/oauth.go b/src/highlanderticketing/handler/oauth.go
index dbbe02710c74af5d33dd50c31a81558b0f87583e..ed080a7de5bddcea96882d62421bb5fe63557007 100644
--- a/src/highlanderticketing/handler/oauth.go
+++ b/src/highlanderticketing/handler/oauth.go
@@ -53,7 +53,7 @@ func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	// den teil in eine routine packen
-	user, err := service.GetUserInfo(token.AccessToken)
+	user, err := service.GetUserInfoByToken(token.AccessToken)
 	if err != nil {
 		sendJson(w, err)
 		return
@@ -89,7 +89,7 @@ func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) er
 }
 
 func checkAdmin(token string) error {
-	userExternal, err := service.GetUserInfo(token)
+	userExternal, err := service.GetUserInfoByToken(token)
 	if err != nil {
 		return err
 	}
diff --git a/src/highlanderticketing/handler/order.go b/src/highlanderticketing/handler/order.go
index 0f6b304725a3d0fb07a2b8284601240af7476fd8..f40eb690f5ae6f67da73cfe56246bff6eedfb739 100644
--- a/src/highlanderticketing/handler/order.go
+++ b/src/highlanderticketing/handler/order.go
@@ -32,7 +32,7 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) {
 		http.Error(w, err.Error(), http.StatusBadRequest)
 	}
 	fmt.Println(reqToken, "reqToken")
-	userOfOrder, err := service.GetUserInfo(reqToken)
+	userOfOrder, err := service.GetUserInfoByToken(reqToken)
 	if err != nil {
 		log.Errorf("Failure loading user Info %v", err)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -43,9 +43,7 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) {
 		log.Errorf("Failure loading internal user Info %v", err)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 	}
-	fmt.Println(internalUser, 2)
 	order.User = *internalUser
-	fmt.Println(order.User, 3)
 	err = service.AddMatchOrder(id, order)
 	if err != nil {
 		log.Errorf("Failure adding order to match with ID %v: %v", id, err)
@@ -76,7 +74,7 @@ func AddTravelOrder(w http.ResponseWriter, r *http.Request) {
 		log.Errorf("Failure loading bearer token  %v", err)
 		http.Error(w, err.Error(), http.StatusBadRequest)
 	}
-	userOfOrder, err := service.GetUserInfo(reqToken)
+	userOfOrder, err := service.GetUserInfoByToken(reqToken)
 	if err != nil {
 		log.Errorf("Failure loading user Info %v", err)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -97,6 +95,54 @@ func AddTravelOrder(w http.ResponseWriter, r *http.Request) {
 	sendJson(w, order)
 
 }
+func CancelOrder(w http.ResponseWriter, r *http.Request) {
+	if err := CheckAccessToken(w, r, false); err != nil {
+		log.Errorf("Eror checking AccessToken: %v", err)
+		http.Error(w, err.Error(), http.StatusUnauthorized)
+		return
+	}
+	id, err := getID(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	orderId, err := getOrderID(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	order, err := getOrder(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	reqToken, err := getBearerToken(r)
+	if err != nil {
+		log.Errorf("Failure loading bearer token  %v", err)
+		http.Error(w, err.Error(), http.StatusBadRequest)
+	}
+	userOfOrder, err := service.GetUserInfoByToken(reqToken)
+	if err != nil {
+		log.Errorf("Failure loading user Info %v", err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+	}
+	internalUser, err := service.GetUserByEmail(userOfOrder.Email)
+	if err != nil {
+		log.Errorf("Failure loading internal user Info %v", err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+	}
+	order.User = *internalUser
+	order.ID = orderId
+	fmt.Println(orderId, "orderId")
+
+	err = service.CancelOrder(id, order)
+	if err != nil {
+		log.Errorf("Failure adding donation to campaign with ID %v: %v", id, err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	sendJson(w, order)
+}
 
 func getOrder(r *http.Request) (*model.Order, error) {
 	var order model.Order
diff --git a/src/highlanderticketing/handler/utils.go b/src/highlanderticketing/handler/utils.go
index d62e480e1cc586c1bf3d57973b16b75aba7b24e4..8304c975d6c2d3b06ccaaf286f003477ebed1de0 100644
--- a/src/highlanderticketing/handler/utils.go
+++ b/src/highlanderticketing/handler/utils.go
@@ -34,6 +34,19 @@ func getID(r *http.Request) (primitive.ObjectID, error) {
 
 	return objectID, nil
 }
+func getOrderID(r *http.Request) (primitive.ObjectID, error) {
+	vars := mux.Vars(r)
+	id := vars["orderid"]
+
+	objectID, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		log.Errorf("Can't get ObjectID from request: %v", err)
+		return primitive.NilObjectID, err
+	}
+
+	return objectID, nil
+}
+
 func getBearerToken(r *http.Request) (string, error) {
 	reqToken := r.Header.Get("Authorization")
 	if reqToken == "" {
diff --git a/src/highlanderticketing/main.go b/src/highlanderticketing/main.go
index d78ed7ccb7f51f18cfa39716735e289b78b362ee..f807dbcbe6f06b48b83298b2885968262d6bb9c0 100644
--- a/src/highlanderticketing/main.go
+++ b/src/highlanderticketing/main.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+	"fmt"
 	"net/http"
 	"os"
 
@@ -8,18 +9,20 @@ import (
 	"github.com/joho/godotenv"
 	"github.com/nats-io/nats.go"
 	log "github.com/sirupsen/logrus"
+	"gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/api"
 	"gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/db"
 	"gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/handler"
+	"gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model"
 	"gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/service"
 )
 
 func main() {
-	/*service.DeleteAllUsers()
+	service.DeleteAllUsers()
 	var userArray []model.User
 	userArray, _ = service.GetAllUsers()
 	fmt.Println(userArray)
 	service.DeleteAllMatches()
-	api.GetMatchesOfApiToDb("https://api.openligadb.de/getmatchesbyteamid/16/5/0")*/
+	api.GetMatchesOfApiToDb("https://api.openligadb.de/getmatchesbyteamid/16/5/0")
 
 	if err := godotenv.Load(".env"); err != nil {
 		log.Fatalf("Error loading .env file")
@@ -51,6 +54,7 @@ func main() {
 	router.HandleFunc("/match/{id}", handler.DeleteMatch).Methods("DELETE")
 	router.HandleFunc("/match/{id}/matchorder", handler.AddMatchOrder).Methods("POST")
 	router.HandleFunc("/match/{id}/travelorder", handler.AddTravelOrder).Methods("POST")
+	router.HandleFunc("/match/{id}/cancelorder/{orderid}", handler.CancelOrder).Methods("PUT")
 	if err := http.ListenAndServe(":8000", router); err != nil {
 		log.Fatal(err)
 	}
diff --git a/src/highlanderticketing/model/match.go b/src/highlanderticketing/model/match.go
index 615d5e1fcabb8252a18ef56030c53146207f4298..27af56fd223e36da8f6affbf1fe23eab70b2b9fa 100644
--- a/src/highlanderticketing/model/match.go
+++ b/src/highlanderticketing/model/match.go
@@ -12,6 +12,7 @@ type Match struct {
 	Location              string             `bson:"location"`
 	Date                  string             `bson:"date, omitempty"`
 	Travel                Travel             `bson:"travel"`
+	OrderAmount           int32              `bson:"orderamount, omitempty"`
 	Orders                []Order            `bson:"orders"`
 }
 
diff --git a/src/highlanderticketing/model/order.go b/src/highlanderticketing/model/order.go
index abffa712c9e6ee9066baf93926b8a95d5f2234e2..4ccab1876b6cf53b41edc8c6c6e5fa2902a5dcff 100644
--- a/src/highlanderticketing/model/order.go
+++ b/src/highlanderticketing/model/order.go
@@ -3,14 +3,10 @@ package model
 import "go.mongodb.org/mongo-driver/bson/primitive"
 
 type Order struct {
-	ID        primitive.ObjectID `bson:"_id, omitempty"`
-	OrderType OrderType          `bson:"order_type"`
-	Amount    int32              `bson:"amount"`
-	User      User               `bson:"user, omitempty"`
+	ID             primitive.ObjectID `bson:"_id, omitempty"`
+	Amount         int32              `bson:"amount"`
+	User           User               `bson:"user, omitempty"`
+	Ordernotified  bool               `bson:"ordernotified, omitempty"`
+	Canceled       bool               `bson:"canceled, omitempty"`
+	Cancelnotified bool               `bson:"cancelnotified, omitempty"`
 }
-type OrderType string
-
-const (
-	MATCHTICKET OrderType = "MATCHTICKET"
-	BUSTICKET   OrderType = "TRAVELTICKET"
-)
diff --git a/src/highlanderticketing/service/nats.go b/src/highlanderticketing/service/nats.go
index 103bbf39c2eb52805bedfe9a909e0a8f1c876547..23a4c5cae451954ff118e1b547e9aeb026ac4f53 100644
--- a/src/highlanderticketing/service/nats.go
+++ b/src/highlanderticketing/service/nats.go
@@ -33,38 +33,43 @@ func ConnectToNats() (NatsServer, error) {
 
 }
 
-func (s NatsServer) ConfirmOrder(e *model.EmialContent) {
+func (s NatsServer) ConfirmOrder(e *model.EmialContent) error {
 	var res *model.Response
 	emailContenct, errMarshal := json.Marshal(e)
 	if errMarshal != nil {
 		fmt.Println(errMarshal)
-		return
+		return fmt.Errorf(errMarshal.Error())
 	}
 	response, err := s.Nc.Request("confirmOrder."+string(e.OrderID), []byte(emailContenct), 2*time.Second)
 	if err != nil {
 		log.Println("Error making NATS request:", err)
+		return fmt.Errorf(err.Error())
 	}
 
 	if err := json.Unmarshal(response.Data, &res); err != nil {
-		panic(err)
+		return fmt.Errorf(err.Error())
 	}
 	fmt.Println("hier die nats response", *res)
+	return nil
 }
 
-func (s NatsServer) confirmCancel(e *model.EmialContent) {
+func (s NatsServer) ConfirmCancel(e *model.EmialContent) error {
 	var res *model.Response
 	emailContenct, errMarshal := json.Marshal(e)
 	if errMarshal != nil {
 		fmt.Println(errMarshal)
-		return
+		return fmt.Errorf(errMarshal.Error())
 	}
-	response, err := s.Nc.Request("confirmOrder."+string(e.Emailadress), []byte(emailContenct), 2*time.Second)
+	response, err := s.Nc.Request("confirmOrder."+string(e.OrderID), []byte(emailContenct), 2*time.Second)
 	if err != nil {
 		log.Println("Error making NATS request:", err)
+		return fmt.Errorf(err.Error())
 	}
 
 	if err := json.Unmarshal(response.Data, &res); err != nil {
-		panic(err)
+		return fmt.Errorf(err.Error())
 	}
+
 	fmt.Println("hier die nats response", &res)
+	return nil
 }
diff --git a/src/highlanderticketing/service/oauth.go b/src/highlanderticketing/service/oauth.go
index 0e03d60859bc7bd90b522bbc24c29cfbe799bcd4..7c7167cd00990d27e84efa5b3c51716edf32f210 100644
--- a/src/highlanderticketing/service/oauth.go
+++ b/src/highlanderticketing/service/oauth.go
@@ -49,7 +49,7 @@ func ValidateGoogleAccessToken(accessToken string) (bool, error) {
 	return false, nil
 }
 
-func GetUserInfo(accessToken string) (model.User, error) {
+func GetUserInfoByToken(accessToken string) (model.User, error) {
 	var userInfo model.User
 	client := &http.Client{}
 	req, err := http.NewRequest("GET", "https://www.googleapis.com/oauth2/v1/userinfo", nil)
diff --git a/src/highlanderticketing/service/order.go b/src/highlanderticketing/service/order.go
index 8d97dba00b4ea8f11177e5f6dc57233ae47e7fad..5a5b2c619efea6ba73a68e7314b1c0e2580d5216 100644
--- a/src/highlanderticketing/service/order.go
+++ b/src/highlanderticketing/service/order.go
@@ -8,6 +8,7 @@ import (
 	"gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo/options"
 )
 
 func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error {
@@ -37,14 +38,39 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error {
 	}
 
 	if updateResult.ModifiedCount == 0 {
-		return fmt.Errorf("no document was updated")
+		return fmt.Errorf("no document was updated, please send order again")
 	}
 
 	natsServer, err := ConnectToNats()
 	defer natsServer.Nc.Close()
 
-	emailContenct := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()}
-	natsServer.ConfirmOrder(&emailContenct)
+	emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()}
+	if err := natsServer.ConfirmOrder(&emailContent); err != nil {
+		// hier warten und nochmal versuchen zu senden
+		order.Ordernotified = false
+		return fmt.Errorf("error sending confirm email: %v", err)
+	} else {
+		order.Ordernotified = true
+	}
+
+	updaterNotification := bson.D{primitive.E{Key: "$set", Value: bson.D{
+		primitive.E{Key: "orders.$[element]", Value: order},
+	}}}
+
+	options := options.Update().SetArrayFilters(options.ArrayFilters{
+		Filters: []interface{}{
+			bson.D{{Key: "element._id", Value: order.ID}},
+		},
+	})
+
+	updateNotification, err := collection.UpdateOne(context.TODO(), filter, updaterNotification, options)
+	if err != nil {
+		return fmt.Errorf("no document was updated, please send order again")
+	}
+
+	if updateNotification.ModifiedCount == 0 {
+		return fmt.Errorf("no document was updated, please send order again")
+	}
 
 	return nil
 }
@@ -74,17 +100,132 @@ func AddTravelOrder(matchID primitive.ObjectID, order *model.Order) error {
 	}
 
 	if updateResult.ModifiedCount == 0 {
-		return fmt.Errorf("no document was updated")
+		return fmt.Errorf("no document was updated, please send order again")
 	}
 
 	natsServer, err := ConnectToNats()
 	defer natsServer.Nc.Close()
 
-	emailContenct := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()}
-	natsServer.ConfirmOrder(&emailContenct)
+	emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()}
+	if err := natsServer.ConfirmOrder(&emailContent); err != nil {
+		// hier warten und nochmal versuchen zu senden
+		order.Ordernotified = false
+		return fmt.Errorf("error sending confirm email %v", err)
+	} else {
+		order.Ordernotified = true
+	}
+
+	updaterNotification := bson.D{primitive.E{Key: "$set", Value: bson.D{
+		primitive.E{Key: "orders.$[element]", Value: order},
+	}}}
+
+	options := options.Update().SetArrayFilters(options.ArrayFilters{
+		Filters: []interface{}{
+			bson.D{{Key: "element._id", Value: order.ID}},
+		},
+	})
+
+	updateNotification, err := collection.UpdateOne(context.TODO(), filter, updaterNotification, options)
+	if err != nil {
+		return fmt.Errorf("no document was updated, please send order again")
+	}
+
+	if updateNotification.ModifiedCount == 0 {
+		return fmt.Errorf("no document was updated, please send order again")
+	}
 
 	return nil
 }
-func CancelOrder() {
 
+var isMatchOrder bool = true
+
+func CancelOrder(matchID primitive.ObjectID, order *model.Order) error {
+	filter := bson.D{primitive.E{Key: "_id", Value: matchID}}
+	matchToFind, err := GetMatchByID(matchID)
+	if err != nil {
+		return err
+	}
+
+	client, err := db.GetMongoClient()
+	if err != nil {
+		return err
+	}
+
+	collection := client.Database(db.DB).Collection(db.MATCHES)
+
+	order.Canceled = true
+
+	updaterMatchCancel := bson.D{primitive.E{Key: "$set", Value: bson.D{
+		primitive.E{Key: "orders.$[element]", Value: order},
+	}}}
+
+	updaterTravelCancel := bson.D{primitive.E{Key: "$set", Value: bson.D{
+		primitive.E{Key: "travel.orders.$[element]", Value: order},
+	}}}
+
+	options := options.Update().SetArrayFilters(options.ArrayFilters{
+		Filters: []interface{}{
+			bson.D{{Key: "element._id", Value: order.ID}},
+		},
+	})
+
+	updateMatchCancel, err := collection.UpdateOne(context.TODO(), filter, updaterMatchCancel, options)
+	if err != nil {
+		return err
+	}
+	if updateMatchCancel.ModifiedCount == 0 {
+		isMatchOrder = false
+		updateTravelCancel, err := collection.UpdateOne(context.TODO(), filter, updaterTravelCancel, options)
+		if err != nil {
+			return err
+		}
+		if updateTravelCancel.ModifiedCount == 0 {
+			return fmt.Errorf("orderid not in system")
+		}
+
+	}
+
+	natsServer, err := ConnectToNats()
+	defer natsServer.Nc.Close()
+
+	emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: order.ID.String()}
+	if err := natsServer.ConfirmCancel(&emailContent); err != nil {
+		return fmt.Errorf("error sending confirm email %v", err)
+	}
+
+	order.Cancelnotified = true
+
+	if isMatchOrder == false {
+		updateTravelCancelNotifi, err := collection.UpdateOne(context.TODO(), filter, updaterTravelCancel, options)
+		if err != nil {
+			return err
+		}
+		if updateTravelCancelNotifi.ModifiedCount == 0 {
+			return fmt.Errorf("orderid not in system")
+		}
+		isMatchOrder = true
+	} else {
+		updateMatchCancelNotifi, err := collection.UpdateOne(context.TODO(), filter, updaterMatchCancel, options)
+		if err != nil {
+			return err
+		}
+		if updateMatchCancelNotifi.ModifiedCount == 0 {
+			return fmt.Errorf("orderid not in system")
+		}
+	}
+	return nil
+
+}
+func deleteOrder(orderID primitive.ObjectID) error {
+	filter := bson.D{primitive.E{Key: "_id", Value: orderID}}
+	client, err := db.GetMongoClient()
+	if err != nil {
+		return err
+	}
+	collection := client.Database(db.DB).Collection(db.MATCHES)
+	_, err = collection.DeleteOne(context.TODO(), filter)
+	if err != nil {
+		return err
+	}
+	return nil
 }
diff --git a/src/highlanderticketing/service/register.go b/src/highlanderticketing/service/register.go
index 38a23ed9bf68883b67f646f1035d2b03f14b6b4a..40ca19207a832a6848a6c5e7cf2f95d74df4c019 100644
--- a/src/highlanderticketing/service/register.go
+++ b/src/highlanderticketing/service/register.go
@@ -7,7 +7,7 @@ import (
 )
 
 func Register(accessToken string) error {
-	user, err := GetUserInfo(accessToken)
+	user, err := GetUserInfoByToken(accessToken)
 	if err != nil {
 		return err
 	}