Can we pay for a Pickup Order in-location using Terminal at time of pickup?

Hi all,

I’d like to know if it’s possible to use Terminal to pay for an Order created via the Order API, so that the payment created through Terminal Checkout is automatically linked to the order.

This would be very useful for Pickup Orders where we want to give the customer the option to pay with card in-store for Orders created earlier.

1 Like

Unfortunately there’s no way to pass an order_id to the CreateTerminalCheckout endpoint. In theory, you could create the order, and pay for the amount of the order using the terminal, and then call UpdateOrder to mark it as completed, but even then it wouldn’t be linked within Square. I’ll update this to be a feature request, thank you!

+1 for this. On top of the pickup use-case, it would also be very useful in a kiosk environment where the customer uses the app interface to generate an order, which can then be paid for in situ via terminal.

The Terminal API is super-useful as it is, but the specific pain-point is not having a mechanism to associate a terminal-generated Payment with its corresponding Order - unless I’m missing something, terminal API payments are necessarily custom amounts, so you lose out on all the Order functionality like stock control.

Interestingly, if you run the terminal in “interactive mode” (in lieu of any better name) all the Order functionality you would expect to exist does, which suggests an “assign terminal Payment to Order” isn’t too far removed from what’s already going on under the hood?

In the meantime, will investigate the UpdateOrder approach, cheers for the idea :slight_smile:

Just following up for anyone else looking at this issue. Unfortunately, to utilize the UpdateOrder approach you have to apply a 100% discount to the Order before you can push it to COMPLETED (which in hindsight makes perfect sense that you cannot complete an Order with an outstanding balance).

For some, this might be a viable workaround, but be advised your reporting will be shot to pieces - quantities of items sold, stock control, and fulfillment will reflect correctly, but your gross and net sales figures will be zero (or, if you also use this approach in tandem with traditional POS, just entirely wrong.)

@sjosey is there a mechanism I’ve overlooked to circumvent that? (in lieu of CreateTerminalCheckout optionally accepting an order_id instead of a custom amount, which would be amaaazing :wink:)

Hi @sjosey, just wanted to reply and mention I’d be super interested in this as well! Not just for paying later via Terminal payments at time of pickup but via other in-person sources such as Reader SDK, Square POS, etc. Perhaps there’d be a way to mark Orders as unpaid so that a merchant can decide how they want to process it (start the order now, pay later, etc).

As emdienn mentioned, having the reporting broken in Square dashboard analysis isn’t ideal for the merchant’s end so a $0 order isn’t a great workaround.

1 Like

Hi @sjosey, any update on this feature request ( paying for an order using CreateTerminalCheckout API ) ?
I am working on integrating our mobile app with Square for a customer and this is one of the key requirements. Can you please give us an implementation timeline for this - my customer is inquiring since they have already invested in Square ( have an account set up, got Square hardware and are processing transactions using Square ) ? Thanks !

Unfortunately there is still no feature that allows this sort of behavior, and I do not currently have an ETA on when it will be available.

Why not use the Invoices API as an intermediary?
Workflow:
A request is sent through your app to the create_order endpoint, which can then return the order_id. The order_id can then be fed into the Invoices API to create an invoice that is visible across all of your Square infrastructure. Once the customer arrives to pickup their order, you can open the invoice through the POS/terminal and mark it as paid. The Invoices API also does not require interaction with the customers API - if no customer is found, it just sends the invoice to the e-mail provided.

Am I missing something?

Source:

https://squareup.com/help/us/en/article/5781-invoices-on-your-square-point-of-sale-app

Blockquote

Accept payments for Invoices from the Point of Sale App

You can use the Square app to complete any invoices sent from your app or Dashboard.

  1. Select Invoices from the navigation menu.
  2. Click on the invoice from your list or learn how to create an Invoice on your mobile device > tap Add Payment .
  3. Swipe, Insert, or Tap your customer’s card, charge a saved card on file, or select a separate tender type (Cash, Gift Card, Check or Other.)
  4. You’ll see a final screen that reads Invoice Paid after the payment completes.

Your customer will automatically receive payment confirmation to the email or phone number (if you chose to share manually) entered for their Invoice.

Note : Invoice tipping is available and is configurable based on what platform (Android or iOS) you are using.

  • Android : If Tipping is enabled within the Point of Sale settings then customers will be able to tip for all Invoices and payments processed through the app.
  • iOS : Tipping will only be available if enabled when the Invoice is created. Point of Sale Tipping settings do not affect Invoices.

Note : Invoice payments do not support paper signatures and all card signatures will be on the device screen, regardless of whether the device setting Customer Signs on Device is disabled.

Edited for clarity:

Only paid orders will be visible to the POS app and orders subsection (which also controls kitchen ticket printing/routing). So those orders would not visible/pushed to the POS for prep before the customer arrives, unfortunately. There is no current workaround for this as far as I’m aware.

