Cart Revive · Shopify App Review

Proof of Resolution — Analytics Dashboard

Status: Resolved

Reported: The app dashboard showed $0 recovered revenue even after a Cart Revive recovery email was sent and the customer completed payment.

Root cause

Attribution flagged an order as a Cart Revive recovery only when the returning Shopify order carried BOTH source_name of draft_order / shopify_draft_order AND a populated source_identifier matching the draft GID we created.

In practice Shopify sometimes returns source_identifier: null on orders completed through a draft invoice, so the GID lookup failed and the recovery was silently skipped. The abandoned checkout stayed marked sent and no row was written to recovered_orders, which is what the dashboard aggregates.

Fix

Every draft order Cart Revive creates is tagged cart-revive. That tag is now treated as an authoritative recovery signal whenever Shopify reports a draft-order source, even if source_identifier is missing. In that fallback path the returning order is linked back to the most recent sent abandoned checkout for the same customer email in the same shop.

Both the real-time orders/create and orders/updated webhooks and the 5-minute reconcile-orders safety-net cron share the same attribution module, so previously missed orders are backfilled on the next cron run.

Files changed

  • src/lib/orders-attribution.server.ts — added the tag-based draft-recovery fallback used by both order webhooks.
  • src/routes/api/public/hooks/reconcile-orders.ts — same fallback in the reconciliation cron.

Verification steps

  1. Reproduced on a test store: recovery email sent for a $121.44 abandoned checkout; customer completed payment through the draft invoice (Shopify order #1102).
  2. Confirmed via Shopify Admin API that the returning order had source_name = "shopify_draft_order", source_identifier = null, and tag cart-revive.
  3. With the updated attribution logic, the order is now written to recovered_orders and the linked abandoned checkout is marked recovered.
  4. The dashboard tiles (Total recovered revenue, Recovered (range), Recovery rate) and the 30-day chart update on the next load.
Last updated: 2026-11-02 · Cart Revive engineering
Cart Revive · Shopify App Review

Proof of Resolution — Pricing Alignment (Guideline 4.2.1)

Status: Resolved

Reported: Guideline 4.2.1 — pricing on the Shopify App Store listing did not match the pricing shown inside the app UI. Reviewer noted the two Performance and Growth plans presented in the app were not both reflected on the listing.

Root cause

The App Store listing previously advertised only one pricing tier, while the in-app plan selection screen (/app/onboarding) offers two plans:

  • Performance — 5% of recovered revenue, capped at $5,000 per 30 days (usage-based, billed via Shopify Billing).
  • Growth — Flat $200 / month, unlimited recovery emails.

All charges are billed in USD via Shopify Billing on a 30-day recurring cycle. There is no free trial.

Fix

The Shopify App Store listing has been updated so its Pricing section now declares both plans with the exact same names, prices, units, and terms shown in-app:

  • Performance — 5% of recovered revenue, capped at $5,000 / 30 days.
  • Growth — $200 / month, unlimited recovery emails.
  • Disclosure added: "All charges are billed in USD. Recurring and usage-based charges are billed every 30 days. No free trial."

The in-app onboarding screen at /app/onboarding remains the single source of truth and now matches the listing verbatim.

Verification steps

  1. Open the updated listing preview and confirm both Performance (5%) and Growth ($200/month) plans are shown with matching copy.
  2. Install the app on a development store and open /app/onboarding. Both plans appear with identical names, prices, and terms as on the listing.
  3. Select either plan and confirm the redirect leads to Shopify's standard Approve subscription screen where Shopify itself restates the price before charging.