# Architecture

This page explains the technical architecture of WCPOS for developers and advanced users.

## Two-Part System[​](#two-part-system "Direct link to Two-Part System")

WCPOS is designed as a two-part system:

1. **PHP Plugin:** Hosted on your server, this is a relatively small plugin which extends the [WooCommerce REST API](/reference/wc-rest-api.md).

2. **JavaScript Client:** This runs locally in your browser or the desktop app, and later on iOS and Android apps.

You can think of it as two separate worlds:

* The *PHP world* is where data management happens using WordPress and WooCommerce.
* The *JavaScript world* replicates your WooCommerce store locally, optimised for fast searching and offline use.

![pos-client-woo-server](data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0ic2VxdWVuY2UiIHJvbGU9ImdyYXBoaWNzLWRvY3VtZW50IGRvY3VtZW50IiB2aWV3Qm94PSItNTAgLTEwIDY3OC41IDQ5MCIgc3R5bGU9Im1heC13aWR0aDogMTAwJTtmb250LWZhbWlseTogc2Fucy1zZXJpZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9ImdyYXBoLWRpdiIgaGVpZ2h0PSIxMDAlIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgPGRlZnM+CiAgICA8bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjcuOSIgaWQ9ImFycm93aGVhZCI+CiAgICAgIDxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiI+PC9wYXRoPgogICAgPC9tYXJrZXI+CiAgICA8c3ltYm9sIGlkPSJ3b29jb21tZXJjZS1sb2dvIiB2aWV3Qm94PSIwIDAgMjU2IDE1MyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPgogICAgICA8cGF0aCBkPSJtMjMuNzU5IDBoMjA4LjM4YzEzLjE4NyAwIDIzLjg2MyAxMC42NzUgMjMuODYzIDIzLjg2M3Y3OS41NDJjMCAxMy4xODctMTAuNjc1IDIzLjg2My0yMy44NjMgMjMuODYzaC03NC43MjdsMTAuMjU3IDI1LjExOC00NS4xMDktMjUuMTE4aC05OC42OTVjLTEzLjE4NyAwLTIzLjg2My0xMC42NzUtMjMuODYzLTIzLjg2M3YtNzkuNTQyYy0wLjEwNDY2LTEzLjA4MyAxMC41NzEtMjMuODYzIDIzLjc1OC0yMy44NjN6IiBmaWxsPSIjN2Y1NGIzIi8+CiAgICAgIDxwYXRoIGQ9Im0xNC41NzggMjEuNzVjMS40NTY5LTEuOTc3MiAzLjY0MjMtMy4wMTc5IDYuNTU2MS0zLjIyNiA1LjMwNzMtMC40MTYyNiA4LjMyNTIgMi4wODEzIDkuMDUzNyA3LjQ5MjcgMy4yMjYgMjEuNzUgNi43NjQyIDQwLjE2OSAxMC41MTEgNTUuMjU5bDIyLjc5LTQzLjM5NWMyLjA4MTMtMy45NTQ1IDQuNjgyOS02LjAzNTggNy44MDQ5LTYuMjQzOSA0LjU3ODktMC4zMTIyIDcuMzg4NiAyLjYwMTYgOC41MzMzIDguNzQxNSAyLjYwMTYgMTMuODQxIDUuOTMxNyAyNS42IDkuODg2MiAzNS41OSAyLjcwNTctMjYuNDMzIDcuMjg0Ni00NS40NzYgMTMuNzM3LTU3LjIzNiAxLjU2MS0yLjkxMzggMy44NTA0LTQuMzcwNyA2Ljg2ODMtNC41Nzg5IDIuMzkzNS0wLjIwODEzIDQuNTc4OSAwLjUyMDMzIDYuNTU2MSAyLjA4MTMgMS45NzcyIDEuNTYxIDMuMDE3OSAzLjUzODIgMy4yMjYgNS45MzE3IDAuMTA0MDYgMS44NzMyLTAuMjA4MTMgMy40MzQxLTEuMDQwNyA0Ljk5NTEtNC4wNTg1IDcuNDkyNy03LjM4ODYgMjAuMDg1LTEwLjA5NCAzNy41NjctMi42MDE2IDE2Ljk2My0zLjUzODIgMzAuMTc5LTIuOTEzOCAzOS42NDkgMC4yMDgxMyAyLjYwMTYtMC4yMDgxMyA0Ljg5MTEtMS4yNDg4IDYuODY4My0xLjI0ODggMi4yODk0LTMuMTIyIDMuNTM4Mi01LjUxNTQgMy43NDYzLTIuNzA1NyAwLjIwODEzLTUuNTE1NC0xLjA0MDYtOC4yMjExLTMuODUwNC05LjY3OC05Ljg4NjItMTcuMzc5LTI0LjY2My0yMi45OTgtNDQuMzMyLTYuNzY0MiAxMy4zMi0xMS43NTkgMjMuMzExLTE0Ljk4NSAyOS45NzEtNi4xMzk4IDExLjc1OS0xMS4zNDMgMTcuNzk1LTE1LjcxNCAxOC4xMDctMi44MDk4IDAuMjA4MTMtNS4yMDMzLTIuMTg1NC03LjI4NDYtNy4xODA1LTUuMzA3My0xMy42MzMtMTEuMDMxLTM5Ljk2MS0xNy4xNzEtNzguOTg1LTAuNDE2MjYtMi43MDU3IDAuMjA4MTMtNS4wOTkyIDEuNjY1LTYuOTcyNHptMjIzLjY0IDE2LjMzOGMtMy43NDYzLTYuNTU2MS05LjI2MTgtMTAuNTExLTE2LjY1LTEyLjA3Mi0xLjk3NzItMC40MTYyNi0zLjg1MDQtMC42MjQzOS01LjYxOTUtMC42MjQzOS05Ljk5MDIgMC0xOC4xMDcgNS4yMDMzLTI0LjQ1NSAxNS42MS01LjQxMTQgOC44NDU1LTguMTE3MSAxOC42MjgtOC4xMTcxIDI5LjM0NiAwIDguMDEzIDEuNjY1IDE0Ljg4MSA0Ljk5NTEgMjAuNjA1IDMuNzQ2MyA2LjU1NjEgOS4yNjE4IDEwLjUxMSAxNi42NSAxMi4wNzIgMS45NzcyIDAuNDE2MjYgMy44NTA0IDAuNjI0MzkgNS42MTk1IDAuNjI0MzkgMTAuMDk0IDAgMTguMjExLTUuMjAzMyAyNC40NTUtMTUuNjEgNS40MTE0LTguOTQ5NiA4LjExNzEtMTguNzMyIDguMTE3MS0yOS40NSAwLjEwNDA2LTguMTE3MS0xLjY2NS0xNC44ODEtNC45OTUxLTIwLjUwMXptLTEzLjExMiAyOC44MjZjLTEuNDU2OSA2Ljg2ODMtNC4wNTg1IDExLjk2Ny03LjkwODkgMTUuNDAyLTMuMDE3OSAyLjcwNTctNS44Mjc2IDMuODUwNC04LjQyOTMgMy4zMzAxLTIuNDk3Ni0wLjUyMDMzLTQuNTc4OS0yLjcwNTctNi4xMzk4LTYuNzY0Mi0xLjI0ODgtMy4yMjYtMS44NzMyLTYuNDUyLTEuODczMi05LjQ2OTkgMC0yLjYwMTYgMC4yMDgxMy01LjIwMzMgMC43Mjg0Ni03LjU5NjcgMC45MzY1OS00LjI2NjcgMi43MDU3LTguNDI5MyA1LjUxNTQtMTIuMzg0IDMuNDM0MS01LjA5OTIgNy4wNzY0LTcuMTgwNSAxMC44MjMtNi40NTIgMi40OTc2IDAuNTIwMzMgNC41Nzg5IDIuNzA1NyA2LjEzOTggNi43NjQyIDEuMjQ4OCAzLjIyNiAxLjg3MzIgNi40NTIgMS44NzMyIDkuNDY5OSAwIDIuNzA1Ny0wLjIwODEzIDUuMzA3My0wLjcyODQ2IDcuNzAwOHptLTUyLjAzMy0yOC44MjZjLTMuNzQ2My02LjU1NjEtOS4zNjU5LTEwLjUxMS0xNi42NS0xMi4wNzItMS45NzcyLTAuNDE2MjYtMy44NTA0LTAuNjI0MzktNS42MTk1LTAuNjI0MzktOS45OTAyIDAtMTguMTA3IDUuMjAzMy0yNC40NTUgMTUuNjEtNS40MTE0IDguODQ1NS04LjExNzEgMTguNjI4LTguMTE3MSAyOS4zNDYgMCA4LjAxMyAxLjY2NSAxNC44ODEgNC45OTUxIDIwLjYwNSAzLjc0NjMgNi41NTYxIDkuMjYxOCAxMC41MTEgMTYuNjUgMTIuMDcyIDEuOTc3MiAwLjQxNjI2IDMuODUwNCAwLjYyNDM5IDUuNjE5NSAwLjYyNDM5IDEwLjA5NCAwIDE4LjIxMS01LjIwMzMgMjQuNDU1LTE1LjYxIDUuNDExNC04Ljk0OTYgOC4xMTcxLTE4LjczMiA4LjExNzEtMjkuNDUgMC04LjExNzEtMS42NjUtMTQuODgxLTQuOTk1MS0yMC41MDF6bS0xMy4yMTYgMjguODI2Yy0xLjQ1NjkgNi44NjgzLTQuMDU4NSAxMS45NjctNy45MDg5IDE1LjQwMi0zLjAxNzkgMi43MDU3LTUuODI3NiAzLjg1MDQtOC40MjkzIDMuMzMwMS0yLjQ5NzYtMC41MjAzMy00LjU3ODktMi43MDU3LTYuMTM5OC02Ljc2NDItMS4yNDg4LTMuMjI2LTEuODczMi02LjQ1Mi0xLjg3MzItOS40Njk5IDAtMi42MDE2IDAuMjA4MTMtNS4yMDMzIDAuNzI4NDYtNy41OTY3IDAuOTM2NTgtNC4yNjY3IDIuNzA1Ny04LjQyOTMgNS41MTU0LTEyLjM4NCAzLjQzNDEtNS4wOTkyIDcuMDc2NC03LjE4MDUgMTAuODIzLTYuNDUyIDIuNDk3NiAwLjUyMDMzIDQuNTc4OSAyLjcwNTcgNi4xMzk4IDYuNzY0MiAxLjI0ODggMy4yMjYgMS44NzMyIDYuNDUyIDEuODczMiA5LjQ2OTkgMC4xMDQwNiAyLjcwNTctMC4yMDgxMyA1LjMwNzMtMC43Mjg0NiA3LjcwMDh6IiBmaWxsPSIjZmZmIi8+CiAgICA8L3N5bWJvbD4KICAgIDxzeW1ib2wgaWQ9IndjcG9zLWxvZ28iIHZpZXdCb3g9IjAgMCAxMjYwIDEyNjAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4KICAgICAgPGc+CiAgICAgICAgPHBhdGggZmlsbD0iI0NEMkMyNCIgZD0iTTAsOTBDMCwzMCwzMCwwLDkwLDBoOTB2MjcwYzAsNDkuNy00MC4zLDkwLTkwLDkwUzAsMzE5LjcsMCwyNzBWOTB6IE0zNjAsMGgxODB2MjcwYzAsNDkuNy00MC4zLDkwLTkwLDkwCiAgICAgICAgICBzLTkwLTQwLjMtOTAtOTBWMHogTTcyMCwwaDE4MHYyNzBjMCw0OS43LTQwLjMsOTAtOTAsOTBzLTkwLTQwLjMtOTAtOTBWMHogTTEwODAsMGg5MGM2MCwwLDkwLDMwLDkwLDkwdjE4MGMwLDQ5LjctNDAuMyw5MC05MCw5MAogICAgICAgICAgcy05MC00MC4zLTkwLTkwVjB6Ii8+CiAgICAgIDwvZz4KICAgIDxnPgoJICAgIDxwYXRoIGZpbGw9IiNGNUU1QzAiIGQ9Ik0xODAsMGgxODB2MjcwYzAsNDkuNy00MC4zLDkwLTkwLDkwcy05MC00MC4zLTkwLTkwVjB6IE01NDAsMGgxODB2MjcwYzAsNDkuNy00MC4zLDkwLTkwLDkwcy05MC00MC4zLTkwLTkwVjAKCQl6IE05MDAsMGgxODB2MjcwYzAsNDkuNy00MC4zLDkwLTkwLDkwYy00OS43LDAtOTAtNDAuMy05MC05MFYweiIvPgogICAgPC9nPgogICAgICA8cGF0aCBmaWxsPSIjMzIzQTQ2IiBkPSJNMTE3MCwzNjAuNWMtNDkuNywwLTkwLTQwLjMtOTAtOTBjMCw0OS43LTQwLjMsOTAtOTAsOTBjLTQ5LjcsMC05MC00MC4zLTkwLTkwYzAsNDkuNy00MC4zLDkwLTkwLDkwCiAgICBzLTkwLTQwLjMtOTAtOTBjMCw0OS43LTQwLjMsOTAtOTAsOTBzLTkwLTQwLjMtOTAtOTBjMCw0OS43LTQwLjMsOTAtOTAsOTBzLTkwLTQwLjMtOTAtOTBjMCw0OS43LTQwLjMsOTAtOTAsOTBzLTkwLTQwLjMtOTAtOTAKICAgIGMwLDQ5LjctNDAuMyw5MC05MCw5MHMtOTAtNDAuMy05MC05MHY5OTBsMzYwLTI3MGg4MTBjNjAsMCw5MC0zMCw5MC05MHYtNjMwQzEyNjAsMzIwLjIsMTIxOS43LDM2MC41LDExNzAsMzYwLjV6IE0yNjAuNSw4MjEKICAgIGMtMzkuMywwLTc1LjMtMTQuNC0xMDMtMzguM1Y5MjRjMCwxNS4yLTEyLjMsMjcuNS0yNy41LDI3LjVzLTI3LjUtMTIuMy0yNy41LTI3LjVWNTMyLjVjMC0xNS4yLDEyLjMtMjcuNSwyNy41LTI3LjUKICAgIHMyNy41LDEyLjMsMjcuNSwyNy41djEwLjhjMjcuNy0yMy44LDYzLjctMzguMywxMDMtMzguM2M4Ny4xLDAsMTU4LDcwLjksMTU4LDE1OEM0MTguNSw3NTAuMSwzNDcuNiw4MjEsMjYwLjUsODIxeiBNNjMwLDgyMQogICAgYy04Ny40LDAtMTU4LjUtNzEuMS0xNTguNS0xNTguNWMwLTg3LjQsNzEuMS0xNTguNSwxNTguNS0xNTguNWM4Ny40LDAsMTU4LjUsNzEuMSwxNTguNSwxNTguNUM3ODguNSw3NDkuOSw3MTcuNCw4MjEsNjMwLDgyMXoKICAgIE05MTQuOSw2MjEuMWMyMi4yLDExLjEsNTguOCwxMy40LDg1LjYsMTMuNGM0OC4zLDAsODQuMyw2LjMsMTEwLjIsMTkuMmMzMC44LDE1LjQsNDcuOCw0MS41LDQ3LjgsNzMuNXMtMTcsNTguMS00Ny44LDczLjUKICAgIGMtMjUuOSwxMi45LTYxLjksMTkuMi0xMTAuMiwxOS4yYy01My4yLDAtMTAxLjgtMTMtMTQ0LjYtMzguN2MtMTMtNy44LTE3LjItMjQuNy05LjQtMzcuN2M3LjgtMTMsMjQuNy0xNy4yLDM3LjctOS40CiAgICBjMzQuMiwyMC41LDczLjMsMzAuOSwxMTYuNCwzMC45YzI2LjgsMCw2My40LTIuMyw4NS42LTEzLjRjMTUuMy03LjcsMTcuNC0xNi4yLDE3LjQtMjQuM3MtMi4xLTE2LjctMTcuNC0yNC4zCiAgICBjLTIyLjItMTEuMS01OC44LTEzLjQtODUuNi0xMy40Yy00OC4zLDAtODQuMy02LjMtMTEwLjItMTkuMmMtMzAuOC0xNS40LTQ3LjgtNDEuNS00Ny44LTczLjVzMTctNTguMSw0Ny44LTczLjUKICAgIGMyNS45LTEyLjksNjEuOS0xOS4yLDExMC4yLTE5LjJjNTMuMiwwLDEwMS44LDEzLDE0NC42LDM4LjdjMTMsNy44LDE3LjIsMjQuNyw5LjQsMzcuN3MtMjQuNywxNy4yLTM3LjcsOS40CiAgICBjLTM0LjItMjAuNS03My4zLTMwLjktMTE2LjQtMzAuOWMtMjYuOCwwLTYzLjQsMi4zLTg1LjYsMTMuNGMtMTUuMyw3LjctMTcuNCwxNi4yLTE3LjQsMjQuM1M4OTkuNiw2MTMuNCw5MTQuOSw2MjEuMXoiLz4KICAgICAgPGNpcmNsZSBmaWxsPSIjMzIzQTQ2IiBjeD0iMjYwLjUiIGN5PSI2NjIuNSIgcj0iMTAzIi8+CiAgICAgIDxjaXJjbGUgZmlsbD0iIzMyM0E0NiIgY3g9IjYzMCIgY3k9IjY2MiIgcj0iMTAzLjUiLz4KICAgIDwvc3ltYm9sPgogIDwvZGVmcz4KICA8Zz4KICAgIDxyZWN0IHJ5PSIzIiByeD0iMyIgaGVpZ2h0PSI2NSIgd2lkdGg9IjE4MyIgc3Ryb2tlPSIjNjY2IiBmaWxsPSIjZWFlYWVhIiB5PSI0MDQiIHg9IjM5NS41Ij48L3JlY3Q+CiAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2cHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGFsaWdubWVudC1iYXNlbGluZT0iY2VudHJhbCIgZG9taW5hbnQtYmFzZWxpbmU9ImhhbmdpbmciIHk9IjQ0MCIgeD0iNDg3IiBmaWxsPSIjMzMzIiBzdHlsZT0iZm9udDogdmFyKC0taWZtLWZvbnQtZmFtaWx5LWJhc2UpIj4KICAgICAgPHRzcGFuIGR5PSIwIiB4PSI0ODciPldvb0NvbW1lcmNlIFNlcnZlcjwvdHNwYW4+CiAgICA8L3RleHQ+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiN3b29jb21tZXJjZS1sb2dvIiB4PSI0NzAiIHk9IjQxNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjE4Ij48L3VzZT4KICA8L2c+CiAgPGc+CiAgICA8cmVjdCByeT0iMyIgcng9IjMiIGhlaWdodD0iNjUiIHdpZHRoPSIxNTAiIHN0cm9rZT0iIzY2NiIgZmlsbD0iI2VhZWFlYSIgeT0iNDA0IiB4PSIwIj48L3JlY3Q+CiAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2cHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGFsaWdubWVudC1iYXNlbGluZT0iY2VudHJhbCIgZG9taW5hbnQtYmFzZWxpbmU9ImhhbmdpbmciIHk9IjQ0MCIgeD0iNzUiIGZpbGw9IiMzMzMiPgogICAgICA8dHNwYW4gZHk9IjAiIHg9Ijc1Ij5KYXZhU2NyaXB0IENsaWVudDwvdHNwYW4+CiAgICA8L3RleHQ+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiN3Y3Bvcy1sb2dvIiB4PSI2NSIgeT0iNDEzIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPjwvdXNlPgogIDwvZz4KICA8Zz4KICAgIDxsaW5lIHN0cm9rZT0iIzk5OSIgc3Ryb2tlLXdpZHRoPSIwLjVweCIgeTI9IjQwNCIgeDI9IjQ4NyIgeTE9IjUiIHgxPSI0ODciPjwvbGluZT4KICAgIDxnPgogICAgICA8cmVjdCByeT0iMyIgcng9IjMiIGhlaWdodD0iNjUiIHdpZHRoPSIxODMiIHN0cm9rZT0iIzY2NiIgZmlsbD0iI2VhZWFlYSIgeT0iMCIgeD0iMzk1LjUiPjwvcmVjdD4KICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNnB4IiBmb250LXdlaWdodD0iNDAwIiBhbGlnbm1lbnQtYmFzZWxpbmU9ImNlbnRyYWwiIGRvbWluYW50LWJhc2VsaW5lPSJoYW5naW5nIiB5PSIzNyIgeD0iNDg3IiBmaWxsPSIjMzMzIj4KICAgICAgICA8dHNwYW4gZHk9IjAiIHg9IjQ4NyI+V29vQ29tbWVyY2UgU2VydmVyPC90c3Bhbj4KICAgICAgPC90ZXh0PgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiN3b29jb21tZXJjZS1sb2dvIiB4PSI0NzAiIHk9IjEyIiB3aWR0aD0iMzAiIGhlaWdodD0iMTgiPjwvdXNlPgogICAgPC9nPgogIDwvZz4KICA8Zz4KICAgIDxsaW5lIHN0cm9rZT0iIzk5OSIgc3Ryb2tlLXdpZHRoPSIwLjVweCIgeTI9IjQwNCIgeDI9Ijc1IiB5MT0iNSIgeDE9Ijc1Ij48L2xpbmU+CiAgICA8Zz4KICAgICAgPHJlY3Qgcnk9IjMiIHJ4PSIzIiBoZWlnaHQ9IjY1IiB3aWR0aD0iMTUwIiBzdHJva2U9IiM2NjYiIGZpbGw9IiNlYWVhZWEiIHk9IjAiIHg9IjAiPjwvcmVjdD4KICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNnB4IiBmb250LXdlaWdodD0iNDAwIiBhbGlnbm1lbnQtYmFzZWxpbmU9ImNlbnRyYWwiIGRvbWluYW50LWJhc2VsaW5lPSJoYW5naW5nIiB5PSIzNyIgeD0iNzUiIGZpbGw9IiMzMzMiPgogICAgICAgIDx0c3BhbiBkeT0iMCIgeD0iNzUiPkphdmFTY3JpcHQgQ2xpZW50PC90c3Bhbj4KICAgICAgPC90ZXh0PgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiN3Y3Bvcy1sb2dvIiB4PSI2NSIgeT0iMTAiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+PC91c2U+CiAgICA8L2c+CiAgPC9nPgogIDxnPgogICAgPHJlY3Qgcnk9IjAiIHJ4PSIwIiBoZWlnaHQ9IjM5IiB3aWR0aD0iMzYyIiBzdHJva2U9IiNFNkE3MDAiIGZpbGw9IiNGRkY4RTYiIHk9IjI0OSIgeD0iMTAwIj48L3JlY3Q+CiAgICA8dGV4dCBmb250LXNpemU9IjE2cHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGR5PSIxZW0iIGFsaWdubWVudC1iYXNlbGluZT0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB5PSIyNTQiIHg9IjI4MSIgZmlsbD0iIzMzMyI+CiAgICAgIDx0c3BhbiB4PSIyODEiPkRhdGEgYXZhaWxhYmxlIGZvciBmYXN0IHNlYXJjaGluZyBhbmQgb2ZmbGluZSB1c2U8L3RzcGFuPgogICAgPC90ZXh0PgogIDwvZz4KICA8dGV4dCBmb250LXNpemU9IjE2cHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGR5PSIxZW0iIGFsaWdubWVudC1iYXNlbGluZT0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB5PSI4MCIgeD0iMjgwIiBmaWxsPSIjMzMzIj5SZXF1ZXN0IHN0b3JlIGRhdGEgKHByb2R1Y3RzLCBjdXN0b21lcnMsIGV0Yy4pPC90ZXh0PgogIDxsaW5lIHN0eWxlPSJmaWxsOiBub25lOyIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQpIiBzdHJva2U9IiMzMzMiIHN0cm9rZS13aWR0aD0iMiIgeTI9IjExMyIgeDI9IjQ4MyIgeTE9IjExMyIgeDE9Ijc2Ij48L2xpbmU+CiAgPHRleHQgZm9udC1zaXplPSIxNnB4IiBmb250LXdlaWdodD0iNDAwIiBkeT0iMWVtIiBhbGlnbm1lbnQtYmFzZWxpbmU9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgeT0iMTI4IiB4PSIyODMiIGZpbGw9IiMzMzMiPkRhdGEgUmVzcG9uc2U8L3RleHQ+CiAgPGxpbmUgc3R5bGU9InN0cm9rZS1kYXNoYXJyYXk6IDMsIDM7IGZpbGw6IG5vbmU7IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZCkiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIyIiB5Mj0iMTYxIiB4Mj0iNzkiIHkxPSIxNjEiIHgxPSI0ODYiPjwvbGluZT4KICA8dGV4dCBmb250LXNpemU9IjE2cHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGR5PSIxZW0iIGFsaWdubWVudC1iYXNlbGluZT0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB5PSIxNzYiIHg9Ijc2IiBmaWxsPSIjMzMzIj5TdG9yZSBkYXRhIGxvY2FsbHk8L3RleHQ+CiAgPHBhdGggc3R5bGU9ImZpbGw6IG5vbmU7IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZCkiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNIDc2LDIwOSBDIDEzNiwxOTkgMTM2LDIzOSA3NiwyMjkiPjwvcGF0aD4KICA8dGV4dCBmb250LXNpemU9IjE2cHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGR5PSIxZW0iIGFsaWdubWVudC1iYXNlbGluZT0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB5PSIzMDMiIHg9IjI4MCIgZmlsbD0iIzMzMyI+U2VuZCB1cGRhdGVzIG9yIG5ldyBkYXRhPC90ZXh0PgogIDxsaW5lIHN0eWxlPSJmaWxsOiBub25lOyIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQpIiBzdHJva2U9IiMzMzMiIHN0cm9rZS13aWR0aD0iMiIgeTI9IjMzNiIgeDI9IjQ4MyIgeTE9IjMzNiIgeDE9Ijc2Ij48L2xpbmU+CiAgPHRleHQgZm9udC1zaXplPSIxNnB4IiBmb250LXdlaWdodD0iNDAwIiBkeT0iMWVtIiBhbGlnbm1lbnQtYmFzZWxpbmU9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgeT0iMzUxIiB4PSIyODMiIGZpbGw9IiMzMzMiPkNvbmZpcm1hdGlvbiBSZXNwb25zZTwvdGV4dD4KICA8bGluZSBzdHlsZT0ic3Ryb2tlLWRhc2hhcnJheTogMywgMzsgZmlsbDogbm9uZTsiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkKSIgc3Ryb2tlPSIjMzMzIiBzdHJva2Utd2lkdGg9IjIiIHkyPSIzODQiIHgyPSI3OSIgeTE9IjM4NCIgeDE9IjQ4NiI+PC9saW5lPgo8L3N2Zz4K)

