Building Custom Shopify Apps with Remix and Polaris

Complete developer guide to building custom Shopify apps using Remix, Shopify CLI 3, Polaris design system, and App Bridge for embedded admin experiences.

E
ECOSIRE Research and Development Team
|19 مارچ، 202612 منٹ پڑھیں2.7k الفاظ|

ریمکس اور پولارس کے ساتھ حسب ضرورت شاپائف ایپس بنانا

Shopify کی ریمکس پر منتقلی بطور ڈیفالٹ ایپ فریم ورک ایک بنیادی تبدیلی کی نشاندہی کرتی ہے کہ پلیٹ فارم پر پروڈکشن ایپس کیسے بنتی ہیں۔ ریمکس پر مبنی Shopify ایپ ٹیمپلیٹ سرور سائیڈ رینڈرنگ، سٹریمنگ، نیسٹڈ روٹنگ، اور مقامی Shopify CLI انضمام کو ایک ہی مربوط اسٹیک میں فراہم کرتا ہے — پرانے نوڈ/ایکسپریس + ری ایکٹ پیٹرن کی جگہ لے کر جو 2023 تک ایپ کی ترقی پر غالب رہے۔

یہ گائیڈ مکمل ڈیولپمنٹ لائف سائیکل سے گزرتا ہے: سہاروں، توثیق، گراف کیو ایل ڈیٹا کی بازیافت، پولارس اجزاء کا انضمام، ویب ہکس، بلنگ، اور وہ نمونے جن کا تجربہ Shopify ڈویلپرز قابل برقرار، پرفارمنٹ ایمبیڈڈ ایپس بھیجنے کے لیے استعمال کرتے ہیں۔

اہم ٹیک ویز

  • Shopify CLI 3.x OAuth، سیشن اسٹوریج، اور ایپ برج پہلے سے ترتیب شدہ کے ساتھ ایک پروڈکشن کے لیے تیار ریمکس ایپ تیار کرتا ہے۔
  • authenticate.admin مددگار پورے OAuth کے بہاؤ کو سنبھالتا ہے — OAuth کو دستی طور پر لاگو نہ کریں
  • ریمکس کا لوڈر/ایکشن پیٹرن بالکل شاپائف کی گراف کیو ایل کی درخواست/میوٹیشن سائیکل پر نقشہ بناتا ہے
  • ایپ اسٹور کی منظوری کے لیے پولارس کے اجزاء درکار ہیں — اپنی مرضی کے مطابق UI جو پولارس کے معیارات کو نظر انداز کرتا ہے وہ جائزہ لینے میں ناکام رہتا ہے
  • ویب ہکس کو ایپ کنفیگریشن کے ذریعے رجسٹر کیا جانا چاہیے، نہ صرف API کالز، بھروسے کے لیے
  • Shopify Admin GraphQL API صفحہ بندی ہے — ڈیٹا لوڈرز میں ہمیشہ کرسر پر مبنی صفحہ بندی کو ہینڈل کریں
  • ایپ برج کروم سے کم ایمبیڈڈ تجربہ فراہم کرتا ہے۔ نیویگیشن کے لیے useAppBridge ہک استعمال کریں۔
  • سبسکرپشن فیس چارج کرنے والی کسی بھی ایپ کے لیے بلنگ API انٹیگریشن درکار ہے۔

پروجیکٹ سیٹ اپ اور اسکافولڈنگ

مناسب طریقے سے کنفیگر شدہ ریمکس ایپ کو اسکافولڈ کرنے کے لیے Shopify CLI 3 کے ساتھ شروع کریں:

npm install -g @shopify/cli@latest
shopify app create node --template remix
cd your-app-name

تیار کردہ سہاروں میں شامل ہیں:

  • remix.config.js Shopify کے موافق ترتیبات کے ساتھ
  • shopify.app.toml — آپ کی ایپ کنفیگریشن فائل (ایپ کی ترتیبات کے لیے .env کو بدل دیتی ہے)
  • app/shopify.server.ts - مرکزی تصدیق اور API کلائنٹ کنفیگریشن
  • app/routes/app.tsx — روٹ ایمبیڈڈ ایپ لے آؤٹ
  • prisma/schema.prisma — SQLite سیشن اسٹوریج (پروڈکشن کے لیے PostgreSQL سے بدلیں)

shopify.app.toml ڈھانچہ:

name = "your-app-name"
client_id = "your-api-key"
application_url = "https://your-app-url.com"
embedded = true

