RocketChat/Rocket.Chat · error · Error
error-mac-limit-reached
Error message
error-mac-limit-reached
What it means
Thrown by POST/DELETE /api/v1/livechat/transcript/:rid when Omnichannel.isWithinMACLimit(room) is false. MAC = Monthly Active Contacts, an Enterprise licensing limit. The check (apps/meteor/server/services/omnichannel/service.ts:55) fails when this room's visitor has NOT already been counted in the current month AND the license says the monthlyActiveContacts limit has been reached — so processing this room would add a new billable active contact, which the license forbids.
Solutions
- Check Administration -> Info/License: verify the Enterprise license is valid and inspect the monthlyActiveContacts limit and current usage
- Wait for the calendar-month reset — the counter is keyed on moment.utc().format('YYYY-MM')
- Reduce active contacts (close rooms, delete unneeded visitors via the visitor API) or upgrade/expand the license tier
- If the license was recently renewed/re-applied, re-validate it so the cached limit refreshes
Defensive patterns
Strategy: try-catch
Validate before calling
// No REST pre-check exists for MAC; the closest is inspecting the license limits // exposed on Administration -> Info. Budget contacts before sending new ones.
Try / catch
try {
await requestTranscript(rid);
} catch (e: any) {
if (e?.response?.body?.error === 'error-mac-limit-reached') {
notifyAdmins('Monthly Active Contacts license limit reached — transcript deferred');
return; // do NOT retry in a tight loop; it needs a license/month change
}
throw e;
} Prevention
- Monitor monthlyActiveContacts usage against the license before month-end spikes
- Alert on the first mac-limit error — every subsequent new-contact action will fail too
- Keep the Enterprise license validated; expired licenses flip this check on
When it happens
Trigger: Enterprise workspace with a trial or Starter/Pro license hit its monthly active contacts ceiling; the visitor of this room is new this month; then any transcript request/cancel (and likewise chat continuation, queue placement, message sends) is refused with error-mac-limit-reached.
Common situations: Trials that expire mid-month after a spike in contacts; on-premise licenses not renewed; importing/re-opening old conversations whose visitors were not yet counted this month. CE workspaces without a license never hit this (they fall back to no MAC limit).
Related errors
- App could not be enabled
- error-invalid-channel
- error-invalid-inquiry
- error-invalid-room
- error-invalid-room
AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18).
Data as JSON: /api/errors/e50bd3b6f4cac069.
Report an issue: GitHub.
Appendix: source
Thrown at apps/meteor/server/api/v1/omnichannel/transcript.ts:49
POST: isPOSTLivechatTranscriptRequestParams,
},
},
{
async delete() {
const { rid } = this.urlParams;
const room = await LivechatRooms.findOneById<Pick<IOmnichannelRoom, 'open' | 'transcriptRequest' | 'v'>>(rid, {
projection: { open: 1, transcriptRequest: 1, v: 1 },
});
if (!room?.open) {
throw new Error('error-invalid-room');
}
if (!room.transcriptRequest) {
throw new Error('error-transcript-not-requested');
}
if (!(await Omnichannel.isWithinMACLimit(room))) {
throw new Error('error-mac-limit-reached');
}
await LivechatRooms.unsetEmailTranscriptRequestedByRoomId(rid);
return API.v1.success();
},
async post() {
const { rid } = this.urlParams;
const { email, subject } = this.bodyParams;
const user = await Users.findOneById(this.userId, {
projection: { _id: 1, username: 1, name: 1, utcOffset: 1 },
});
if (!user) {
throw new Error('error-invalid-user');
}
View on GitHub (pinned to b2c16d5842)