<aside>
<aside>
fetch_stock callbacks will be implemented to reconcile inventory during high-sales periods).<aside>
The scope of work covers all integration requirements as enumerated in Shopify’s SFN integration steps 1 through 11. Below is a breakdown of each major component to be delivered:
Shopify App Creation: We will create a Shopify App specifically for SFN integration. This app will be built to Shopify’s latest API version and high standards of quality, as required to participate in SFN. If no app exists, we will follow Shopify’s app development guidelines to set one up from scratch.
Fulfillment Service Setup: The app will be configured to support fulfillment services in Shopify. This means for each merchant store that installs the app, the app will register a FulfillmentService object representing the partner’s fulfillment location. In line with Shopify’s guidance, we will start by using a single fulfillment location (warehouse) and single fulfillment service for the integration, rather than multiple locations, to reduce complexity. The FulfillmentService will be created via the Shopify API with inventoryManagement and trackingSupport enabled (both set to true) so that the app manages inventory and tracking on Shopify’s side. This establishes the foundation for Shopify to route orders to the partner and for the partner to manage those orders’ fulfillment in Shopify.
Fulfillment Order Flow & API Integration: We will implement the complete fulfillment order workflow using Shopify’s Fulfillment Orders API (GraphQL). When a merchant sells an item stocked at the partner’s location, Shopify will generate a Fulfillment Order assigned to the partner’s service. The app will listen for these fulfillment requests (via webhook or periodic query) and accept or decline them appropriately using GraphQL mutations. Accepting a fulfillment order triggers the partner’s warehouse to pick, pack, and ship the order; if the order cannot be fulfilled, the app will send a rejection with an appropriate reason code. We will handle fulfillment order acceptance, creation of fulfillments, and posting tracking info using Shopify’s APIs (e.g. fulfillmentOrderAcceptFulfillmentRequest, fulfillmentCreate, etc.). This workflow ensures orders flow from Shopify to the partner’s system and back to Shopify as completed fulfillments.
Shipment Tracking Updates: The integration will support end-to-end package tracking visibility for merchants. For every order fulfilled by the partner, the app will update Shopify with tracking numbers and shipment status events. Specifically, the app will use the Fulfillment Events API to record shipping milestones (in transit, out for delivery, delivered, etc.) via fulfillmentEventCreate mutations. It will also pass the carrier tracking number and carrier name to Shopify when creating the fulfillment so that merchants and customers can track orders in real time. To guarantee no tracking information is lost, we will implement Shopify’s callback for retrieving tracking numbers (fetch_tracking_numbers). This means if Shopify ever needs to reconcile missing tracking data, it can call our app and our app will respond with any and all tracking numbers for shipments, ensuring 100% coverage of tracking info. These measures align with Shopify’s requirement that fulfillment apps support tracking and respond to all tracking requests.
Inventory Management Integration: The app will integrate the partner’s inventory system with Shopify so that merchants see accurate stock levels for the partner’s location. We will implement Shopify’s Inventory Management API in the app. The partner’s system will regularly push inventory updates (or respond to Shopify inquiries) for each SKU at the fulfillment location. The integration will handle multiple inventory states that SFN monitors – including Incoming (items en route to the warehouse), On Hand (physical stock in warehouse), Available (sellable stock not committed to orders), Reserved (temporarily held for open orders), Damaged, Safety Stock, and Quality Control states. The app will update Shopify with these quantities as they change, using GraphQL mutations (for example, adjusting available and on-hand quantities when stock is received or orders are fulfilled). The “Committed” state (units allocated to open orders) is managed by Shopify itself, but all other relevant states will be kept in sync. Additionally, we will implement Shopify’s fetch_stock callback to handle on-demand stock reconciliation: if there’s a spike in sales or a delay in routine updates, Shopify can call our app to fetch the latest inventory levels, ensuring that inventory data remains accurate.
Exception Handling (Rejections & Holds): The integration will gracefully handle scenarios where a fulfillment cannot proceed normally. If the partner must reject a fulfillment request (e.g. item not found, address unserviceable) or put an order on hold (e.g. awaiting stock or clarification), the app will use Shopify’s GraphQL mutations to do so with appropriate context. We will provide the most relevant reason codes when calling fulfillmentOrderRejectFulfillmentRequest or fulfillmentOrderHold. Shopify requires selecting a reason (OUT_OF_STOCK, ADDRESS_UNDELIVERABLE, etc.), and if none of Shopify’s standard reasons apply, the app will use “OTHER” with a descriptive message for clarity. This ensures that the merchant can see why an order was held or rejected, maintaining transparency. Handling these exceptions correctly is critical for merchant trust and is mandated by the SFN integration guide.
Estimated Shipping Date Estimates: To set proper expectations with merchants, the integration will provide Shopify with an estimated shipping date for each order. Shopify’s 2025-07 API version introduces a field for estimatedShippedAt on fulfillment orders. Our app will capture the partner’s expected ship date (based on SLA or current warehouse queue) and supply this date when accepting a fulfillment request. This date will be surfaced to merchants in Shopify, so they know when the order is expected to leave the warehouse. As Shopify evolves this feature (including potential future mutations to update the date), we will remain aligned and update our integration accordingly. By providing estimated ship times, the partner’s performance is transparent to merchants and Shopify can display reliable fulfillment timelines.
SFN Configuration & Partner Profile (Intake Form): We will complete the SFN Fulfillment Partner Intake configuration in coordination with Shopify. This involves supplying detailed information about the partner’s services via Shopify’s intake form. We will work with the partner’s team to gather all required data, such as:
Providing this information is critical because it populates the SFN system that merchants use to filter and compare fulfillment partners. By fully completing the intake form, we ensure the partner’s profile in SFN is accurate and attractive to the right merchants, with correct pricing estimates and capability disclosures. (For example, SFN will use the supplied formulas to show merchants an estimated fulfillment cost given their product size and order volume inputs.) We will make sure all required fields are filled so that the partner meets SFN’s onboarding requirements.
Built for Shopify Alignment: The integration will be developed to meet the “Built for Shopify” program standards. This means the app will adhere to Shopify’s best practices for quality, security, performance, and user experience. Concretely, we will ensure the app obtains Built for Shopify status as required for SFN fulfillment service apps. Achieving this involves:
fetch_stock and fetch_tracking_numbers) within required timeframesshopify.dev.Optional Webhooks & Additional Features: In addition to the required APIs, Shopify recommends certain webhooks for fulfillment and inventory events that, while not mandatory, can enhance the integration. As part of a comprehensive solution, we will implement these optional webhooks where they add value. For instance, webhooks for fulfillment creation, cancellation, or stock level changes can allow the partner’s system to get real-time push notifications whenever relevant events occur, supplementing our polling or scheduled syncs. By incorporating these, we improve resilience — if any event is missed via the primary flow, the webhook can trigger a secondary update. We will review Shopify’s list of fulfillment and inventory webhooks and include those that make the data exchange more robust. (These might include webhooks like fulfillment_order.Notification, inventory_levels/update, etc., based on Shopify’s offerings.) While labeled “optional” in the guide, we recognize these can be important for a belt-and-suspenders approach to data sync, and will include them to ensure no gaps in integration.
Embedded App Experience: The partner app will include an embedded user interface in Shopify Admin that delivers key merchant-facing workflows within Shopify. According to SFN requirements, merchants should not be forced out to an external website for any essential integration steps. We will design and build an intuitive embedded app UI that allows merchants to:
These embedded experiences will be built using Shopify’s Polaris design system to feel native to Shopify. The goal is a seamless UX, where the merchant can do everything from setup to day-to-day monitoring without confusion or needless redirection. This is not only a Shopify requirement but also good for merchant satisfaction. (Notably, fully self-serve merchant onboarding via the app is considered optional at this stage. Our initial focus will be on the required elements – authentication and dashboard – but we will design the app in a way that could be extended later to support more self-service onboarding steps if needed.)
End-to-End Testing & Shopify Certification (Step 11): Finally, we will support comprehensive end-to-end testing of the integration in cooperation with Shopify’s SFN team. A testing sandbox or procedure will be established so that Shopify’s developers can validate the integration thoroughly before go-live. To facilitate this, we will:
By providing this robust testing environment, we allow Shopify’s SFN onboarding team to run through all scenarios – the “happy path” as well as edge cases – to verify everything works as expected. We will collaborate with them during this phase, addressing any issues they find. Successful completion of Shopify’s official onboarding test plan is a key deliverable before launch, ensuring the integration meets all functional criteria.
</aside>
<aside>
The integration will follow a client-server architecture where the Shopify App (our fulfillment service app) acts as a middleware between Shopify and the fulfillment partner’s backend system. Below is an outline of the major components and data flows:
fulfillmentOrderAcceptFulfillmentRequest in Shopify’s API along with an estimated shipping date if available. If the partner cannot fulfill the order for some reason (e.g., no stock), the app will instead call fulfillmentOrderRejectFulfillmentRequest with a reason code and message, so Shopify knows to route the order elsewhere or alert the merchant.fulfillmentCreate, attaching the tracking number and carrier details. This call will mark the order as fulfilled in Shopify and make the tracking information visible to the merchant and customer. Additionally, for each shipment status change (label printed, in transit, delivered, etc.), the partner can send updates which the app will forward to Shopify using fulfillmentEventCreate to log timeline events on the order. This provides merchants a continuous view of the shipment’s progress in the Shopify order timeline. For redundancy, we implement the fetch_tracking_numbers callback – if Shopify ever queries our app for all tracking numbers on a fulfillment (e.g. if an event was missed), our app can recompute or fetch from the partner system the complete set of tracking numbers and return them.fetch_stock on our app, to which we will respond by pulling a fresh snapshot of inventory from the partner’s system and returning it. This architecture ensures high reliability of inventory data synchronization.write_fulfillments, write_inventory etc.). Data in transit between Shopify, the app, and the partner’s systems will be encrypted via HTTPS. We will also ensure GDPR and privacy compliance: no unnecessary personal data will be stored, and any data retention policies will be documented. The app will treat merchant and customer data with care, fulfilling the BFS requirement of being a trustworthy app that protects dataapps.shopify.com.In summary, the technical architecture connects Shopify and the fulfillment partner’s operations in real time, using a combination of GraphQL API calls, webhooks, and a secure embedded application. It is designed for reliability, accuracy, and speed, which are all critical for a smooth fulfillment experience.
</aside>
<aside>
We will deliver a complete integration package, including all code, configurations, and supporting materials required for a successful SFN onboarding. Key deliverables include:
<aside>
To consider this project successfully completed, the following acceptance criteria must be met. These criteria align with Shopify’s requirements and the partner’s business goals:
Full SFN Certification: Shopify’s SFN team has validated the integration and formally onboarded the partner. This includes passing all steps of the SFN onboarding test plan with no outstanding issues. For example, Shopify should confirm that when they install the partner’s app on a test store and follow the documented setup steps, all expected behaviors occur (fulfillment service is created, inventory updates appear, orders can be fulfilled with tracking, etc.) – essentially, all “Expected Results” in the Shopify test scenarios are achieved. Official sign-off from Shopify will be a primary acceptance criterion.
Built for Shopify Status Achieved: The app has been reviewed and approved under the Built for Shopify program specifically for a fulfillment service app. This means the app meets all quality benchmarks (including security, performance, usability, and compliance with Shopify’s app requirements). Evidence of this criterion would be the app listed (even if privately) with the BFS badge or a confirmation letter/email from Shopify granting the status.
End-to-End Merchant Flow Validation: At least one end-to-end test merchant (or a pilot merchant) has been run through the entire flow successfully. Acceptance is contingent on a merchant being able to:
The successful completion of the above by a non-developer user (merchant or merchant proxy) indicates the solution is truly ready for real users. We will use this as a sign-off test, possibly with the partner’s internal team acting as the “merchant”.
Data Accuracy and Sync Performance: During testing, inventory quantities and order statuses must remain consistent between Shopify and the partner’s system. Acceptance means that no critical discrepancies are found – e.g., no orders stuck unfulfilled in Shopify, no inventory numbers that diverge beyond an acceptable latency. The integration should demonstrate that it can handle at least the expected daily volume (as per partner’s estimates) without lag or failure. For instance, if 1000 orders are placed and fulfilled in a day, Shopify should reflect all 1000 fulfillments with tracking, and the partner’s system should show those 1000 orders shipped – with inventory decremented – by end of day. Any missed updates or slow syncs would be addressed before acceptance.
Merchant UX and UI Approval: The embedded app’s user interface and overall user experience should be reviewed and approved by key stakeholders (including the partner and ideally a Shopify UX review if they require one for BFS). This means the app is easy to navigate, the wording is clear, and it feels integrated into the Shopify Admin. All embedded app requirements – e.g. in-app authentication and dashboard – must be present and working. Additionally, any links or help texts should be correct (the “More information” buttons in SFN should go to the right places in our app or documentation). We will consider this criterion met when the partner’s team and Shopify have no further UX changes requested.
Support Processes in Place: Prior to launch, the support integration must be fully set up. Acceptance requires that:
Essentially, the criterion is that if a merchant using the integration runs into any issue, both Shopify’s support and the partner’s support are prepared to handle it effectively from day one.
Operational Readiness: The partner’s warehouse and systems are operationally ready to fulfill Shopify orders at launch. While this is more on the partner’s side, it is part of acceptance that everything configured via the integration (like SKUs, locations, etc.) corresponds to real capabilities. For example, if the partner promised two-day shipping in the intake form, they have the shipping carriers set up to actually do that. From the integration perspective, this means we have performed a final data check: all SKUs in merchants’ catalogs are properly mapped to the partner’s SKUs if needed, all warehouses/locations are set correctly, and test orders have been trial-run in production mode to ensure smooth operation.
Only when all the above acceptance criteria are met will we consider the integration project complete. This ensures a high-quality outcome aligned with both Shopify’s and the fulfillment partner’s expectations.
</aside>