Stories

We got our connector rejected. It was the best product spec we received all year.

A marketplace review rejected our connector with roughly a dozen findings. Instead of a failure, it read like a spec — the exact definition of a production-grade third-party integration we would never have written ourselves.

Crossdeck

Summary

  • We submitted an analytics connector to a website-builder marketplace and it came back rejected, with roughly a dozen specific findings. We did not argue. We read it as a spec.
  • Every finding pointed at the same underlying rule: when you run inside someone else’s customers’ sites, you are a guest, not the owner, and you have to behave like one.
  • The reviewer had handed us, for free, the exact definition of a production-grade third-party integration we had never sat down and written for ourselves.
  • We shipped two builds off the back of it: a lean, consent-first marketplace mode and a fuller direct install, with the marketplace version honestly pointing power users toward the fuller one.

Why do apps get rejected from marketplaces?

We built a connector so a site owner could drop our analytics onto their site in a click, without touching code. We were proud of it. It worked in every test we ran. We submitted it.

It came back rejected.

The findings were specific, and they were fair. Among them: our loader pulled a remote SDK from an unpinned URL. We were reading a signed-in member’s email from the host page’s DOM and storage. Autocapture started firing before the visitor had consented. We were monkey-patching host globals, wrapping fetch and XHR to observe traffic. We shipped an iframe we did not strictly need. Our cookie scope and retention were broader than the job required. Marketing attribution was on by default.

Read individually, each one is a line item. Read together, they are a single coherent argument about what kind of software is allowed to run on other people’s sites. That argument is correct. Most apps get rejected not because the marketplace is difficult, but because the app was built as though it owned the environment it was a guest in.

First-party or third-party — what is the difference?

This is the distinction the whole story turns on, and it is the one we had not drawn sharply enough.

First-party integration

A developer installs your SDK inside their own application. They own the users, the domain and the data. When they choose to capture an email or set a cookie, they are making a decision about their own property. Full power is appropriate.

Third-party integration — a guest

You are injected, via a marketplace, into someone else’s site, serving their customers, whom you have never met and have no relationship with. You are a guest in a house you do not own, standing among people who never agreed to meet you. Minimal footprint, consent-first, and no tampering with the host are not nice-to-haves here. They are the price of admission.

Everything in the rejection maps cleanly onto that second column. Reading a member’s email from the DOM is fine when it is your own member; it is an overreach when it is a stranger’s customer on a stranger’s site. Wrapping the host’s fetch is a reasonable convenience in your own app and a violation of trust in someone else’s. The behaviours were not wrong in the abstract. They were wrong for a guest, and a mature marketplace exists precisely to enforce that line on behalf of people who cannot audit every app they install.

Why marketplace rules are actually good for you

It would be easy to frame strict review as friction. We would argue the opposite, and not to be diplomatic.

Left alone, we would never have written the document the reviewer wrote for us. We would have kept shipping the powerful version because it worked and because nobody was stopping us. The review was an expert, adversarial reading of our own product from the one perspective we structurally could not hold — the perspective of the site owner’s customer, and the site owner’s own liability. That is genuinely hard to buy. Here it arrived as an email.

So we stopped treating the rejection as a verdict and started treating it as a backlog. Each finding became a ticket. The remote loader got pinned. The email-from-DOM read got removed. Autocapture moved behind consent. The fetch and XHR wrapping came out. The iframe went. Cookie scope and retention were cut to what the job needs. Marketing attribution defaulted off. None of it was busywork; every item made the product safer to run somewhere we did not control.

How the restrictions became the reason to upgrade

Here is the part we did not expect: the constraint clarified our product line instead of narrowing it.

A guest-grade build and an owner-grade build are genuinely different products for genuinely different situations, and pretending they were the same was our original mistake. So we shipped both. Marketplace mode is the lean, compliant guest: consent-first, minimal footprint, no host tampering, pinned dependencies — the right default for someone installing analytics onto a site they built for a client. Direct install is the full first-party experience for a developer putting our SDK into their own application, where the extra power is theirs to wield.

