Navigating Shopify App Review: How to Prove Your Free Connector App Isn't Hiding External Billing

Ever felt like you're speaking a different language to Shopify App Review? It's a common frustration, especially for those of us building connector apps that link to external SaaS platforms. We recently saw a fantastic discussion unfold in the Shopify Community that really shed light on this, and I wanted to share the key takeaways. It's a prime example of how persistence and smart presentation can turn a frustrating loop into a clear path forward.

The "External Billing" Loop: A Connector App's Conundrum

Our friend webriy kicked off a thread about their app, BrandKity: Brand Asset Manager. This app is a super straightforward Shopify embedded admin app designed to connect merchants' existing BrandKity accounts (via API key) to browse and import assets directly into Shopify Files. Critically, the Shopify connector itself is free for all BrandKity users, even those on their free plan. No upgrades are required to use the integration, and it's strictly read-only with respect to BrandKity data.

Sounds simple, right? Not for App Review. They kept rejecting it, citing "external billing." The review team claimed they saw an "external billing flow" – specifically, a BrandKity Dashboard > Billing page with an "Upgrade" button linking to LemonSqueezy checkout. Their conclusion? This flow was "reachable from inside our embedded Shopify app."

The problem? webriy's app had none of that. No billing page, no nav item, no upgrade button, no links to LemonSqueezy, no redirects. The screencast Shopify provided started directly on our external BrandKity Dashboard > Billing page, showing the upgrade button, but it completely failed to show how that page was reached from the Shopify embedded app. It was a classic case of "your external SaaS has billing, therefore your Shopify app must be linking to it," without any actual proof of the link.

This led to a deeply frustrating loop: webriy kept asking, "Show me the in-app entry point!" and Shopify kept responding with generic advice or reiterating their unproven claim. To add insult to injury, they were told to reply to a no-reply email address for clarification. Talk about a wall!

The Breakthrough: Shopify Acknowledges the Misunderstanding

Here's where the community discussion took a positive turn. After persistent communication, webriy shared a crucial update: Shopify had re-reviewed the screencast and acknowledged their oversight! Their latest support email explicitly stated that the video "solely displays your external BrandKity dashboard" and "does not depict a merchant navigating from the Shopify embedded app to that billing page."

This was a huge win, validating webriy's core point: the existence of external billing for a separate SaaS doesn't automatically mean the Shopify app is violating billing policies by linking to it. The distinction between a SaaS's separate billing and an in-app billing flow is critical.

Proactive Proof: Lumine's Expert Strategy for Future Reviews

Even though webriy's case was heading toward resolution, lumine jumped in with some incredibly valuable advice for anyone facing similar "gateway-style flags" in the future. This is the kind of insight you only get from seasoned developers who've been through the trenches:

The core idea: Don't just show what your app does; explicitly show what it doesn't do, especially regarding billing.

Here’s how lumine suggested front-loading your screencasts to save yourself a ton of hassle:

  1. Explicitly Show "No Billing": Start your screencast by making it clear where billing does not appear. Reviewers are often looking for a link, so prove there isn't one.
  2. Comprehensive Walk-through: Open the embedded app and walk through every single page. Don't skip anything.
  3. Hover All CTAs: Hover over every Call-to-Action (CTA) button, menu item, and link. This demonstrates that they don't lead to external billing.
  4. End on Merchant Landing Page: Show the typical merchant experience without any billing prompts.
  5. Add Clear Captions: Use captions like "no upgrade prompt here," "this opens Shopify Files modal, no external nav," or "no external billing link." This negative-space proof carries more weight than just a written explanation.
  6. Address API Key Fields: If your app uses API keys that might imply a paid tier (like BrandKity's did), show the connection succeeding without any plan-tier interaction. This cuts off potential misunderstandings.

As lumine put it, "The negative-space proof carries more weight than the written explanation." This is crucial because reviewers often process videos quickly and default to "show me where the link is" rather than "prove there isn't one."

Key Takeaways for Your Shopify App Journey

This discussion really highlights a few important lessons for any developer integrating with Shopify:

  • Clarity is King: Be incredibly clear about your app's functionality and its relationship to any external SaaS billing. Document everything.
  • Proactive Proof: Don't wait for a rejection. Assume the reviewer might make assumptions and proactively address them in your submission materials, especially screencasts.
  • Persistence Pays Off: If you're confident in your app's compliance, keep pushing for specific answers and evidence from the review team. Sometimes, it truly is a misunderstanding that needs careful clarification.
  • Leverage the Community: The Shopify developer community is a goldmine of shared experiences and practical advice. Don't hesitate to ask for help or share your own insights.

It's a tough process sometimes, but seeing webriy's situation move towards a resolution with the help of community insights is incredibly encouraging. By being meticulous in how we present our apps and learning from shared experiences, we can navigate the Shopify App Review process more effectively and get our valuable tools into the hands of merchants faster.

Share:

Start with the tools

Explore migration tools

See options, compare methods, and pick the path that fits your store.

Explore migration tools