diff --git a/src/app/core/http/error-handler.interceptor.ts b/src/app/core/http/error-handler.interceptor.ts
index fd794c9ab..7a047209d 100644
--- a/src/app/core/http/error-handler.interceptor.ts
+++ b/src/app/core/http/error-handler.interceptor.ts
@@ -109,7 +109,15 @@ export class ErrorHandlerInterceptor implements HttpInterceptor {
} else if (status === 400) {
alert = { type: 'Bad Request', message: errorMessage || 'Invalid parameters were passed in the request!' };
} else if (status === 403) {
- alert = { type: 'Unauthorized Request', message: errorMessage || 'You are not authorized for this request!' };
+ // A 403 is either a missing permission or a business rule the record does not meet yet ("post the coupon
+ // first", "matures on …"). Only the first is an authorisation problem; the rule is told by its code.
+ const errorCode: string =
+ errorBody?.errors?.[0]?.userMessageGlobalisationCode || errorBody?.userMessageGlobalisationCode || '';
+ const isPermission = !errorCode || /not\.authori[sz]ed|unauthori[sz]ed|access\.denied|forbidden/i.test(errorCode);
+ alert = {
+ type: isPermission ? 'Unauthorized Request' : 'Action Not Allowed',
+ message: errorMessage || 'You are not authorized for this request!'
+ };
} else if (status === 404) {
alert = {
type: this.translate.instant('error.resource.not.found'),
diff --git a/src/app/core/shell/shell.component.html b/src/app/core/shell/shell.component.html
index 420d10c4a..990eb78e6 100644
--- a/src/app/core/shell/shell.component.html
+++ b/src/app/core/shell/shell.component.html
@@ -1499,7 +1499,7 @@