Integrations ยท Payment providers
WooCommerce orders and refunds, each tied to the visit that sold it.
Approve Tally in one click on WooCommerce's own screen, from Tally or the Tally WordPress plugin, or connect with a REST API key. Tally imports the past 365 days, refunds included, adds two webhooks for what comes next, and ties each order to its buyer's visit.
14 days free, no card needed.
01What Tally reads
- Every paid order: processing, completed or refunded, or one with a payment date that was cancelled later. Cash on delivery counts from processing; pending, on-hold, failed and draft orders aren't sales.
- The order's total less its tax, with shipping and fees in and discounts already off, read exactly in the order's currency and converted to US cents at the European Central Bank's rate for its day.
- Each refund at the moment it was made, with the tax it gave back: an itemised refund carries its own, a refund by amount gives back the order's share.
- The past 365 days when you connect, then each order within seconds through two webhooks Tally adds, order created and order updated.
- A catch-up every 30 minutes that reads the orders changed since the last one and turns a switched-off webhook back on, so a delivery that never arrived is never lost.
- Only what the numbers need: amounts, dates, status, refunds, and hashes of the order key and the billing email. Names, addresses, phone numbers and line items are never stored.
02How a sale finds its visit
- Order-received pageWith Tally's snippet on the store, the buyer's visit to the order-received page ties the order to that visitor: the order key in the page's address is kept only as a hash and matched to the order. High confidence, with nothing to add to WooCommerce.
- Visitor id on the orderThe Tally WordPress plugin saves the visitor's id on the order at checkout, classic or block, so buyers who never reach that page link too; without the plugin, a few lines in functions.php do the same. High confidence, in cookie mode or after consent.
- EmailThe billing email, hashed as it arrives, matches a tally('identify') call on your site. Medium confidence.
- RefundsA refund takes the link of the order it gives money back on.
03What it can't read
- Renewal orders from WooCommerce Subscriptions aren't told apart as renewals: each counts as a sale of its own, linked by its own evidence, and the paid extension hasn't been tested.
- If the store charges through your own Stripe account, connect WooCommerce or that Stripe account, not both: each would count the same sale.
- WooCommerce has no test mode of its own, so an order a gateway makes in its test mode is an ordinary order and counts as a sale.
- A store on plain HTTP can't connect, since WooCommerce takes keys only over HTTPS.
- A store feeds only one site at a time; connecting it to a second site is refused until it's disconnected from the first.
04Connecting it
- On your site's Integrations page, type the store's address and choose Approve in WooCommerce, or use the Tally WordPress plugin's Connect WooCommerce to Tally button. The store asks an administrator or shop manager to approve Tally, and makes the key itself.
- Or make the key by hand: in WordPress, open WooCommerce, Settings, Advanced, REST API, choose Add key, set Permissions to Read/Write, and paste the consumer key and secret with the store's address.
- Read/Write is only for Tally's own two webhooks; it never changes an order. The key is checked against the store, then the past 365 days come in, refunds included.
- Install the Tally WordPress plugin and paste your Site ID: it puts the snippet on every page, the order-received page included, and saves each buyer's visitor id on the order. Or paste the snippet into your theme's header.
- Without the plugin, add the functions.php lines below for buyers a payment gateway never sends back to the order-received page; the Coverage page gives them too.
What the REST API key needs
Tally asks for a REST API key that can do only this, and checks each permission with a real call when you paste it, so a missing one is named:
| Permission | Access | Why |
|---|---|---|
| Orders | Read | Every paid order: its amount and tax, and the customer's email (hashed at once, never stored). Names and addresses are never stored. |
| Refunds | Read | When each refund happened, and how much tax it gave back. |
| Webhooks | Write | Tally adds its own two webhooks (order created, order updated), so sales arrive within seconds. It writes nothing else. |
How to make it: WooCommerce's guide.
Without the plugin: the visitor's id saved on the order (functions.php)
// Your theme's functions.php, or a code snippets plugin: saves the visitor's id on the
// order at checkout, for buyers who never reach the order-received page.
function tally_save_visitor_id( $order ) {
$id = isset( $_COOKIE['_tally_vid'] ) ? $_COOKIE['_tally_vid'] : '';
if ( preg_match( '/^[A-Za-z0-9_-]{8,64}$/', $id ) ) {
$order->update_meta_data( 'tally_visitor_id', $id );
}
}
add_action( 'woocommerce_checkout_create_order', 'tally_save_visitor_id' );
add_action( 'woocommerce_store_api_checkout_update_order_meta', 'tally_save_visitor_id' );
05Questions
Is there a WordPress plugin?
Yes, the Tally WordPress plugin. Paste your Site ID and it adds the snippet to every page, leaves signed-in administrators out, saves the buyer's visitor id on each WooCommerce order at checkout, and its Connect WooCommerce to Tally button opens WooCommerce's approval screen. It replaces the functions.php lines.
Can I connect without copying keys?
Yes. Type the store's address on the Integrations page and approve Tally on WooCommerce's own screen: the store makes a Read/Write key and hands it over, and you copy nothing. Revoke it any time under WooCommerce, Settings, Advanced, REST API.
What if a webhook delivery fails?
WooCommerce doesn't retry a delivery, and it switches a webhook off after a run of failures. Every 30 minutes Tally reads the orders that changed since it last looked and turns a switched-off webhook back on, so the order still arrives.
Does it work with the block checkout?
Yes. The order-received page is the same after both checkouts, and the functions.php lines save the visitor's id on classic and block checkout alike; both were tested on WooCommerce 11.2.
My host strips the Authorization header. Will the store connect?
Yes. When a store answers as if no key was sent, Tally sends the key as query parameters over HTTPS instead, as WooCommerce documents, and a site without pretty permalinks is reached through ?rest_route=.