After=network.target means the networking stack has been configured, not that an interface has an address — so a service binding to a specific IP fails at boot and works when started by hand.
[Unit]
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/bin/shop-worker
Restart=on-failure
RestartSec=5
network-online.target is the one that waits, and it only works if Wants= pulls it in — declaring only the ordering without the dependency means the target may never be reached and the ordering is vacuous. Even then it is a best effort. The reliable answer is the same as everywhere else: retry with backoff in the process, and let Restart=on-failure handle the rest.