[access_scopes]
scopes = "read_products,write_products,read_orders"

[auth]
redirect_urls = ["https://your-app-url.com/auth/callback"]

[webhooks]
api_version = "2025-01"

  [[webhooks.subscriptions]]
  topics = ["app/uninstalled"]
  uri = "/webhooks"

authenticate.admin کے ساتھ توثیق

shopify.server.ts فائل ایک authenticate آبجیکٹ برآمد کرتی ہے جو تصدیق کے تمام خدشات کو سنبھالتی ہے۔ کبھی بھی OAuth کو دستی طور پر لاگو نہ کریں — authenticate.admin مددگار پورے بہاؤ کا انتظام کرتا ہے بشمول:

  • OAuth کوڈ کا تبادلہ
  • سیشن استقامت
  • ٹوکن ریفریش
  • آن لائن بمقابلہ آف لائن رسائی کے طریقوں
  • مرچنٹ کی رضامندی کا مجموعہ

روٹ لوڈرز میں توثیق کا استعمال کرتے ہوئے:

// app/routes/app.products.tsx
import { json } from "@remix-run/node";
import { authenticate } from "../shopify.server";

export const loader = async ({ request }: LoaderFunctionArgs) => {
  const { admin, session } = await authenticate.admin(request);

  const response = await admin.graphql(`
    #graphql
    query GetProducts($first: Int!) {
      products(first: $first) {
        nodes {
          id
          title
          status
          priceRangeV2 {
            minVariantPrice {
              amount
              currencyCode
            }
          }
          totalInventory
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  `, {
    variables: { first: 50 }
  });

  const data = await response.json();
  return json({ products: data.data.products });
};

آن لائن بمقابلہ آف لائن سیشن:

  • آف لائن رسائی: زیادہ تر ایپس کے لیے ڈیفالٹ۔ سیشن مرچنٹ لاگ ان کے آزادانہ طور پر برقرار رہتا ہے۔ بیک گراؤنڈ جابز، ویب ہکس، طے شدہ کاموں کے لیے استعمال کیا جاتا ہے۔
  • آن لائن رسائی: سیشن لاگ ان کردہ مرچنٹ صارف سے منسلک ہے۔ اس وقت درکار ہوتا ہے جب آپ کو کسی مخصوص صارف کی جانب سے کارروائی کرنے کی ضرورت ہوتی ہے (مثلاً، یہ معلوم کرنا کہ عملے کے کس رکن نے کارروائی کی)۔

shopify.server.ts میں ترتیب دیں:

const shopify = shopifyApp({
  apiKey: process.env.SHOPIFY_API_KEY!,
  apiSecretKey: process.env.SHOPIFY_API_SECRET!,
  scopes: process.env.SCOPES!.split(","),
  appUrl: process.env.SHOPIFY_APP_URL!,
  authPathPrefix: "/auth",
  sessionStorage: new PrismaSessionStorage(prisma),
  distribution: AppDistribution.AppStore,
  future: {
    unstable_newEmbeddedAuthStrategy: true, // Token Exchange (2024+)
  },
});

ٹوکن ایکسچینج (2026 کے لیے تجویز کردہ)

Shopify کی نئی ٹوکن ایکسچینج کی توثیق کی حکمت عملی ایمبیڈڈ ایپس کے لیے OAuth ری ڈائریکٹ کو ختم کرتی ہے۔ Shopify ایڈمن کے اندر موجود صارفین کو چھوڑنے اور واپس آنے کی ضرورت نہیں ہے — ایپ برج سے سیشن ٹوکن کا تبادلہ براہ راست API رسائی ٹوکن سرور سائیڈ کے لیے کیا جاتا ہے۔ اسے unstable_newEmbeddedAuthStrategy: true کے ساتھ فعال کریں۔


گراف کیو ایل ڈیٹا حاصل کرنے کے پیٹرنز

Shopify کا ایڈمن API GraphQL-پہلا ہے۔ پیداواری معیار کے ڈیٹا کی بازیافت کے لیے ان نمونوں پر عبور حاصل کریں۔

کرسر پر مبنی صفحہ بندی:

