Katyayani Core — Flutter SDK

pub package platform

One SDK for your entire customer‑engagement stack. Track events & revenue, attribute installs to their source (ads / referral / organic), send rich push notifications, and show in‑app nudges — all from a single lightweight Flutter package, powered by the Katyayani Core platform.

Most apps bolt together 3–4 separate SDKs — one for analytics (Mixpanel/GA4), one for push (Netcore/Pushwoosh), one for attribution (AppsFlyer/Branch), one for referrals. Katyayani Core replaces all of them with one integration, one dashboard, and your own data.


✨ What you get

📊 Event & ecommerce analytics Strongly‑typed key‑events (viewItempurchase), custom events, funnels, revenue, product analytics.
🎯 Attribution (MMP) Auto install attribution — smart links, Play Store referrer, UTM, fingerprint. Platform‑wise revenue & ROAS.
🔗 Referral sharing Generate a referral link, auto‑capture the code on install, track who referred whom.
🔔 Rich push Standard, sticky (stays until action) and timer (live countdown) notifications.
💬 In‑app nudges Banner, modal, tooltip, slide‑in, bottom‑sheet, full‑screen — configured from the dashboard.
🆔 Identity & profiles Stitch anonymous → identified users, set user attributes, cross‑platform dedup.

🆚 How it compares

Capability Katyayani Core Netcore Pushwoosh
Event & ecommerce analytics ✅ built‑in ⚠️ limited
Rich push (sticky + timer countdown) ⚠️ partial ⚠️ rich media only
In‑app nudges / messages
Install + referral attribution (MMP) ✅ built‑in ❌ needs AppsFlyer/Branch ❌ needs 3rd‑party
Referral link generation in‑SDK
Platform‑wise revenue / ROAS ⚠️ add‑on
Single SDK for all of the above
Own your data (self‑hosted backend) ❌ SaaS ❌ SaaS

Netcore & Pushwoosh are excellent engagement platforms — but they focus on messaging. Katyayani Core adds attribution + referral + revenue in the same SDK, so you don't stitch together an MMP and an analytics tool on the side.


🔑 Get an API key

You need a Katyayani Core API key (nc_live_…) to send data.

📧 Request one — email us: support@katyayaniorganics.com

Clicking the link opens your email app with a ready‑to‑send request (just fill the blanks and hit send — it comes straight to our team). Prefer a form? Request via form » — fill it in and it lands directly in our team's inbox.


📦 Installation

# pubspec.yaml
dependencies:
  katyayani_core: ^2.0.1
flutter pub get

⚙️ Setup (3 steps)

Step 1 — Initialize the SDK

import 'package:katyayani_core/katyayani_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await KatyayaniCore.init(KCConfig(
    siteId: 'nc_live_your_api_key',              // from support@katyayaniorganics.com
    apiBase: 'https://your-katyayani-core-host',
    enablePush: false,                           // set true ONLY if Firebase is configured (Step 3)
  ));

  runApp(const MyApp());
}

No Firebase in your app? Keep enablePush: false. Everything else (analytics, attribution, referral) works without Firebase. Setting it true without Firebase will stop the SDK from initializing.

MaterialApp(
  navigatorObservers: [KCNavigationObserver()],  // auto screen_view + nudge checks
);

Step 3 — (Optional) Push notifications — needs Firebase

  1. Add google-services.json (Android) / GoogleService-Info.plist (iOS). See Firebase Flutter setup.
  2. Set enablePush: true in KCConfig.
  3. Android — add to android/app/src/main/AndroidManifest.xml:
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    
  4. Ask for permission at a good moment: await KatyayaniCore.requestPushPermission();

🆔 Identify users & set attributes

Call identify() after login. This is how you set user attributes — there is no separate method.

KatyayaniCore.identify('+916261414316', traits: {
  'phone': '+916261414316',   // → phone column (needed for Users search)
  'email': 'ram@example.com', // → email column
  'name': 'Ram Kumar',        // auto‑split into first/last name
  'city': 'Indore',           // any other key → custom attribute
  'plan': 'premium',
});

KatyayaniCore.resetIdentity();  // on logout

Steps: (1) user logs in → (2) call identify(userId, traits) → (3) profile appears in the Users dashboard, searchable by phone/email. Call again anytime to update attributes.


📈 Events reference — every event explained

Custom events

KatyayaniCore.track('coupon_applied', properties: {'code': 'SAVE10', 'value': 50});
KatyayaniCore.screenView('/products/humic-acid');

What / when: any app action you want to measure. Fires an analytics event with your properties.

Ecommerce key‑events (strongly typed)

Line items use the typed KCItem (sku, qty, rate are required). value auto‑computes from items (Σ qty×rate) if you omit it. params accepts any custom key‑values.

