diff --git a/src/memberdb/register.py b/src/memberdb/register.py
index 68e3d343ce3e0b40576b37e9f2d9d2ebc3380155..57b34a906134fc7352ab8457803e7a721212e9f4 100644
--- a/src/memberdb/register.py
+++ b/src/memberdb/register.py
@@ -1,6 +1,9 @@
 """
 This file implements the member-facing registration workflow. See ../../README.md
 """
+import subprocess
+from subprocess import CalledProcessError, TimeoutExpired
+from os import path
 
 from django.http import HttpResponseRedirect
 from django.shortcuts import render
@@ -10,6 +13,7 @@ from django.utils.safestring import mark_safe
 from django.utils import timezone
 from django.contrib import messages
 from django import forms
+from django.conf import settings
 
 from squarepay.models import MembershipPayment
 from squarepay.dispense import get_item_price
@@ -18,6 +22,28 @@ from .models import Member, Membership, get_membership_choices, make_pending_mem
 from .forms import MyModelForm
 from .views import MyUpdateView
 
+def has_paid_dispense(membership):
+	script = settings.BASE_DIR + "/memberdb/has_paid_dispense.sh"
+
+	cmd = [script, membership.member.username, membership.get_dispense_item()]
+	#log.info("has_paid_dispense: " + str(cmd))
+	try:
+		# get a string containing the output of the program
+		# should be a datestring like "Feb 25 13:48:06"
+		res = subprocess.check_output(cmd, timeout=4, universal_newlines=True)
+		date = datetime.strptime(res, "%b %d %H:%M:%S")
+		return date
+	except CalledProcessError as e:
+		#log.warning("has_paid_dispense returned error code %d, output: '%s'" % (e.returncode, e.output))
+		pass
+	except TimeoutExpired as e:
+		#log.error(e)
+		pass
+	except ValueError:
+		#log.warning("cannot parse date '%s'" % res)
+		pass
+	return None
+
 """
 First step: enter an email address and some details (to fill at least a Member model) to create a pending membership.
 see https://docs.djangoproject.com/en/2.1/ref/models/fields/#error-messages
@@ -55,6 +81,8 @@ class RegisterRenewForm(MyModelForm):
 		m = super().save(commit=False)
 		if (m.display_name == ""):
 			m.display_name = "%s %s" % (m.first_name, m.last_name);
+		m.has_account = m.get_uid() != None
+
 		# must save otherwise membership creation will fail
 		m.save()
 
@@ -100,7 +128,12 @@ class RenewForm(RegisterRenewForm):
 	def save(self, commit=True):
 		m, ms = super().save(commit=False)
 		m.username = self.request.user.username
-		m.has_account = m.get_uid() != None
+		if ms.date_paid is None and ms.payment_method is None:
+			paid = has_paid_dispense(ms)
+			if paid is not None:
+				ms.date_paid = paid
+				ms.payment_method = 'dispense'
+
 		if (commit):
 			m.save()
 			ms.save()