And this matters to us: the marketplace version honestly tells users the fuller one exists, and points them to it when they have outgrown the guest footprint. The restriction did not cost us the powerful build. It gave us an honest reason to offer two, and a clean way to describe which is which.

The consent banner is the small emblem of the whole shift. The review required one. We could have shipped the flat, grudging default. Instead we made it something the site owner is happy to show their visitors, rather than a compliance tax bolted to the page. A required control became a feature.

What we learned

Submit approval-grade the first time. The guidelines are the spec — they are published before you write a line of code, and reading them as requirements rather than as fine print is the whole discipline. A rejection email should never be a surprise; if it is, it means you treated the rules as an obstacle to clear later instead of the definition of done up front. We know this because we did not do it, and the review taught us for free.

Know whether you are the owner or the guest, and build for the seat you are actually in.

We had one product doing both jobs and getting the guest job wrong. The rejection did not break our product. It finished designing it.

Building connectors that have to behave on other people’s sites?

Crossdeck ships a consent-first marketplace build and a full direct install, and tells you which one you are on.

Questions people ask

Is a marketplace rejection a sign your app is bad?
No. More often it is a sign your app was built for a context it is not running in — usually a first-party app being submitted as a third-party guest. The findings are a map from where you are to where the platform needs you to be. Treat the list as a spec, work it item by item, and resubmit.
What is the difference between a first-party and third-party integration?
A first-party integration runs inside the developer’s own app, where they own the users and the site and full data access is appropriate. A third-party integration is injected via a marketplace into someone else’s site, serving customers you have no relationship with — which calls for consent-first behaviour, a minimal footprint, and no modification of the host page.
Why do marketplaces restrict things like reading page data or modifying host code?
Because the app is a guest on sites full of people who never agreed to meet it. Reading a member’s email from the page, wrapping host functions like fetch, or setting broad cookies exposes the site owner and their visitors to risk they did not consent to. The rules protect the people the app touches, and by extension the app’s reputation.
Should you build a separate marketplace version of your product?
Often, yes. Guest-grade and owner-grade are different products for different situations. A lean, consent-first build for marketplace installs plus a fuller direct install lets each context get the right footprint — and you can honestly point users from one to the other as their needs grow.
How do you avoid getting rejected in the first place?
Read the marketplace guidelines as your build spec before you write code, not as fine print to skim before you submit. If you cannot map every capability your app uses to a rule that permits it, fix that before submitting. Aim to ship approval-grade the first time, so the review confirms your work instead of correcting it.

Every product named here is built and operated by Cross Constellation.


The lesson

The rejection did not break our product. It finished designing it.

Read next

Why we built Crossdeck — and why every product we build helps test it
We thought the App Store Connect wait was the problem. The real problem was fragmentation — the same person scattered across a dozen disconnected tools. So we put one SDK and one customer timeline underneath everything we operate.

Every product is a test environment for the one beneath it
A habit tracker on the App Store, a link-in-bio product carrying anonymous global traffic, and a book catalogue on two platforms. None of them was built to test anything. That is exactly why they work as tests.

The Firebase bill that taught us to see
A runaway Firestore read bill sent us chasing ClickHouse. The real fix was not a new database — it was being able to see where every read came from. What we learned, and why we open-sourced Buckets.

The email address you’re keying on is not the person
Why email is a fragile anchor for user identity, how keying on the wrong id forks one person into many records, and how an identity graph converges every key onto one canonical customer.

The black box blinks: seeing App Review happen in your own data
App Review is a black box. Identity-joined session data reveals when a reviewer starts testing your build, where they connect from, and the exact path they walk — plus the line we will not cross.

Why Biotree needed Crossdeck Trust — and how we stopped the SEO spam farms
Public, indexed link-in-bio pages are a magnet for spam farms and bot signups. The attack Biotree faced, why the obvious defences backfire, and the signup firewall that stopped it without punishing real users.

Why we are building Crossdeck Sales
Cold outbound is miserable because the seller is blind. We were not — we already saw who landed, what they read, and why. So we are building the tool that turns that journey into outreach that lands.