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

  1. Check Administration -> Info/License: verify the Enterprise license is valid and inspect the monthlyActiveContacts limit and current usage
  2. Wait for the calendar-month reset — the counter is keyed on moment.utc().format('YYYY-MM')
  3. Reduce active contacts (close rooms, delete unneeded visitors via the visitor API) or upgrade/expand the license tier
  4. 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

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


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)