export async function getAllProducts(admin: AdminApiContext) {
  let hasNextPage = true;
  let cursor: string | null = null;
  const allProducts = [];

  while (hasNextPage) {
    const response = await admin.graphql(`
      #graphql
      query GetProducts($first: Int!, $after: String) {
        products(first: $first, after: $after) {
          nodes {
            id
            title
            handle
          }
          pageInfo {
            hasNextPage
            endCursor
          }
        }
      }
    `, {
      variables: { first: 250, after: cursor }
    });

    const data = await response.json();
    const { nodes, pageInfo } = data.data.products;

    allProducts.push(...nodes);
    hasNextPage = pageInfo.hasNextPage;
    cursor = pageInfo.endCursor;
  }

  return allProducts;
}

** خرابی سے نمٹنے کے ساتھ تغیرات**:

export const action = async ({ request }: ActionFunctionArgs) => {
  const { admin } = await authenticate.admin(request);
  const formData = await request.formData();

  const title = formData.get("title") as string;
  const price = formData.get("price") as string;

  const response = await admin.graphql(`
    #graphql
    mutation CreateProduct($input: ProductInput!) {
      productCreate(input: $input) {
        product {
          id
          title
        }
        userErrors {
          field
          message
        }
      }
    }
  `, {
    variables: {
      input: {
        title,
        variants: [{ price }]
      }
    }
  });

  const data = await response.json();

  if (data.data.productCreate.userErrors.length > 0) {
    return json({
      errors: data.data.productCreate.userErrors
    }, { status: 422 });
  }

  return json({ product: data.data.productCreate.product });
};

بڑے ڈیٹاسیٹس کے لیے بلک آپریشن:

ہزاروں ریکارڈز پر کارروائیوں کے لیے، صفحہ بندی کے سوالات کے بجائے بلک آپریشن API کا استعمال کریں۔ بلک سوالات متضاد طور پر چلتے ہیں اور JSONL فائل واپس کرتے ہیں:

const bulkQuery = await admin.graphql(`
  mutation {
    bulkOperationRunQuery(
      query: """
        {
          products {
            edges {
              node {
                id
                title
                variants {
                  edges {
                    node {
                      id
                      price
                      inventoryQuantity
                    }
                  }
                }
              }
            }
          }
        }
      """
    ) {
      bulkOperation {
        id
        status
      }
      userErrors {
        field
        message
      }
    }
  }
`);

پول currentBulkOperation تک status === "COMPLETED"، پھر JSONL کو url سے ڈاؤن لوڈ اور پارس کریں۔


پولارس ڈیزائن سسٹم انٹیگریشن

پولاریس ایمبیڈڈ ایپس کے لیے Shopify کا ڈیزائن سسٹم ہے۔ ایپ اسٹور کی جمع آوریوں کے لیے پولاریس کا استعمال ضروری ہے — نان پولاریس UI کے نتیجے میں نظرثانی کو مسترد کردیا جائے گا۔

ریمکس میں پولارس کو ترتیب دینا:

// app/root.tsx
import { AppProvider } from "@shopify/polaris";
import "@shopify/polaris/build/esm/styles.css";
import translations from "@shopify/polaris/locales/en.json";

export default function App() {
  return (
    <AppProvider i18n={translations}>
      <Outlet />
    </AppProvider>
  );
}

** شاپائف ایپس کے لیے عام پولارس اجزاء کے نمونے**:

// Product listing with DataTable
import {
  Page,
  Card,
  DataTable,
  Button,
  Badge,
  Filters,
  EmptyState
} from "@shopify/polaris";

export default function ProductsPage() {
  const { products } = useLoaderData<typeof loader>();

  const rows = products.nodes.map(product => [
    product.title,
    <Badge tone={product.status === 'ACTIVE' ? 'success' : 'warning'}>
      {product.status}
    </Badge>,
    product.totalInventory,
    `${product.priceRangeV2.minVariantPrice.currencyCode} ${product.priceRangeV2.minVariantPrice.amount}`,
    <Button url={`/app/products/${product.id}`}>Edit</Button>
  ]);

  return (
    <Page
      title="Products"
      primaryAction={{ content: "Add product", url: "/app/products/new" }}
    >
      <Card>
        <DataTable
          columnContentTypes={['text', 'text', 'numeric', 'numeric', 'text']}
          headings={['Title', 'Status', 'Inventory', 'Price', 'Actions']}
          rows={rows}
        />
      </Card>
    </Page>
  );
}

پولارس اور ریمکس کے ساتھ فارم ہینڈلنگ:

import { Form, useNavigation, useActionData } from "@remix-run/react";
import { TextField, Select, FormLayout, Banner } from "@shopify/polaris";

