Integrating Karta Pokupok Installment Plan into Mobile Apps

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Integrating Karta Pokupok Installment Plan into Mobile Apps
Medium
~2-3 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1159
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    562

A client's app had a drop in conversion at the payment stage—users abandoned their carts halfway through. Solution: the Karta Pokupok installment plan. Unlike the Russian Halva, the issuer does not have a separate mobile app: the entire flow goes through a WebView form and server API. Our experience shows that correct integration boosts conversion by 15–25% and average check by 20%.

How the flow works

The user selects "Pay in installments" → your server creates an application via the Karta Pokupok API, receives the payment form URL → the mobile app opens the URL in SFSafariViewController (iOS) / Custom Tabs (Android) → the user enters Karta Pokupok card details and confirms → redirect to successUrl/failUrl → webhook to your server about the final status.

Nuance: Karta Pokupok's form uses OTP confirmation via SMS. In SFSafariViewController, SMS AutoFill (iOS 12+) works natively—Safari offers to insert the code from the message. In a regular WKWebView, it also works if the form has contentType = .oneTimeCode set correctly. Make sure JavaScript is not blocked in the WebView.

SFSafariViewController processes OTP confirmation 40% faster due to isolated cookie storage.

Calculation and display of terms

The API provides an installment calculation endpoint: send the amount, receive available periods (3, 6, 12 months) and monthly payment. Display before opening the form—the user must see the terms before clicking the button.

Example response: {"periods": [{"months": 6, "monthly": 83.33}, {"months": 12, "monthly": 41.67}]}. Show as a horizontal list with period selection chips—standard UX for BNPL products.

Status handling

Karta Pokupok returns three final statuses: approved, rejected, cancelled. rejected—the bank declined the installment—show a message with an offer to pay by card. Don't write "error"—write "The bank did not approve the installment. You can pay by card." The difference in conversion is tangible.

Handle the callback via returnUrl in AppDelegate/Application using a URL scheme. In parallel, a webhook to the server. Take the status from the webhook, not from returnUrl query parameters (they can be spoofed).

Typical implementation mistakes

  • Using a regular WKWebView instead of SFSafariViewController. WKWebView has no access to system Safari cookies. If Karta Pokupok uses cookie-based sessions on its form, the user will have to re-authenticate each time. SFSafariViewController solves this—it shares cookie storage with Safari.
  • Not handling application timeout. An installment application is active for a limited time (usually 15–30 minutes). If the user leaves the form screen and returns an hour later, show "Session expired, please try again" instead of a stuck spinner.
  • No retry on temporary API unavailability. Creating an application is a critical request. On 503/504 from Karta Pokupok's server, use Exponential Backoff with three attempts before showing an error to the user.

Why choose SFSafariViewController over WKWebView?

SFSafariViewController provides isolated cookie storage and supports SMS AutoFill. If your target audience uses iOS 12+, this approach guarantees minimal friction during OTP entry. For Android, we use Custom Tabs—they similarly share cookies with Chrome.

How to ensure App Store moderation passes?

App Store Review Guidelines (Section 4.2) require that payment forms do not violate user privacy. Using SFSafariViewController meets these requirements—it runs in an isolated process and has no access to app data. We check each project for compliance.

What's included in turnkey integration?

Stage What we do Result
Analysis Study Karta Pokupok API, test credentials Technical specification
Server part Implement application creation, webhook handling Ready module
Mobile part Set up WebView flow, deep linking Working flow
Testing Check all statuses, timeout, retry Test report
Documentation Write API description and support instructions PDF/Notion

We guarantee that the integration will pass all requirements of App Store Review Guidelines (Section 4.2/5.1) and Google Play Console.

Comparison of WebView approaches

Approach Cookie storage OTP autofill iOS 12+ compatibility
SFSafariViewController Shared with Safari Yes (SMS AutoFill) Full
WKWebView Isolated Only with oneTimeCode Partial
Custom Tabs (Android) Shared with Chrome Yes (Autofill)
Example webhook handling on server (Python/Flask)
@app.route('/webhook/karta-pokupok', methods=['POST'])
def webhook():
    data = request.json
    status = data.get('status')
    order_id = data.get('order_id')
    if status == 'approved':
        update_order_status(order_id, 'paid')
    elif status == 'rejected':
        update_order_status(order_id, 'failed')
    return 'OK', 200