final items = [
  KCItem(
    sku: 'SKU-NEEM-1L', qty: 2, rate: 499,        // required
    name: 'Neem Oil 1L',
    category: 'Pesticides',
    subCategory: 'Organic',
    otherCategories: ['Kharif', 'Bestseller'],     // → other_category_1, other_category_2 … n
    extra: { 'hsn': '3808', 'batch': 'B-2607' },   // any extra item fields
  ),
];
Event What it means / when to call Example
viewItem User opened a product page KatyayaniCore.viewItem(items: items);
addToCart Item added to cart KatyayaniCore.addToCart(items: items);
removeFromCart Item removed from cart KatyayaniCore.removeFromCart(items: items);
viewCart Cart screen opened KatyayaniCore.viewCart(items: items);
beginCheckout Checkout started KatyayaniCore.beginCheckout(items: items, coupon: 'SAVE10');
addPaymentInfo Payment method chosen KatyayaniCore.addPaymentInfo(items: items, paymentType: 'UPI');
purchase Order placed (drives Revenue) see below
refund Order refunded KatyayaniCore.refund(transactionId: 'ORD-016', items: items);
// The full purchase — step at your order-success screen:
KatyayaniCore.purchase(
  transactionId: 'ORD-016',
  items: items,
  tax: 70, shipping: 50, coupon: 'SAVE10',
  params: { 'salesman_id': 'EMP-42', 'payment_mode': 'COD', 'farm_size_acre': 12 },
);
// ALSO attribute the revenue to the acquisition source (for ROAS):
KatyayaniCore.capturePayment(1497, orderId: 'ORD-016');

Typical funnel order: viewItemaddToCartbeginCheckoutaddPaymentInfopurchase (+ capturePayment). The dashboard builds the funnel automatically.

Engagement key‑events

KatyayaniCore.search(searchTerm: 'neem oil');
KatyayaniCore.signUp(method: 'phone');   // step: right after signup completes
KatyayaniCore.login(method: 'otp');

🎯 Attribution — where users come from

Source (ads / referral / organic) is detected automatically on first open. You only mark conversions and revenue:

KatyayaniCore.trackAttribution('signup');           // funnel milestone, tied to the acquired source
KatyayaniCore.capturePayment(1497, orderId: 'ORD1'); // revenue → source (Revenue/ROAS page)

// deferred deep link from the smart link the user came from
KatyayaniCore.onDeferredDeepLink((route, attr) {
  navigatorKey.currentState?.pushNamed(route);
});

🔗 Referral sharing

// 1) Referrer shares a link:
final url = await KatyayaniCore.generateReferralLink(
  myReferralCode,
  referrerId: currentUserId,
  androidStoreUrl: 'https://play.google.com/store/apps/details?id=com.myapp', // required
);
Share.share('Join with my code: $url');

// 2) New user installs → code auto‑arrives:
KatyayaniCore.onReferral((code, params) {
  referralField.text = code;                 // auto‑fill
});

// 3) After signup, lock it to the real user:
KatyayaniCore.confirmReferral(code, referrerId: params['referrerId']);

Steps: referrer taps RefergenerateReferralLink → share URL → friend installs → your app gets the code via onReferralconfirmReferral on signup. The dashboard shows who referred whom.


🔔 Push notifications

// Standard — normal push
KatyayaniCore.showNotification(KCNotification(
  id: 'promo_1', title: 'New Offer!', body: 'Neem Oil at ₹399', actionUrl: '/products/neem-oil',
));

// Sticky — stays until dismissed / action taken
KatyayaniCore.showNotification(KCNotification(
  id: 'order_1', title: '🛒 Order Processing', body: 'Being packed',
  type: KCNotificationType.sticky, ongoing: true,
  buttons: [KCNotificationButton(id: 'track', label: 'Track', deepLink: '/orders/1')],
));

// Timer — live countdown, auto‑action on expiry
KatyayaniCore.showNotification(KCNotification(
  id: 'sale_1', title: '⏰ Flash Sale!', body: '50% off',
  type: KCNotificationType.timer, timerDurationSeconds: 300, timerText: 'Ends in {timer}',
  timerAction: KCTimerAction.showFollowUp, timerActionPayload: 'Sale ended — 20% off instead.',
));

// React to taps
KatyayaniCore.onNotificationAction((n, action) { /* clicked / dismissed / timerExpired … */ });
KatyayaniCore.onNotificationButtonAction((n, buttonId) { /* handle button */ });

Timer actions on expiry: dismiss · openUrl · showFollowUp · triggerNudge.


💬 In‑app nudges

Six types configured from the dashboard: banner, modal, tooltip, slideIn, bottomSheet, fullScreen.

KatyayaniCore.checkNudges(context, '/home');   // or automatically via KCNavigationObserver
KatyayaniCore.dismissAllNudges();

🧹 Cleanup

@override
void dispose() {
  KatyayaniCore.dispose();
  super.dispose();
}

💛 Support & API keys

Made with 💛 by Katyayani Organics.

Libraries

katyayani_core
Katyayani Core Flutter SDK Push notifications (standard, sticky, timer), nudges, event tracking