export default function ProductForm() {
  const actionData = useActionData<typeof action>();
  const navigation = useNavigation();
  const isSubmitting = navigation.state === "submitting";

  return (
    <Form method="post">
      <FormLayout>
        {actionData?.errors && (
          <Banner tone="critical">
            {actionData.errors.map(e => <p key={e.field}>{e.message}</p>)}
          </Banner>
        )}
        <TextField
          label="Product title"
          name="title"
          autoComplete="off"
        />
        <TextField
          label="Price"
          name="price"
          type="number"
          prefix="$"
          autoComplete="off"
        />
        <Button submit loading={isSubmitting}>Save product</Button>
      </FormLayout>
    </Form>
  );
}

ویب ہکس: رجسٹریشن اور پروسیسنگ

قابل اعتماد ویب ہک ہینڈلنگ ان ایپس کے لیے اہم ہے جو مرچنٹ اسٹور کے واقعات پر ردعمل ظاہر کرتی ہیں۔

بذریعہ ویب ہکس کا اندراج shopify.app.toml:

[[webhooks.subscriptions]]
topics = ["products/create", "products/update", "products/delete"]
uri = "/webhooks"

[[webhooks.subscriptions]]
topics = ["orders/create"]
uri = "/webhooks/orders"

ریمکس روٹ میں ویب ہکس پر کارروائی کرنا:

// app/routes/webhooks.tsx
import { authenticate } from "../shopify.server";
import db from "../db.server";

export const action = async ({ request }: ActionFunctionArgs) => {
  const { topic, shop, session, payload } = await authenticate.webhook(request);

  switch (topic) {
    case "PRODUCTS_CREATE":
      await db.product.create({
        data: {
          shopifyId: payload.id.toString(),
          title: payload.title,
          shop: shop,
        }
      });
      break;

    case "APP_UNINSTALLED":
      if (session) {
        await db.session.deleteMany({ where: { shop } });
      }
      break;

    default:
      throw new Response("Unhandled webhook topic", { status: 404 });
  }

  return new Response(null, { status: 200 });
};

ویب ہُک کی وشوسنییتا کے بہترین طریقے:

  1. فوری طور پر 200 جواب واپس کریں - اگر آپریشن سست ہے تو پس منظر کی قطار کے ذریعے غیر مطابقت پذیری سے عمل کریں
  2. ویب ہک کے X-Shopify-Webhook-Id ہیڈر کا استعمال کرتے ہوئے آئیڈیمپوٹینسی کو نافذ کریں۔
  3. HMAC دستخط کی تصدیق کریں (authenticate.webhook کے ذریعے ہینڈل کیا گیا)
  4. دوبارہ کوشش کی منطق کو ہینڈل کریں — Shopify 48 گھنٹوں میں 19 بار ناکام ویب ہکس کی دوبارہ کوشش کریں
  5. ڈیبگنگ کے لیے تمام ویب ہک پے لوڈز کو لاگ کریں (لاگ کرنے سے پہلے PII پٹی کریں)

بلنگ API: سبسکرپشن اور استعمال کے چارجز

کوئی بھی ایپ چارج کرنے والی فیس کو Shopify کا بلنگ API استعمال کرنا چاہیے۔ اسے نظرانداز کرنے سے ایپ اسٹور کی پالیسیوں کی خلاف ورزی ہوتی ہے۔

ایک بار ایپ کی خریداری:

export const loader = async ({ request }: LoaderFunctionArgs) => {
  const { billing, session } = await authenticate.admin(request);

  const { hasActivePayment, appSubscription } = await billing.check({
    plans: ["Professional Plan"],
    isTest: process.env.NODE_ENV !== "production",
  });

  if (!hasActivePayment) {
    await billing.request({
      plan: "Professional Plan",
      isTest: process.env.NODE_ENV !== "production",
    });
  }

  return json({ session });
};

بلنگ پلانز کو shopify.server.ts میں ترتیب دیں:

const shopify = shopifyApp({
  // ...other config
  billing: {
    "Professional Plan": {
      amount: 29.99,
      currencyCode: "USD",
      interval: BillingInterval.Every30Days,
    },
    "Enterprise Plan": {
      amount: 99.99,
      currencyCode: "USD",
      interval: BillingInterval.Every30Days,
    }
  }
});

ایپ برج اور ایمبیڈڈ نیویگیشن

App Bridge JavaScript لائبریری ہے جو Shopify ایڈمن کے اندر ایمبیڈڈ iframe تجربے کا انتظام کرتی ہے۔

** کلیدی ایپ برج پیٹرن**:

