Send To Many and Your ERP: How Bulk Gifting Orders Flow into Your Systems of Record
How Send To Many represents a bulk order in Shopify as one parent order plus recipient orders, and how to map that into your ERP, WMS, accounting, and reporting stack: tags, order names, revenue double counting, fulfillment routing, and a field-level reference.
Corporate gifting breaks an assumption almost every ecommerce platform and ERP is built on: one order, one shipment, one address.
A single corporate gift order is one purchase and one payment, but it could include fifty shipments to fifty addresses. Neither ERPs nor Shopify have a native data model for that, which is why most merchants running a serious gifting program have built their own tooling around it: scripts that load orders straight into a shipping platform, or a custom feed into the ERP, sitting entirely outside their storefront.
Send To Many gives merchants a way to get these bulk orders into Shopify. There are lots of reasons to do that:
- Customers can build and buy their own bulk orders through your storefront. This is the big one. A corporate buyer assembles a multi-recipient order and checks out in a single transaction on your storefront, with no rep in the loop.
- All orders in one place. In addition to the specific benefits below, there is simplicity and cleanliness to keeping all your ecommerce orders in one platform and having all of them flow to backend and fulfillment systems from there.
- Order visibility for customer service. Gift orders live in Shopify, where your team already works, so it's always easy to find orders there, instead of having to consult an ERP or fulfillment system in specific scenarios.
- Product and inventory management. Gifting demand shows up against your real catalog, not in a spreadsheet.
- One system for both. Storefront checkout and admin order uploads run through the same app, so you can stop maintaining a B2C gifting tool and a separate B2B path.
Realizing these benefits may entail some extra effort. You may need to remap some of the business logic already built into a custom gifting solution or backend so that it works with how Send To Many generates orders in Shopify. And while Send To Many generates orders in Shopify that are as close to a regular storefront order as possible, there are some nuances worth understanding up front to simplify your onboarding process.
This article walks through how Send To Many represents a bulk order in Shopify, and some of the issues to work through with your ERP, WMS, and reporting stack.
Key concepts: a "Send" in Send To Many
A Send is a bulk, multi-recipient order with all the metadata, billing info, and recipient info necessary to collect payment and complete the orders. One Send = one parent order + multiple child orders.
One Send. This is the metadata about the bulk order itself: the team member who owns it, the source (upload, storefront checkout, or inquiry), the checkout or inquiry details, and the customer. Send To Many gathers and stores this, and it is accessible in the app inside your Shopify admin.
One parent order (also called the gifter order or the aggregate order). This is the invoice and the financial record. It starts life as a Shopify draft order, which can be completed in several ways: paid directly by the customer, accepted by the customer under payment terms, marked as paid if payment is collected outside Shopify, or by applying a credit card to the draft order. When payment is processed through Shopify, it uses your existing Shopify payment settings and gateway.
The parent order carries custom line items that roll up each product in the Send, along with rolled-up tax and shipping totals. It is marked as "shipping not required," which also keeps the Shopify payment page cleaner by suppressing the shipping address.
One child order per recipient (also called the recipient order or the ship-to order). These are what actually ship. Each is a normal Shopify order with a real shipping address, real catalog products, shipping rates, discounts, and any tax calculated based on your Shopify settings. Each child order is created by Send To Many (they carry app attribution of "Send to Many"), and their transactions run through a "Send to Many" payment gateway. They do not hold real transactions: the payment lives on the parent.
Parent vs. child orders at a glance
| Parent order (aggregate or gifter order) | Child orders (recipient or ship-to orders) | |
|---|---|---|
| How many | One per Send | One per recipient address |
| What it is | The invoice and financial record | What actually ships |
| Created from | A Shopify order created from a draft order (paid by customer, payment terms, marked paid by a rep, or card applied to the draft) | Generated by Send To Many. Shown in Shopify as created "via import" |
| Channel and gateway | Your normal Shopify payment settings | Send To Many app attribution, "Send to Many" payment gateway |
| Transaction | The real transaction | Placeholder only |
| Line items | Custom line items rolling up each product | Real catalog products |
| Tax | A custom line item with the rolled-up tax totals summed across all the child orders in a Send | Tax details calculated using your Shopify (or a connected third party) tax service, based on each recipient's address and products |
| Shipping | A custom line item with the rolled-up shipping total | Shipping rate calculated or assigned for each order based on Send To Many settings, usually using rates defined in Shopify shipping settings |
| Fulfillment status | Unfulfilled. "Shipping not required" | Unfulfilled, with fulfillment managed via store settings or standard procedures |
| Inventory | None. Custom line items do not touch stock | Real SKUs. Inventory is drawn by these orders. The app provides settings to override your product inventory settings for bulk orders when needed |
| Default tags | Send to Many #{send_id}, Send to Many aggregate | Send to Many #{send_id} |
| Optional tags | Can be set in upload presets and checkout settings | Can be set in upload presets and checkout settings |
| Order name | Generated automatically by Shopify when the draft order is completed. Cannot be templated | Can be generated from a template, which can include the parent order name. Distinct from Shopify's underlying order ID |
| Order ID | Shopify's unique order ID, generated automatically when the draft is completed | Each order's unique ID, generated automatically by Shopify when the order is created |
Tags and the order name, along with the app, gateway, and status fields, are the main levers you have for passing data downstream into your ERP, fulfillment, accounting, and reporting systems.
Understanding this structure will help you define and implement the business logic you need to properly handle how these Shopify orders flow into your other systems of record. The rest of this article covers the specific decisions that come up.
Working with Send To Many orders in your ERP and backend systems
No two ERP configurations are alike. Every merchant has their systems set up for their own needs, and a gifting workflow has often been bolted on or built around a prior process. Switching to Send To Many will likely require some updates to your mappings and workflows: to capture the parent and child relationships, and to handle the particularities of the orders the app generates.
There is no native, one-click ERP connector today. Every ERP integration is bespoke, and it runs through your iPaaS (Celigo and similar), your integration partner, or your ERP vendor. The mapping itself is a known quantity: we have worked alongside NetSuite integrators, custom converters for legacy ERPs, and third-party OMS vendors to get it done. It is a project, and it is worth scoping properly.
Here are the key considerations for mapping Send To Many orders into your backend systems.
1. Reconstructing the parent-child order relationship
A Send with 50 recipients generates 51 orders in Shopify, and all of them flow to your systems. The first consideration is to make sure your systems can tell these orders apart and understand how they relate to each other and to the Send itself. Everything else, from revenue treatment to fulfillment routing to inventory, builds on that hierarchy, so it is the first thing to establish.
What you have to work with:
- Tags. Every Send To Many order carries a
Send to Many #{send_id}tag. Parent orders additionally carry aSend to Many aggregatetag. Most backend systems read Shopify tags by default, which makes this the most reliable starting point. Additional tags can be added to differentiate the order source (checkout, uploads, and inquiries). - The order name. The parent order's name is generated automatically by Shopify and cannot be templated. Child order names can be generated from a template, and that template can include the parent order name, so if your ERP picks up the order name it can reconstruct the relationship from the name alone. Two caveats: the order name is distinct from Shopify's underlying order ID, which cannot be controlled, and some fulfillment systems read the internal order number rather than the name. Confirm which field your systems actually use before relying on a naming convention.
- Flow triggers. Send To Many fires Shopify Flow triggers that pass additional metadata about the Send when it is created and when it completes. This can be a useful way to push context into an ERP. See Shopify Flow automation for bulk orders.
Between the tags and the order name, you can reconstruct the full parent-child hierarchy, and then build your business rules for revenue and fulfillment on top of it.
2. Passing additional structured data in orders
Through Send To Many, you can collect additional data you need to fulfill orders, such as shipping dates, gift messages, bundle details, or product customization info. This data can be mapped into Shopify orders in a number of ways:
- Order notes
- Order attributes (also known as additional details)
- Order metafields
- Line item properties
- Order tags
For checkout orders, these mappings are set in checkout settings. For order uploads, map the data in each column to one of these options when adding your spreadsheet to a new Send. See Bulk Order Spreadsheet Format for the upload side and Configure Multi-Recipient Checkout: Core Settings for checkout.
For order attributes and line item properties, check to see what "key" (field name) your ERP is expecting to see for each data type. For instance, a shipping date might be stored as _ship_date in existing orders that your ERP already knows how to process. Use the identical name (including any spaces or underscores) when setting up the key in Send To Many.
For dates in particular, also pay attention to the format of the value. Shopify saves these fields as text strings, so "10/01/2026" doesn't automatically translate to "Oct 1, 2026". Set up Send To Many to use the exact format your ERP expects to receive for each specific field.
You may also be able to use Shopify Flow to move data between fields or even rewrite a specific field's values after Send To Many creates the orders and before they are picked up by your ERP.
3. Reconciling parent with child order details
The parent order carries a single rolled-up line for shipping and a single rolled-up line for tax, while the child orders carry the shipping and tax detail for each individual shipment. Your ERP may need to reconcile those single lines on the parent with the detail spread across the children, and tax reporting in particular usually requires detail at the child order level.
You have two options.
- Calculated values (recommended). Child orders carry their real, calculated product values, tax, and shipping. This keeps every child order internally consistent, gives you full per-recipient detail on the record that actually shipped, and supports per-order tax reporting. This is the right approach in virtually every scenario.
- $0 value child orders. Child orders are generated with zeros across the board for line items, subtotals, and totals. Sales tax will also be zeroed. While there are scenarios where this option makes sense (marketing orders, employee gifts, and similar), it means the child orders no longer carry the financial detail of what shipped. With this setting, sales tax won't be visible to Shopify, nor will product-level revenue on these orders or shipping and discount subtotals.
Choosing calculated values does mean the same revenue appears on both the parent and the children. You handle that in reporting rather than by zeroing out your orders, which is covered in section 5.
Tax detail report: Send To Many also provides a full tax rate detail report, available for download under Analytics in the app, with the individual tax rates for all child orders: sales tax, excise taxes, flat taxes, VAT, and so on. Tax in this report is provided at the child order level, not at the product level. See Sales tax on multi-recipient orders.
4. Reconciling discount values
Discounts can apply at different levels, so the goal here is to confirm where discount values land and make sure your ERP reads them from the right record. In multi-recipient checkout you can configure discount codes to apply per recipient (the code is applied to each child order where valid) or to the entire order (applied to the aggregate invoice at the Shopify payment page). In order uploads, you can add discount codes or custom discounts once that apply to each recipient order in the Send.
Whichever you choose, you'll want to run some test orders with discounts to see:
- Which record the discount value lands on, parent or child, and whether your ERP reads it from there.
- What value actually comes through on the order. If more than one discount code is applied, the discount title will differ from the case where a single code is used.
If your ERP needs the literal discount code, Send To Many also adds a Discounts order attribute listing each of the discount titles used on a child order. See Discounts in Multi-Recipient Checkout.
5. Handling revenue double counting
If your child orders carry calculated values (which we recommend), the same revenue is represented twice: once on the parent invoice, and once across the child orders. So you'll want to make sure each of your reporting systems counts it exactly once, which generally means filtering parent orders out of revenue totals.
When Shopify is your source of truth. Add filters to your key reports so that parent orders are excluded from revenue totals. Send To Many orders carry their own tags, a "Send to Many" payment gateway on child orders, and "Send to Many" app attribution, which gives you clean fields to filter on. Send To Many is not a Shopify sales channel, so sales channel is not one of the fields available to you. See How to Filter Shopify Reports to Avoid Double-Counting Bulk Orders for the exact filters, and Customize Your Shopify Analytics Dashboard to replace the default dashboard cards with filtered ones.
Note: there is currently no way to filter this revenue out of the spark charts on the Shopify admin homepage. Analytics reports can be made accurate; that headline number on the dashboard cannot.
Other reporting systems. GA4, your ERP, and any other reporting platform may see both the parent and the child orders, depending on how data is passed to them. Each has its own quirks, but the fix is generally the same: filter on parent vs. child using the tags, the payment gateway, or app attribution. It is worth explicitly checking GA4, because both parent and child orders can appear there for orders placed through the storefront and through the admin.
6. Marketing attribution
How gifting orders should be attributed depends on each site's setup and reporting. If your attribution data is being collected through the front end with a browser pixel, parent orders will show the proper attribution and child orders will be ignored, because child orders are created server-side with no browser session.
On the other hand, if all your order data is passed via a server-side API, it's possible that both parent and child orders will get attributed and revenue will be double counted for the source. Merchants using the Google & YouTube app in Shopify to pass data to GA4 have had this issue, since the app passes all orders from your store to GA4.
If you're using a third-party tool to pass data to ad platforms or attribution tools, you may be able to filter out either the parent or child orders, depending on how you'd like these orders attributed, using order tags, values in your order naming template, or the order source field.
7. Revenue capture
Some stores configure Shopify to capture payment on the credit card transaction only when an order is fulfilled. Send To Many parent orders hold the transaction but contain no fulfillable products, so in the ordinary course of operations the parent order may never be fulfilled, which means the payment may never be captured. In that case you'll need to add automations to Shopify to make sure that if your store captures on fulfillment, parent orders still get captured.
If your store captures on fulfillment, set up a Shopify Flow rule to watch for parent orders with Send To Many tags and either:
- Fulfill them immediately when they are created, or
- Fulfill the parent only once all of its child orders have been fulfilled, if you would rather capture at the point the gifts are actually fulfilled.
Which one is right depends on your specific scenario. Both are straightforward to build in Flow, especially with Sidekick's help.
8. Keeping parent orders out of fulfillment workflows
Only child orders ship, so the goal here is to keep the parent order from entering your fulfillment queue in the first place. To a WMS or a 3PL, the parent order can look like an order: it has a customer, a total, and line items.
The good news is that parent orders come through as "shipping not required," which may automatically exclude them from some fulfillment workflows already. Check whether yours honors that flag before building anything.
If it does not, you have a few options:
- Shopify Flow. A Flow rule keyed on the
Send to Many aggregatetag that marks parent orders as fulfilled, or places them on hold, so they never enter the fulfillment queue. This is the most common approach and takes minutes to set up. (Note the overlap with revenue capture above: one Flow rule can handle both.) - Tag-based filters in your WMS or shipping platform. Most systems, including ShipStation and similar, import Shopify tags and can filter on them. Exclude the aggregate tag from your import. See ShipStation with Send To Many.
- Archive. Simple, and sufficient for some workflows.
Send To Many does offer a setting to cancel the parent order automatically, but we recommend it only as a last resort if you have no other viable way to filter orders out of fulfillment workflows. It creates confusion for the customer, who sees a canceled order alongside their child orders in their account. It makes reconciliation more difficult, because you end up with canceled orders that still carry revenue and a valid transaction. And it does not resolve revenue double counting, since Shopify includes canceled orders in revenue reporting by default. See Managing aggregate orders.
9. Inventory and demand planning
The parent order contains custom line items, not your catalog products, so it does not touch inventory. Your real product demand lives on the child orders, and inventory is drawn from Shopify when those child orders are generated. The goal in this section is to make sure gifting demand is visible to your inventory and planning systems, even though it originates on an invoice that holds no real products. (The app offers other inventory handling options in checkout and upload settings, but having child orders pull inventory is the most common scenario.)
The practical consequence: gifting demand is not visible to your planning systems until the child orders exist. If a large Send is sitting as an unpaid invoice and child orders have not been generated, the stock it will eventually consume is not yet reserved or forecast anywhere.
How to work with that:
- Forecast from child orders. That is where the real SKUs and quantities are.
- Generate uploaded orders immediately where you can, so the future inventory requirement becomes visible through the child orders as early as possible.
- Collect a ship date. You can capture a ship date on the storefront and in order uploads, which gives your planning team the timing to go with the quantities.
- Use invoice-first generation deliberately. Requiring payment before child orders are created means you are not holding stock against gift quotes that may never be paid. The tradeoff is exactly the visibility gap above, so choose it knowingly.
Appendix: field-level reference
This is the detailed mapping your integration partner or ERP team will want. It covers what Send To Many writes onto each Shopify record.
Structure and attribution
| Field | Parent order | Child orders |
|---|---|---|
| Shopify object | Created as a Shopify draft order, which becomes an order when it is paid or marked as paid | Created directly as Shopify orders, one per recipient |
| App attribution (source name) | Draft Orders. The parent completes from a draft order, so Shopify attributes it to draft orders rather than to Send To Many | Send to Many |
| Sales channel | Not applicable: Send To Many is not a Shopify sales channel, so do not build filters on sales channel | Not applicable. Use tags, payment gateway, or app attribution to filter instead |
| Order name | Generated automatically by Shopify when the draft order is completed. Cannot be templated. Distinct from Shopify's underlying order ID, which cannot be controlled | Customizable with variables and templates, and can include the parent order name. Distinct from Shopify's underlying order ID, which cannot be controlled |
Tags and attributes
These are the primary integration hooks. Most backend systems read Shopify tags by default.
| Field | Parent order | Child orders |
|---|---|---|
| Tags | Send to Many #{send_id} and Send to Many aggregate, plus any custom aggregate tags you configure (40 character maximum per tag) | Send to Many #{send_id}, plus your Send-level tags, any per-row tags from an uploaded spreadsheet, and any tags added by a delivery integration. Supports variable templates |
| Order attributes | SendID, holding the Send ID | Your Send-level or per-row note attributes, attributes from delivery integrations such as Zapiet or Bird, and a Discounts attribute listing the discount titles applied |
| Line item properties | Line-level custom attributes carried from your source data | __send_id on every line item. Bundles additionally carry __belongs_to_bundle and __bundle_product. Plus any line item properties you map, such as card message, personalization, or print files |
| Order metafields | Not set | Key pairs can be mapped from your upload columns or from a delivery integration. Shipping date, gift message, and other recipient fields can also be mapped to order metafields |
| Note | Aggregate draft for Send #{id} | Any Send-level note, a per-row note from an uploaded spreadsheet, or a note supplied by a delivery integration |
Money, tax, and shipping
| Field | Parent order | Child orders |
|---|---|---|
| Line items | One rolled-up line per product and variant across the entire Send. All parent line items are set to requires shipping = false | The recipient's actual variants. Bundles are expanded into their component line items |
| Tax | The parent draft is created as tax exempt to prevent taxes from being recalculated during checkout. Tax is not carried as Shopify tax lines. It is added as a single rolled-up line item titled "Aggregate tax" (the title is configurable). A setting in the app can display the individual tax rates as line item properties on the tax line. This works whether or not tax is included in your prices | Real Shopify tax lines, with rate, title, and amount, calculated per destination address. $0 child orders carry no tax lines at all |
| Shipping | A single rolled-up line item titled "Aggregate shipping" (title configurable), also set to requires shipping = false to prevent a shipping address from being collected during checkout | A real Shopify shipping line with the selected rate and its rate code |
| Discounts | An applied discount on the draft, titled with the discount code, or "Aggregate discount" if none is named | Shopify permits only one item-level discount code per order. Because of that limit, the full list of applied discount titles is also written to a Discounts order attribute, which can be picked up by an ERP |
| Transaction | The real payment, processed through your normal Shopify payment settings | A placeholder transaction for the order total, using the "Send to Many" payment gateway. It carries the parent order's authorization code where available. Only present on calculated (paid) child orders |
| Financial status | Paid once the invoice is paid | Can be overridden by a Send setting if your workflow requires a different status |
People, addresses, and inventory
| Field | Parent order | Child orders |
|---|---|---|
| Customer | The billing customer / gift giver. If using Shopify B2B, the customer's company location can be set as the purchasing entity | The billing customer by default. With the Use recipient as customer setting on, each recipient becomes the customer on their own order instead. See Send Presets and Settings |
| The customer's contact email. If none exists, a suppressed blackhole address is used so Shopify does not send a confirmation | The recipient's email if you have chosen to notify recipients. Otherwise a suppressed blackhole address (suppressed+{send_id}@sendtomany.com), or the customer's email, depending on your notification setting | |
| Shipping address | None. The parent does not require shipping, which also suppresses the shipping address on the Shopify payment page. Shopify may pull the billing customer's default shipping address into the draft order, but this is not used in checkout and does not appear on the child orders | The validated recipient address |
| Billing address | The customer's billing address | The billing customer's address, or the recipient's shipping address when Use recipient as customer is on |
| Inventory | None. The rolled-up lines do not draw stock | Real variants. Stock is drawn when the child orders are generated, using the product's inventory settings or overridden by checkout or preset settings in Send To Many |
Related articles
Still have a question?
Ask Manny, the Send To Many bot, about this page or anything else in the docs.