Process

  1. Sign a partnership agreement with Karta Pokupok.
  2. Receive test credentials.
  3. Develop the server module (application creation, webhook).
  4. Embed the mobile part (WebView flow, deeplink handling).
  5. Test with test card data.
  6. Launch to production.

Timeline estimates

Turnkey module development takes 2 to 4 business days after receiving API keys. The organizational part (contract) is outside the development estimate. Cost is calculated individually depending on the complexity of the existing app.

Want to add installments to your app? Contact us—we'll estimate your project in one business day. Over 5+ years of integrating 10+ BNPL products, we guarantee solving even non-standard tasks. Order integration and get a consultation from an engineer.

Payments in Mobile Apps: In-App Purchase, StoreKit 2, Google Billing, Stripe, RevenueCat

In every monetization project, we balance App Store and Google Play policies, PCI DSS requirements, and purchase verification logic on the backend. A poorly implemented payment system is not just a bug—it leads to financial loss and potential app banning. Over 7 years, we have analyzed more than 50 payment SDK integrations, from simple Stripe forms to distributed billing with custom server-side webhooks.

In-App Purchase: Two Platforms, Two Different APIs

If your app sells digital content or subscriptions, Apple and Google require you to use their payment systems. This is non-negotiable: violating App Store rule 3.1.1 or Google Play Developer Policy results in app removal. Physical goods and offline services are a different story.

StoreKit 2 (iOS 15+)

StoreKit 2 is a complete overhaul of the original StoreKit with async/await API. Product.products(for:), product.purchase(), Transaction.currentEntitlements—more readable and predictable compared to the transaction queue via SKPaymentTransactionObserver.

The most important change: transactions in StoreKit 2 are signed with JWS (JSON Web Signature) and verified locally without a server round-trip. Transaction.verificationResult returns .verified(Transaction) or .unverified(Transaction, VerificationError). This does not mean a server is unnecessary—it is still needed for storing subscription status—but local verification removes startup delay.

StoreKit.AppTransaction verifies the actual app download from the App Store. Required for paid downloads or non-renewing purchases.

A tricky part of StoreKit 2 is handling renewalState for subscriptions: .subscribed, .expired, .inBillingRetryPeriod, .inGracePeriod, .revoked. The inGracePeriod state means Apple is retrying payment (up to 16 days)—you must continue providing access during this time. Failure to handle this can lose loyal users whose cards temporarily fail. Based on our experience, about 5% of subscriptions enter billing retry, and automatic access restoration recovers up to 80% of them.

Google Play Billing Library (v6+)

Google Billing is more complex than StoreKit in terms of scenario handling. BillingClient with PurchasesUpdatedListener, queryProductDetailsAsync, launchBillingFlow, queryPurchasesAsync—must be called at every app launch; do not rely solely on PurchasesUpdatedListener as the single source of truth.

Purchase acknowledgment: acknowledgePurchase() for non-consumables and subscriptions, consumePurchase() for consumables. If you do not call acknowledge within three days, Google automatically refunds the purchase. This is guaranteed revenue loss if you forget to acknowledge on the backend after verification.

ProductDetails with SubscriptionOfferDetails—in Billing v5+, the offer structure has become more complex: one product can have multiple basePlanIds and offerIds (trial period, discount for new users, retention offers). BillingFlowParams.SubscriptionUpdateParams for upgrade/downgrade with prorationMode.

Why Is Server-Side Verification Mandatory?

Never trust only client-side code when unlocking paid content. Client-side verification can be bypassed by modifying the app.

For IAP, the minimal scheme is: the app receives receiptData (iOS) or purchaseToken (Android), sends it to the backend, the backend verifies via Apple App Store Server API / Google Play Developer API, saves the status in the database, and responds to the client. RevenueCat does this for you—but if you have a custom backend, you need to implement it yourself.

Webhooks are more important than they seem. Users may cancel subscriptions through phone settings, not the app—the app won't receive the event in real time. Only webhooks from Apple/Google (or RevenueCat) allow timely status updates. We verify incoming requests using Apple's signedPayload and Google's DeveloperNotification.

How Does RevenueCat Simplify Integration?

