{"record":{"id":"b94570312f16de6a","repo":"RocketChat/Rocket.Chat","slug":"error-action-not-allowed-b94570","errorCode":"error-action-not-allowed","errorMessage":"This is an enterprise feature","messagePattern":"This is an enterprise feature","errorType":"exception","errorClass":"Meteor.Error","httpStatus":null,"severity":"error","filePath":"apps/meteor/ee/server/meteor-methods/getReadReceipts.ts","lineNumber":21,"sourceCode":"import { License } from '@rocket.chat/license';\nimport { Messages } from '@rocket.chat/models';\nimport { check } from 'meteor/check';\nimport { Meteor } from 'meteor/meteor';\n\nimport { canAccessRoomIdAsync } from '../../../server/lib/authorization/canAccessRoom';\nimport { methodDeprecationLogger } from '../../../server/lib/deprecationWarningLogger';\nimport { ReadReceipt } from '../lib/message-read-receipt/ReadReceipt';\n\ndeclare module '@rocket.chat/ddp-client' {\n\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\tinterface ServerMethods {\n\t\tgetReadReceipts(options: { messageId: IMessage['_id'] }): IReadReceiptWithUser[];\n\t}\n}\n\nexport const getReadReceiptsFunction = async function (messageId: IMessage['_id'], userId: string): Promise<IReadReceiptWithUser[]> {\n\tif (!License.hasModule('message-read-receipt')) {\n\t\tthrow new Meteor.Error('error-action-not-allowed', 'This is an enterprise feature', { method: 'getReadReceipts' });\n\t}\n\tcheck(messageId, String);\n\n\tconst message = await Messages.findOneById(messageId, { projection: { _id: 1, rid: 1, receiptsArchived: 1 } });\n\tif (!message) {\n\t\tthrow new Meteor.Error('error-invalid-message', 'Invalid message', {\n\t\t\tmethod: 'getReadReceipts',\n\t\t});\n\t}\n\n\tif (!(await canAccessRoomIdAsync(message.rid, userId))) {\n\t\tthrow new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'getReadReceipts' });\n\t}\n\n\treturn ReadReceipt.getReceipts(message);\n};\n\nMeteor.methods<ServerMethods>({","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/RocketChat/Rocket.Chat/blob/f9d3ec372bb580fa8d036f94cf03925a478ef768/apps/meteor/ee/server/meteor-methods/getReadReceipts.ts#L3-L39","documentation":"Thrown by the getReadReceipts DDP method when License.hasModule('message-read-receipt') returns false. Read receipts with user attribution are an Enterprise-only module; on a Community install (or a license without that module) the method refuses before doing any work. Code is 'error-action-not-allowed'.","triggerScenarios":"Calling the getReadReceipts method (or any feature that resolves read-receipt user lists) on a workspace whose license does not include the 'message-read-receipt' module.","commonSituations":"Community edition deployment; Enterprise license expired or downgraded; dev/test instance without a license file loaded.","solutions":["Apply an Enterprise license that includes the message-read-receipt module.","If Enterprise is not available, disable/avoid UI that calls getReadReceipts and rely on the core read-receipt indicators only.","Confirm the license is loaded and not expired via Administration > License."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import { License } from '@rocket.chat/license';\nif (!License.hasModule('message-read-receipt')) {\n  disableReadReceiptListUI();\n  return;\n}\nconst receipts = await getReadReceiptsFunction(messageId, uid);","typeGuard":"function readReceiptsLicensed(): boolean {\n  return License.hasModule('message-read-receipt');\n}","tryCatchPattern":"try {\n  await Meteor.callAsync('getReadReceipts', { messageId });\n} catch (e) {\n  if (isMeteorError(e, 'error-action-not-allowed')) {\n    notifyUser('Read-receipt details require an Enterprise license.');\n    return;\n  }\n  throw e;\n}","preventionTips":["Gate the 'who read this' UI behind License.hasModule('message-read-receipt').","Keep the workspace license current; monitor expiry.","Distinguish Community vs Enterprise features in product docs."],"tags":["enterprise","license","read-receipts","authorization"],"backgroundTag":null,"analyzedSha":"f9d3ec372bb580fa8d036f94cf03925a478ef768","analyzedAt":"2026-08-12T19:07:17.372Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}