diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings
index d0988628c..6d6e3ed67 100644
--- a/Telegram/Resources/langs/lang.strings
+++ b/Telegram/Resources/langs/lang.strings
@@ -2520,12 +2520,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 
 "lng_credits_subscription_off_button" = "Renew Subscription";
 "lng_credits_subscription_off_about" = "You have canceled your subscription.";
+"lng_credits_subscription_off_by_bot_about" = "{bot} has canceled your subscription.";
 
 "lng_credits_subscription_status_on" = "renews on {date}";
 "lng_credits_subscription_status_off" = "expires on {date}";
 "lng_credits_subscription_status_none" = "expired on {date}";
 "lng_credits_subscription_status_off_right" = "canceled";
 "lng_credits_subscription_status_none_right" = "expired";
+"lng_credits_subscription_status_off_by_bot_right" = "canceled\nby bot";
 
 "lng_credits_small_balance_title#one" = "{count} Star Needed";
 "lng_credits_small_balance_title#other" = "{count} Stars Needed";
diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp
index c7b47ec04..3dbe08b96 100644
--- a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp
+++ b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp
@@ -955,16 +955,29 @@ PaintRoundImageCallback CreditsRow::generatePaintUserpicCallback(bool force) {
 	return _paintUserpicCallback;
 }
 
+[[nodiscard]] QString RightActionText(const Data::SubscriptionEntry &s) {
+	return s.cancelledByBot
+		? tr::lng_credits_subscription_status_off_by_bot_right(tr::now)
+		: s.cancelled
+		? tr::lng_credits_subscription_status_off_right(tr::now)
+		: s.expired
+		? tr::lng_credits_subscription_status_none_right(tr::now)
+		: QString();
+}
+
 QSize CreditsRow::rightActionSize() const {
 	if (_rightLabel) {
 		return _rightLabel->size;
-	} else if (_subscription.cancelled || _subscription.expired) {
-		const auto text = _subscription.cancelled
-			? tr::lng_credits_subscription_status_off_right(tr::now)
-			: tr::lng_credits_subscription_status_none_right(tr::now);
-		return QSize(
-			st::contactsStatusFont->width(text) + st::boxRowPadding.right(),
-			_rowHeight);
+	} else if (const auto t = RightActionText(_subscription); !t.isEmpty()) {
+		const auto lines = t.split('\n');
+		auto maxWidth = 0;
+		for (const auto &line : lines) {
+			const auto width = st::contactsStatusFont->width(line);
+			if (width > maxWidth) {
+				maxWidth = width;
+			}
+		}
+		return QSize(maxWidth + st::boxRowPadding.right(), _rowHeight);
 	} else if (_subscription || _entry) {
 		return QSize(
 			_rightText.maxWidth() + st::boxRowPadding.right() / 2,
@@ -994,18 +1007,31 @@ void CreditsRow::rightActionPaint(
 	const auto rightSkip = st::boxRowPadding.right();
 	if (_rightLabel) {
 		return _rightLabel->draw(p, x, y, _rowHeight);
-	} else if (_subscription.cancelled || _subscription.expired) {
+	} else if (const auto t = RightActionText(_subscription); !t.isEmpty()) {
 		const auto &statusFont = st::contactsStatusFont;
 		y += _rowHeight / 2;
 		p.setFont(statusFont);
 		p.setPen(st::attentionButtonFg);
-		p.drawTextRight(
-			rightSkip,
-			y - statusFont->height / 2,
-			outerWidth,
-			_subscription.expired
-				? tr::lng_credits_subscription_status_none_right(tr::now)
-				: tr::lng_credits_subscription_status_off_right(tr::now));
+
+		const auto lines = t.split('\n');
+		if (lines.size() > 1) {
+			const auto rect = QRect(x, 0, outerWidth - x, _rowHeight);
+			const auto lineHeight = statusFont->height;
+			const auto totalHeight = lines.size() * lineHeight;
+			auto startY = rect.top()
+				+ (rect.height() - totalHeight) / 2
+				+ statusFont->ascent;
+
+			for (const auto &line : lines) {
+				const auto lineWidth = statusFont->width(line);
+				const auto startX = rect.left()
+					+ (rect.width() - lineWidth) / 2;
+				p.drawText(startX, startY, line);
+				startY += lineHeight;
+			}
+			return;
+		}
+		p.drawTextRight(rightSkip, y - statusFont->height / 2, outerWidth, t);
 		return;
 	}
 	y += _rowHeight / 2;
@@ -1143,7 +1169,9 @@ void CreditsController::applySlice(const Data::CreditsStatusSlice &slice) {
 			.entry = i,
 			.subscription = s,
 			.context = _context,
-			.rowHeight = computeListSt().item.height,
+			.rowHeight = ((!s || !s.title.isEmpty())
+				? computeListSt().item
+				: st::boostsListBox.item).height,
 			.updateCallback = [=](not_null<PeerListRow*> row) {
 				delegate()->peerListUpdateRow(row);
 			},
diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp
index fc1b1d8e8..cb0ab6e89 100644
--- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp
+++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp
@@ -1270,10 +1270,16 @@ void ReceiptCreditsBox(
 				st::creditsBoxAboutDivider)));
 	}
 	if (s) {
+		const auto user = peer ? peer->asUser() : nullptr;
+		const auto bot = (user && !user->isSelf()) ? user : nullptr;
 		Ui::AddSkip(content);
 		auto label = object_ptr<Ui::FlatLabel>(
 			box,
-			s.cancelled
+			(s.cancelledByBot && bot)
+				? tr::lng_credits_subscription_off_by_bot_about(
+					lt_bot,
+					rpl::single(bot->name()))
+				: s.cancelled
 				? tr::lng_credits_subscription_off_about()
 				: tr::lng_credits_subscription_on_about(
 					lt_date,