discountCodeAppUpdate stores recurringCycleLimit: 0 as null

I’m trying to understand the difference between discountCodeAppUpdate and discountAutomaticAppUpdate on the Admin API 2026-07.

When I send recurringCycleLimit: 0 with appliesOnSubscription: true to discountAutomaticAppUpdate, the discount comes back with recurringCycleLimit: 0. When I send the same input to discountCodeAppUpdate, userErrors is empty, but a follow-up discountNode read of the DiscountCodeApp shows:

"appliesOnSubscription": true,
"recurringCycleLimit": null

The docs describe 0 the same way for both:

The only difference I can see is on the read side. DiscountAutomaticApp.recurringCycleLimit is Int! and DiscountCodeApp.recurringCycleLimit is nullable Int.

On code discounts, 1–99 are stored as sent. 0, 100, and 999 all come back as null. Saving 100 over a previously stored 12 replaces the 12 with null, without an error.

My questions:

  1. Why is 0 stored as null on code app discounts, when the same 0 is kept on automatic app discounts?
  2. Does null on a DiscountCodeApp mean “applies indefinitely” at checkout, the same as 0? If so, is that documented anywhere? The DiscountCodeApp docs only describe 0.
  3. Is there an upper limit for code discounts? Values above 99 also come back as null, but I can’t find that in the docs.

Best,

Pius