## Data Synchronization[​](#data-synchronization "Direct link to Data Synchronization")

Data is fetched from WooCommerce using the [WooCommerce REST API](https://woocommerce.github.io/woocommerce-rest-api-docs/). This means the POS has to download every product, variation, product category, customer, tax rate, and more to store them locally.

Although this can be time-consuming initially, once downloaded, they're available instantly without the need to continually fetch from the server.

### What Gets Synced?[​](#what-gets-synced "Direct link to What Gets Synced?")

* Products and variations
* Product categories and tags
* Customers
* Tax rates and tax classes
* Payment gateways (for checkout)
* Orders (for order history in Pro)

### Sync Strategy[​](#sync-strategy "Direct link to Sync Strategy")

WCPOS uses an incremental sync strategy:

1. **Initial sync:** Downloads all data on first load
2. **Incremental updates:** Only fetches changes since the last sync
3. **Background sync:** Periodically checks for updates
4. **Manual sync:** User can trigger a sync at any time

## Architecture Pros and Cons[​](#architecture-pros-and-cons "Direct link to Architecture Pros and Cons")

| Good 😊                                                            | Bad 😟                                                  |
| ------------------------------------------------------------------ | ------------------------------------------------------- |
| Searching local data is instant                                    | Keeping data in sync is challenging                     |
| Cached data available offline                                      | Limited by the WooCommerce REST API                     |
| Ability to create better native apps for desktop, iOS, and Android | WordPress themes and hooks cannot customise the POS app |

## Local Database[​](#local-database "Direct link to Local Database")

The JavaScript client stores data in IndexedDB, a browser-based database. This provides:

* **Persistence:** Data survives browser restarts
* **Performance:** Fast queries without network latency
* **Offline browsing:** Cached data remains accessible without internet

## Checkout Architecture[​](#checkout-architecture "Direct link to Checkout Architecture")

The checkout process uses an iframe/webview that loads the WooCommerce Order Pay page. This approach:

* **Leverages existing payment gateways:** Any WooCommerce payment gateway can work in the POS
* **Maintains security:** Payment processing happens through WooCommerce's secure infrastructure
* **Reduces complexity:** No need to re-implement payment gateway integrations

## API Extensions[​](#api-extensions "Direct link to API Extensions")

The PHP plugin extends the WooCommerce REST API with additional endpoints for POS-specific functionality. See [WooCommerce REST API](/reference/wc-rest-api.md) for details.