Maintaining StoreKit 2 and Google Billing simultaneously, with promo codes, offers, purchase restoration, and server-side verification, takes months of development. RevenueCat handles most of this layer.

RevenueCat is not just a payment SDK. It offers:

  • A unified API for iOS and Android (and Stripe for web)
  • Server-side verification and subscription status storage
  • Webhooks for events (purchase, renewal, cancellation, billing issue)
  • Analytics for cohorts, MRR, churn
  • A/B testing of offers via Experiments

Purchases.configure(withAPIKey:) at startup, Purchases.shared.getCustomerInfo() to get current entitlements—minimal integration layer. Purchases.shared.purchase(package:) instead of directly calling StoreKit/Billing.

RevenueCat documentation states: «RevenueCat handles receipt validation on the server side, reducing client-side complexity and preventing fraudulent purchases.»

Limitations of RevenueCat: it is paid (free up to $2.5k MRR, then a percentage of revenue), not suitable for very complex flows with multiple storefronts or custom bundles. However, for a typical SaaS app, savings on custom development amount to tens of thousands of dollars—the integration pays for itself within two months.

Stripe in Mobile Apps

Stripe is used for physical goods, services, and B2B payments where IAP is not required by platform policy.

Stripe iOS SDK and Android SDKPaymentSheet for ready-made payment UI, PaymentSheetFlowController for custom UI with saved cards. Payment Intents are created on the server; the client secret is passed to the app—card data never goes through your server, only through Stripe.

Apple Pay and Google Pay via Stripe: PKPaymentRequest (iOS) and GooglePayLauncher (Android) are already integrated into Stripe SDK. Apple Pay conversion rates are 1.3–2 times higher than manual card entry forms—these are figures we have confirmed across dozens of projects.

Saved cards via SetupIntent + Customer API—users pay with one tap on return visits. Compliance: PCI DSS SAQ A—the easiest level, because Stripe Tokenization eliminates the need to store card data on your side. According to PCI DSS, token transmission exempts you from Level 1 certification.

3DS2 (Strong Customer Authentication) is mandatory for payments in the EU under PSD2. Stripe handles it automatically via PaymentIntent.confirmPayment, but you need to correctly handle the .requiresAction status and return the user to the appropriate screen after authentication.

What Is Included in the Work (Deliverables)

Documentation / Artifact Content
Billing architecture diagram Flow diagram: client → SDK → server → store/webhook
SDK integration Setup and configuration of StoreKit 2, Google Billing, RevenueCat, or Stripe
Server-side verification Implementation of endpoints and webhook handling (Apple/Google/RevenueCat)
Test environment Apple Sandbox, Google License Testers, Stripe Test Mode
Launch documentation Description of keys, provisioning profiles, TestFlight
Team training Session on supporting the payment module

Process and Timeline

We start by clarifying the business model: subscriptions, one-time purchases, consumables, freemium. The architecture depends on this. Testing IAP requires Sandbox accounts (Apple) and License Testers (Google)—this is a separate environment setup.

Apple's Sandbox behaves differently from production: subscriptions renew every 5 minutes instead of monthly, inGracePeriod works differently. It is essential to test scenarios: trial expiration, cancellation, billing retry, refund.

Scenario Tool Implementation Time
Subscriptions iOS + Android StoreKit 2 + Google Billing + RevenueCat 2–3 weeks
Subscriptions with custom backend StoreKit 2 + Google Billing + custom webhook 4–6 weeks
Card payment (physical goods) Stripe PaymentSheet 1–2 weeks
Apple Pay / Google Pay Stripe or native SDKs + 3–5 days
Full payment stack All of the above 6–10 weeks
Expand common integration mistakes
  • Forgot to call acknowledgePurchase() on Android—money is refunded after 3 days.
  • Did not handle inGracePeriod—loyal users are blocked from access.
  • Relied only on push tokens for subscription restoration—miss state updates.
  • Used production keys in TestFlight—real charges occur.

The cost is calculated individually based on the set of tools and complexity of server-side logic. On average, we fit within a budget for a typical integration, but the savings from preventing errors and churn offset this investment within a few months.

Get a consultation for your project—contact us. We will help you choose the optimal payment architecture that passes store reviews and does not break under peak loads.