import { useAppBridge } from "@shopify/app-bridge-react";
import { Redirect } from "@shopify/app-bridge/actions";

// Navigate to an external URL from embedded context
function ExternalLinkButton() {
  const app = useAppBridge();

  const handleClick = () => {
    const redirect = Redirect.create(app);
    redirect.dispatch(Redirect.Action.REMOTE, {
      url: "https://your-docs-site.com",
      newContext: true
    });
  };

  return <Button onClick={handleClick}>View documentation</Button>;
}

// Toast notifications
import { useToast } from "@shopify/app-bridge-react";

function SaveButton() {
  const { show } = useToast();
  const fetcher = useFetcher();

  useEffect(() => {
    if (fetcher.state === "idle" && fetcher.data?.success) {
      show("Settings saved");
    }
  }, [fetcher.state, fetcher.data]);

  return (
    <Button
      onClick={() => fetcher.submit(formData, { method: "post" })}
      loading={fetcher.state !== "idle"}
    >
      Save
    </Button>
  );
}

جانچ اور مقامی ترقی

# Start the app in development mode
shopify app dev

# The CLI handles:
# - ngrok tunnel creation for webhook delivery
# - App installation on your development store
# - Hot module replacement for Remix routes
# - Shopify Partner Dashboard app URL updates

** گراف کیو ایل کے سوالات کی جانچ کرنا**:

سوالات کو کوڈ میں لاگو کرنے سے پہلے ان کی جانچ کرنے کے لیے اپنے ڈیولپمنٹ اسٹور کے منتظم میں Shopify GraphiQL ایپ کا استعمال کریں۔ رسائی بذریعہ: your-store.myshopify.com/admin/apps/graphiql۔

یونٹ ٹیسٹنگ روٹ لوڈرز:

import { describe, it, expect, vi } from "vitest";
import { loader } from "~/routes/app.products";

vi.mock("~/shopify.server", () => ({
  authenticate: {
    admin: vi.fn().mockResolvedValue({
      admin: {
        graphql: vi.fn().mockResolvedValue({
          json: () => Promise.resolve({
            data: {
              products: {
                nodes: [{ id: "gid://shopify/Product/1", title: "Test Product" }],
                pageInfo: { hasNextPage: false, endCursor: null }
              }
            }
          })
        })
      },
      session: { shop: "test-shop.myshopify.com" }
    })
  }
}));

describe("Products loader", () => {
  it("returns product list", async () => {
    const request = new Request("https://test.com/app/products");
    const response = await loader({ request, params: {}, context: {} });
    const data = await response.json();

    expect(data.products.nodes).toHaveLength(1);
    expect(data.products.nodes[0].title).toBe("Test Product");
  });
});

اکثر پوچھے گئے سوالات

کیا مجھے نئی Shopify ایپس کے لیے Remix ٹیمپلیٹ یا Node/Express ٹیمپلیٹ استعمال کرنا چاہیے؟

تمام نئی ایپس کے لیے ریمکس ٹیمپلیٹ استعمال کریں۔ Shopify نے اپنی ایپ ڈویلپمنٹ ٹولنگ کے لیے ریمکس کو معیاری بنایا ہے — Shopify CLI، دستاویزات، اور App Bridge React سبھی ریمکس کے لیے موزوں ہیں۔ نوڈ/ایکسپریس ٹیمپلیٹ اب فعال طور پر تیار نہیں ہے اور اس میں ٹوکن ایکسچینج سمیت متعدد جدید تصدیقی خصوصیات کا فقدان ہے۔ موجودہ نوڈ/ایکسپریس ایپس کو فوری طور پر منتقل ہونے کی ضرورت نہیں ہے، لیکن تمام نئی ایپس کو ریمکس سے شروع ہونا چاہیے۔

کیا میں پولارس کے بجائے ایک مختلف فرنٹ اینڈ فریم ورک استعمال کرسکتا ہوں؟

آپ اپنی ایپ کے عوام کے سامنے والے حصوں کے لیے اپنا ڈیزائن سسٹم استعمال کر سکتے ہیں (آپ کے اپنے ڈومین پر سیٹنگز پیجز، لینڈنگ پیجز وغیرہ)، لیکن Shopify ایڈمن کے اندر ایمبیڈڈ سیکشنز کو پولارس کا استعمال کرنا چاہیے۔ ایپ کے جائزہ کے رہنما خطوط واضح طور پر ایمبیڈڈ UI کے لیے Polaris کی ضرورت ہے۔ اپنی مرضی کے اجزاء کے ساتھ پولارس کو بصری طور پر نقل کرنے کی کوشش کرنے کے نتیجے میں عام طور پر رویے اور رسائی میں تضادات کی وجہ سے جائزہ مسترد ہو جاتا ہے۔

