diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/cashtransfer/api/ShareAdvanceCollectionApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/cashtransfer/api/ShareAdvanceCollectionApiResource.java
index 4874057f9..b3164ea4a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/cashtransfer/api/ShareAdvanceCollectionApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/cashtransfer/api/ShareAdvanceCollectionApiResource.java
@@ -97,12 +97,42 @@ public class ShareAdvanceCollectionApiResource {
private static final int DEBIT = 2;
private static final int CREDIT = 1;
+ // ── acc_gl_account.classification_enum ─────────────────────────────────
+ // Fineract's GLAccountType: 1 = ASSET, 2 = LIABILITY, 3 = EQUITY, 4 = INCOME, 5 = EXPENSE.
+ private static final int GL_CLASSIFICATION_INCOME = 4;
+
// ── CashAccountsForShares financial_account_type ───────────────────────
private static final int FA_SHARES_REFERENCE = 1;
private static final int FA_SHARES_SUSPENSE = 2;
private static final int FA_INCOME_FROM_FEES = 3;
private static final int FA_SHARES_EQUITY = 4;
+ /**
+ * Restricts a {@code m_share_advance_collection c} query to receipts whose money was actually
+ * collected FOR a share collection, and nothing else.
+ *
+ *
+ * The Entry Type the counter picks at save time is the only thing that says what a GL receipt was
+ * taken for, so it decides this too: a receipt left General, or tagged for some other purpose
+ * entirely, never reaches an Apply Collection or Additional Shares screen. Guarding only the
+ * adoption path was not enough -- a receipt adopted before that guard existed stayed on these
+ * lists for ever, which is exactly how a General voucher kept reappearing against share accounts.
+ *
+ *
+ * A collection with no voucher of its own is the one thing this lets through: those come from the
+ * direct Share Advance Collection endpoint, which exists for nothing but share collections, so
+ * there is no counter tag to read and none needed.
+ */
+ private static final String SHARE_COLLECTION_TAGGED_ONLY = """
+ AND (c.voucher_no IS NULL
+ OR EXISTS (SELECT 1 FROM m_cashier_deposit_request d
+ JOIN m_code_value dcv ON dcv.id = d.entry_type_cv_id
+ WHERE d.voucher_no = c.voucher_no AND dcv.code_value = 'Share Collection')
+ OR EXISTS (SELECT 1 FROM m_clerk_disbursement_request r
+ JOIN m_code_value rcv ON rcv.id = r.entry_type_cv_id
+ WHERE r.voucher_no = c.voucher_no AND rcv.code_value = 'Share Collection'))
+ """;
+
// ── acc_product_mapping.product_type for shares ────────────────────────
private static final int PRODUCT_TYPE_SHARES = 4;
@@ -198,6 +228,21 @@ public class ShareAdvanceCollectionApiResource {
// needs the by-voucher search below, same as before.
autoAdoptShareCollectionTagged();
+ final List