Edit 2: I’m also generally skeptical that the payment of an invoice at POS would produce an order ticket or route to configured kitchen printers or KDS.

Sorry, I should have clarified - I was only talking about paying for an order created through the orders API using terminal, answering @buhrmi 's original question,

So a client would place an order through the orders API. Once that order has been created, an invoice can be generated using the invoices API. While the order object itself (including fulfillment details) would not be visible to the POS, a created invoice would be. The invoice could then be brought up on the POS, settled with a terminal checkout, marking the invoice as paid and linking the order in the system.
I’m assuming that since the order is created through the orders API, there is a secondary system for line tickets that gets input from the orders API.

I definitely appreciate the clever workaround! The original post subject indicates “Pickup Order”, so that implies the developer is using orders API to push orders for fulfillment to POS which requires online payment as indicated by @sjosey and unfortunately the invoice workaround wouldn’t apply.

Edit: I updated my previous answer to try and offer some clarity as to why the workaround unfortunately doesn’t work for restaurant operations

That definitely explains it, and makes a lot of sense. I’m currently building a headless express backend based off of the node_orders-payment example from GitHub, so something more in line with that is what I had in my head. Speaking of which, thank you all very much for the incredible resources you provide! It has made building something for myself really straightforward.

In our case we are developing ticket processing mobile app for HVAC industry and need to be able to initiate itemized sales from within our app that could use either Square Reader or Square Terminal hardware for taking “card present” payments. Our customer who hired us to implement this is getting frustrated since the only way to do this seems to be through manual credit card entry ( which is more expensive per transaction ) which begs the question - Why go through having all this credit card processing hardware if in the end you are forced to enter the credit details manually anyway?
My follow up question is this - What API endpoint does the Square mobile app use to issue itemized sales that support tap or insert (“card present”) payments?

Edit 1: We are based in Canada, so we can’t use Square Reader SDK for that ( Square Reader SDK is only available for use within United States )

Edit 2: Never mind Square Reader SDK - apparently it does not support itemized transactions anyway:“Reader SDK does not support itemized transactions. Transactions processed with Reader SDK appear on buyer receipts and in the Square Seller Dashboard with an optional note and the total transaction amount.”

@Jordan would the workaround I proposed, using the Invoices API as an intermediary for capture on a Square terminal, work for @INFOtrac 's use case?

@mniaey and @Jordan, here is more info just to give you both more context on what we are trying to implement here for our customer using Square:

  • The customer is an HVAC service company that sends out techs into the field to do service calls \ HVAC installs.
  • Service technicians in the field need to be able to process itemized sales using Square hardware ( “card present” ) at the end of a service call, initiated from within our custom written mobile app
  • All related inventory \ service items that would be available as part of an order, live in Square - our app just takes care of calendaring \ scheduling and documenting work performed and few other customer related details ( we have an accompanying desktop system that comes with the mobile app )
  • Just to re-iterate, the payments need to be processed on-site in “card present” scenario - when a technician is done doing a service call, they need to be able to specify any parts \ items used ( and \ or service performed ) and add any installation \ service fees applicable and then take a payment using a Square hardware device in a “card present” scenario. That payment would be initiated from within our app ( our app can show available inventory\service items from Square, create related Square order etc. ) and then linked internally to a record in our database.
  • Personally I don’t think invoice based work-around suggested by @mniaey would work ( although I do appreciate the effort that went into trying to come up with this work-around given limited info ). The reason being, the invoice scenario would circumvent “card present” payment option and force the users to enter credit card details manually online ( unless I am misunderstanding parts of invoices API and related workflow ).

I haven’t personally tested this, however, yes, at first glance, it does seem that creating an invoice from your custom app and switching to the POS app for final payment would work. The drawbacks are that each technician must have a Square login the Square app installed on the device. Switching betweens custom app and the Square app would be manual.

Any changes in the API @Jordan that would support our original request - pushing itemized orders for payment on a terminal device?
I am asking since I saw this in my e-mail today implying that itemized order payment might be possible:

Also snippet from Orders API - Square API Reference implies that it is possible to push itemized orders for payment on a terminal device:

“You can itemize payments using custom line items or catalog objects, send orders to physical Point of Sale devices to be fulfilled, attach a customer to a payment, and more.”

Upon quick inspection of Terminal, Orders and Payment APIs I don’t see anything obvious allowing us to do what the snippet above states: to " send orders to physical Point of Sale devices to be fulfilled"

Can you @Jordan please bring me up to date on the API - am I missing something here, or the documentation ( cited above ) is just not correct.

Thanks,
INFOtrac Dev

:wave: We’ve just released :rocket: Terminal API beta features including order itemization on the Terminal, delayed capture to authorize a payment upfront and collect funds later, card on file for recurring purchases, and app fees so you can monetize on payments processed via Terminal API. Learn more . :tada: