discountRedeemCodeBulkAdd for multiple discounts of the same type

Hi everyone — hoping someone from the Shopify team here can help us understand one of the BFS requirements we’ve been asked to fix.

Why we’re asking here

After submitting our app, we received a list of required fixes. One of them seems pretty illogical when applied to how our app works. Since the emails now come from a no-reply address, we’re going through Partner Support — but the responses we’ve received so far are very brief and really frustrating.

Context: what our app does

Our app is a loyalty platform that lets merchants create multiple loyalty programs (points, VIP tiers, etc.). Each program can have many rewards, and each reward is implemented as a separate discount (code-based or automatic).

Each reward has its own configuration — included/excluded products, tag requirements, VIP tier, point cost, order minimums, combinesWith, references to the specific reward or program, etc.

So even if two rewards have the same output of “10% off,” they’re fundamentally different discount nodes with completely different logic and constraints.

How it works technically

  1. Merchant creates a reward in our app.

  2. We call discountCodeAppCreate, attach our Discount Function, and pass all reward parameters through metafields + combinesWith.

  3. On the storefront, the customer activates a reward in our widget, and we apply its code via the Storefront API.

  4. Shopify runs the discount function → the function reads metafields → validates → returns the calculated discount.

So the app naturally produces multiple discounts of the same type, but they are not duplicates — they behave completely differently.

The BFS requirement we received

5.5.3 Use a single redeem code per discount
Your app must use discountRedeemCodeBulkAdd to create any discounts with multiple redeem codes. Don’t use the Admin GraphQL API to create multiple discounts with the same value but different redeem codes.

Our interpretation

We assumed this means - if an app needs multiple redeem codes for the same discount, it should use discountRedeemCodeBulkAdd.

That obviously makes sense for some use cases (like marketing).

But our app never creates “the same discount with different codes.” Every reward = its own independent discount with distinct logic. So we explained this in detail.

The BFS reply

The second message we received was:

For each discount type you offer, you should be able to use the discountRedeemCodeBulkAdd mutation if you create multiple redeem codes for that specific type.

The requirement is not strictly limited for marketing.

This reply seems to assume:

“multiple discounts of the same type” = “one discount with multiple redeem codes”

If taken literally, it would mean that if an app has 3 Discount Function types, it should only ever create 3 total discounts. Which obviously can’t be the intended meaning.

Why combining rewards into a single discount is impossible

Even hypothetically, if we tried unifying all rewards into one discount:

  • The discount would have multiple codes via discountRedeemCodeBulkAdd.

  • We’d store per-code settings in metafields (`{“code1”: {…settings…}, "code2: {…settings…}, …}`).

  • The function would read settings based on the entered code.

But Shopify does not evaluate multiple codes from the same discount independently.

If a discount has codes CODE1 and CODE2, and both should apply (`combinesWith` allows it), Shopify shows at checkout page:

“CODE2 is valid but not applicable. Check discount terms.”

Meaning Shopify treats it as a single discount, runs it once, and does not evaluate both codes independently.

That makes it impossible to:

* combine multiple rewards of the same type;

* have different `combinesWith` rules;

* have different `context` settings;

* have different eligibility logic;

Basically, the entire concept of separate rewards becomes impossible in this scenario.

We even explored the idea of generating combination codes — for example, with three rewards: code1, code2, code3, code1-code2, code1-code3, code2-code3, code1-code2-code3.

However:

  • the discountRedeemCodeBulkAdd limit of 250 codes is reached at just 8 rewards (2^n-1);

  • the documentation never suggests this approach is intended or supported;

  • and overall, the solution becomes very impractical.

Existing documentation

  1. The discountCodeAppCreate documentation clearly anticipates apps creating multiple discounts of the same type, each with its own combinesWith, context, metafields, and eligibility logic. There’s no mention anywhere that this pattern is discouraged or incompatible with BFS requirements.

  2. Additionally, the documentation for discountRedeemCodeBulkAdd states:

“You can use the discountRedeemCodeBulkAdd mutation to automate the distribution of discount codes…” (https://shopify.dev/docs/api/admin-graphql/latest/mutations/discountRedeemCodeBulkAdd)

This mutation is clearly intended for creating multiple identical redeem codes for marketing distribution.

Our app does not distribute codes, does not send emails, and does not generate bulk sets of identical redeem codes.

Other BFS-approved apps

We reviewed multiple BFS-approved loyalty apps. They also generate multiple discounts of the same type. This suggests the rule is either being misinterpreted or applies only in certain cases.

What we’re ultimately trying to understand

Maybe the actual intended requirement is simply:

“If your app needs a discount that supports multiple redeem codes, you must use discountRedeemCodeBulkAdd.”

Because if that’s the meaning — we fully agree. But our app does not create multi-code discounts, so there’s nothing for us to change**.**

Our question to the Shopify team

What exactly is the BFS team expecting us to change?

  • Are we misunderstanding the requirement?

  • Is the moderator interpreting the rule too broadly?

  • Or is there newer guidance we’re unaware of?

Any clarity or experience from others who’ve gone through BFS review would be super appreciated.

P.S. After reading other threads here, I’m kinda realistic about the chances of getting a reply — but I’ll still try. We can’t enable our ads because the issue with fake clicks hasn’t been resolved, and we can’t mitigate the problem by targeting only logged-in users until we obtain BFS status. At the same time, we can’t obtain BFS status because of the unclear and seemingly inapplicable requirements described above. So we’re effectively stuck in a cycle we can’t break without clearer guidance on Shopify’s side.

5.5.3 is saying that IF you need multiple codes for the same discount (conceptually), you should not create multiple discount instances, but instead add redeem codes via discountRedeemCodeBulkAdd.

AFAIK, the reason for this rule, is to prevent applications creating multiple discount instances for what is really the same discount, which clutters up the discounts page, for example:

How does your implementation compare with the above screenshot? If you had a $5 reward, and a $10 reward - there should only be 2 discount instances, with many redemption codes. It would be good to understand your current approach.

@bkspace

5.5.3 is saying that IF you need multiple codes for the same discount (conceptually), you should not create multiple discount instances

The dev team interprets the requirement exactly this way.

If we have a $5 reward and a $10 reward, we create only two discount instances, just as you describe, but each of them has only one redeem code.

In our setup, the number of rewards in the app corresponds directly to the number of discount instances in the Shopify admin. Some of these are automatic, some are code-based, and the code-based ones each have exactly one redeem code.

This is why the requirement to mandatorily use discountRedeemCodeBulkAdd is confusing - we simply don’t need this mutation for anything.

The technical nuance is that we do not generate one-time discount codes in real time for each customer (as we’ve seen in some other apps). Instead, our discount codes are reusable, but they aren’t native - they’re connected to our Discount Functions, which perform all checks and calculations.

However, our communication with BFS reviewers currently looks like this:

Reviewer: You’re not satisfying requirement 5.5.3.
Us: We believe this requirement does not apply to our app; we are not doing anything 5.5.3 is meant to prevent.
Reviewer: The requirement says you must do it.
Us: Here’s why our implementation doesn’t fall under 5.5.3 at all.
Reviewer: Implement what’s written in 5.5.3.

At this point, it’s unclear how to move past this loop, which is why we’re seeking clarification here.

Gotcha @Katherine_Stepanova - definitely just sounds like a misunderstanding around these discount specific rules.

Hopefully someone from Shopify can reach out directly.