میں اپنی ایپ میں Shopify API کی شرح کی حدود کو کیسے ہینڈل کروں؟

Shopify کا گراف کیو ایل ایڈمن API ایک "بکٹ" ریٹ محدود کرنے والا ماڈل استعمال کرتا ہے۔ ہر دکان آپ کی ایپ کو 1,000 لاگت پوائنٹس فی بالٹی دیتی ہے، جو 50 پوائنٹس فی سیکنڈ پر دوبارہ بنتی ہے۔ GraphQL جوابات میں extensions.cost.throttleStatus فیلڈ کی نگرانی کریں۔ بلک آپریشنز کے لیے (ہزاروں ریکارڈز کو متاثر کرنے والے)، بلک آپریشن API کا استعمال کریں، جس کی شرح کی حد الگ ہے۔ جب آپ کو 429 جوابات موصول ہوتے ہیں تو جھٹکے کے ساتھ ایکسپونینشل بیک آف کو لاگو کریں۔

پروڈکشن میں اپنی Shopify ایپ کے لیے مجھے کون سا ڈیٹا بیس استعمال کرنا چاہیے؟

پیداوار کے لیے پہلے سے طے شدہ SQLite کو PostgreSQL سے تبدیل کریں۔ Prisma سیشن اسٹوریج اڈاپٹر PostgreSQL کے ساتھ کام کرتا ہے — اپنے ماحولیاتی متغیر میں کنکشن سٹرنگ کو تبدیل کریں اور postgresql فراہم کنندہ کو استعمال کرنے کے لیے prisma/schema.prisma کو اپ ڈیٹ کریں۔ زیادہ سیشن والیوم والی ایپس کے لیے، گرم توثیق کے راستے پر ڈیٹا بیس کا بوجھ کم کرنے کے لیے PostgreSQL کے بجائے سیشن اسٹوریج کے لیے Redis پر غور کریں۔

میں Remix کے ساتھ بنائی گئی Shopify ایپ کو کیسے تعینات کروں؟

Shopify ایسے پلیٹ فارمز پر تعینات کرنے کی تجویز کرتا ہے جو Node.js رن ٹائم کو سپورٹ کرتے ہیں: Fly.io، Render، Railway، AWS (EC2/ECS) یا Google Cloud Run۔ Vercel اور Netlify فرنٹ اینڈ کے لیے کام کرتے ہیں لیکن وہ مستقل Node.js سرور نہیں چلا سکتے جس کی Shopify کے سیشن اسٹوریج کی ضرورت ہوتی ہے۔ یقینی بنائیں کہ آپ کا تعیناتی پلیٹ فارم ویب ہک پروسیسنگ اور بیک گراؤنڈ جابز کے لیے طویل عرصے سے چلنے والے عمل کو سپورٹ کرتا ہے۔


اگلے اقدامات

ایک حسب ضرورت Shopify ایپ بنانے کے لیے جو تصدیق، GraphQL ڈیٹا مینجمنٹ، ویب ہکس، اور بلنگ کو درست طریقے سے ہینڈل کرتی ہے، پلیٹ فارم کی گہری مہارت کی ضرورت ہوتی ہے۔ غلط کنفیگر کردہ ایپ ایپ اسٹور کے جائزے میں ناکام ہوجاتی ہے، مرچنٹ اسٹورز کو توڑ دیتی ہے، یا سیکیورٹی کی کمزوریوں کو ظاہر کرتی ہے۔

ECOSIRE کی Shopify ایپ ڈیولپمنٹ سروسز مکمل ڈیولپمنٹ لائف سائیکل کا احاطہ کرتی ہے: آرکیٹیکچر ڈیزائن، ریمکس/پولارس کا نفاذ، گراف کیو ایل API انٹیگریشن، ویب ہُک انفراسٹرکچر، بلنگ سیٹ اپ، ایپ اسٹور جمع کروانا، اور لانچ کے بعد سپورٹ۔

اپنی حسب ضرورت Shopify ایپ کی ضروریات پر بات کریں ہماری ڈیولپمنٹ ٹیم کے ساتھ۔

E

تحریر

ECOSIRE Research and Development Team

ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔

Chat on WhatsApp