The site was intended to process multiple orders to different addresses for each user. Their current method was to have each order go through the Shopify Checkout one-by-one, creating a bad (slow) user experience. I was tasked with providing a way for users to push multiple orders from one simple interface.
My immediate thoughts were to use AJAX to create Shopify draft orders belonging to a "group", and then mark the drafts as paid when a "master" order had been captured in the Shopify Checkout. This turned out to be unsuitable for the client's needs as it would've impacted the accuracy of sales reports by counting the sale twice.
I understood that I could bypass this issue completely by capturing payment separately, however I had to first check with Shopify that this was a suitable solution. Ultimately, I was given the all clear to use Stripe and PayPal outside of the Shopify Checkout, so instead opted to go down this route.
First things first, I had to create a quickorder interface inside a Shopify app proxy in which a user could search for products, add a shipping address, and then repeat multiple times until they were ready to submit a batch of new pending orders.
The pending orders were stored inside groups, whenever a new pending order was created it would be placed inside a group that was awaiting payment. The quickorder interface was capable of processing a huge amount of orders since at this point the Shopify API hadn't needed to be touched at all, so I was at no risk of running into API limits.
When a user decided it was time to make payment for their current pending orders, they were able to navigate to an open group and launch an embedded Stripe or PayPal checkout. Using the respective APIs, I could take a completed order webhook, check the authenticity and make sure the data matched, and then using the Shopify Admin API, Rails Active Job and the Delayed Job queuing library I could turn the pending orders into real Shopify orders without the risk of hitting API limits.
Once a working MVP had been created, we agreed to let selected users test the new quickorder features and provide feedback for tweaks and feature requests.
Ultimately this feedback resulted in the addition of an edit and delete function for each pending order individually, as well as a "wipe" function for outstanding groups.
This process was found to cut the time of processing orders down from 4 minutes per order to 20 seconds per order.