diff --git a/plugins/otp/README.md b/plugins/otp/README.md
index 52ad9525b..e3dbece5a 100644
--- a/plugins/otp/README.md
+++ b/plugins/otp/README.md
@@ -19,4 +19,6 @@ Provided aliases:
 - `ot`: generates a MFA code based on the given key and copies it to the clipboard
   (on Linux it relies on xsel, on MacOS X it uses pbcopy instead).
 
-The plugin uses `$HOME/.otp` to store its internal files.
+The plugin stores its internal files in `$OTP_HOME`, which can be set in your zshrc.
+If `$OTP_HOME` is not set it defaults to either `$HOME/.otp` or `$XDG_DATA_HOME/otp`,
+depending on whether `~/.otp` already exists, or whether `$XDG_DATA_HOME` is set.
diff --git a/plugins/otp/otp.plugin.zsh b/plugins/otp/otp.plugin.zsh
index 8be125c93..aec9840b7 100644
--- a/plugins/otp/otp.plugin.zsh
+++ b/plugins/otp/otp.plugin.zsh
@@ -1,4 +1,10 @@
-export OTP_HOME=~/.otp
+if [[ -z "$OTP_HOME" ]]; then
+  if [[ ! -d "$HOME/.otp" ]] && [[ -n "$XDG_DATA_HOME" ]]; then
+    export OTP_HOME="$XDG_DATA_HOME/otp"
+  else
+    export OTP_HOME=~/.otp
+  fi
+fi
 mkdir -p $OTP_HOME
 
 function ot () {