diff --git a/mappings/cancel.jsonata b/mappings/cancel.jsonata
new file mode 100644
index 0000000000000000000000000000000000000000..1af3ce80f0120e491ed58db8e0db54945d64d1a3
--- /dev/null
+++ b/mappings/cancel.jsonata
@@ -0,0 +1,4 @@
+{
+    "context": $context(context, $action),
+    "message": message
+}
diff --git a/mappings/on_cancel.jsonata b/mappings/on_cancel.jsonata
new file mode 100644
index 0000000000000000000000000000000000000000..9018d1999c5a8bf31510702e6d9785b0a8a2f886
--- /dev/null
+++ b/mappings/on_cancel.jsonata
@@ -0,0 +1,40 @@
+{
+    "data": $.responses.{
+        "context": context,
+        "message": {
+            "order": {
+                "type": message.order.type,
+                "provider": {
+                    "id": message.order.provider.id,
+                    "name": message.order.provider.descriptor.name,
+                    "short_desc": message.order.provider.descriptor.short_desc,
+                    "long_desc": message.order.provider.descriptor.long_desc,
+                    "rating": message.order.provider.rating,
+                    "images": message.order.provider.descriptor.images.{
+                        "url": url,
+                        "size_type": size_type
+                    },
+                    "media": message.order.provider.descriptor.media.{
+                        "url": url
+                    }
+                },
+                "items": message.order.items.{
+                    "id": id,
+                    "name": descriptor.name,
+                    "short_desc": descriptor.short_desc,
+                    "long_desc": descriptor.long_desc,
+                    "price": price,
+                    "rating": rating,
+                    "rateable": rateable,
+                    "time": time,
+                    "quantity": quantity
+                },
+                "fulfillments": message.order.fulfillments,
+                "quote": message.order.quote,
+                "billing": message.order.billing,
+                "payments": message.order.payments,
+                "cancellation_terms": message.order.cancellation_terms
+            }
+        }
+    }[]
+}
diff --git a/src/gcl/gcl.controller.ts b/src/gcl/gcl.controller.ts
index 6909ffdb89b2ad8c7a54c687ed09ad78f2a282c0..6e66375bfe6d80f0967d4accf81b73627b12f4a8 100644
--- a/src/gcl/gcl.controller.ts
+++ b/src/gcl/gcl.controller.ts
@@ -42,4 +42,10 @@ export class GCLController {
         const statusResult = await this.service.rating(body);
         return statusResult;
     }
+
+    @httpPost('cancel')
+    public async cancel(@requestBody() body: any): Promise<any> {
+        const statusResult = await this.service.cancel(body);
+        return statusResult;
+    }
 }
diff --git a/src/gcl/gcl.service.ts b/src/gcl/gcl.service.ts
index dab92b937db40a4ecda32cae7cf12300e6b9b6e7..0131812e17dbef0366ebea4701805ae469e11b71 100644
--- a/src/gcl/gcl.service.ts
+++ b/src/gcl/gcl.service.ts
@@ -1,6 +1,7 @@
 import { inject, injectable } from "inversify";
 import { TLService } from "../tl/tl.service";
 import { PSClientService } from "../psclient/psclient.service";
+import data from '../../data.json';
 
 @injectable()
 export class GCLService {
@@ -58,4 +59,12 @@ export class GCLService {
 
         return response;
     }
+
+    async cancel(body: any) {
+        const payload = await this.tlService.transform(body, "cancel");
+        const psResponse = await this.psClientService.post(payload);
+        const response = await this.tlService.transform(psResponse, "on_cancel");
+
+        return response;
+    }
 }