diff --git a/go/svc/invoice/main.go b/go/svc/invoice/main.go
index 8a5ddbe..33bc125 100644
--- a/go/svc/invoice/main.go
+++ b/go/svc/invoice/main.go
@@ -111,45 +111,43 @@
 	}
 }
 
-func (s *service) RenderInvoice(req *pb.RenderInvoiceRequest, srv pb.Invoicer_RenderInvoiceServer) error {
-	sealed, err := s.m.getSealedUid(srv.Context(), req.Uid)
+func (s *service) invoicePDF(ctx context.Context, uid string) ([]byte, error) {
+	sealed, err := s.m.getSealedUid(ctx, uid)
 	if err != nil {
-		if _, ok := status.FromError(err); ok {
-			return err
-		}
-		glog.Errorf("getSealedUid(_, %q): %v", req.Uid, err)
-		return status.Error(codes.Unavailable, "internal server error")
+		return nil, err
 	}
 
 	var rendered []byte
 	if sealed != "" {
 		// Invoice is sealed, return stored PDF.
-		rendered, err = s.m.getRendered(srv.Context(), req.Uid)
+		rendered, err = s.m.getRendered(ctx, uid)
 		if err != nil {
-			if _, ok := status.FromError(err); ok {
-				return err
-			}
-			glog.Errorf("getRendered(_, %q): %v", req.Uid, err)
-			return status.Error(codes.Unavailable, "internal server error")
+			return nil, err
 		}
 	} else {
 		// Invoice is proforma, render.
-		invoice, err := s.m.getInvoice(srv.Context(), req.Uid)
+		invoice, err := s.m.getInvoice(ctx, uid)
 		if err != nil {
-			if _, ok := status.FromError(err); ok {
-				return err
-			}
-			glog.Errorf("getInvoice(_, %q): %v", req.Uid, err)
-			return status.Error(codes.Unavailable, "internal server error")
+			return nil, err
 		}
 
-		glog.Infof("%+v", invoice)
 		rendered, err = renderInvoicePDF(invoice, "xxxx", true)
 		if err != nil {
-			glog.Errorf("renderProformaPDF(_): %v", err)
-			return status.Error(codes.Unavailable, "internal server error")
+			return nil, err
 		}
 	}
+	return rendered, nil
+}
+
+func (s *service) RenderInvoice(req *pb.RenderInvoiceRequest, srv pb.Invoicer_RenderInvoiceServer) error {
+	rendered, err := s.invoicePDF(srv.Context(), req.Uid)
+	if err != nil {
+		if _, ok := status.FromError(err); ok {
+			return err
+		}
+		glog.Errorf("invoicePDF(_, %q): %v", req.Uid, err)
+		return status.Error(codes.Unavailable, "internal server error")
+	}
 
 	chunkSize := 16 * 1024
 	chunk := &pb.RenderInvoiceResponse{}
@@ -201,6 +199,7 @@
 	}
 
 	s := newService(m)
+	s.setupStatusz(mi)
 	pb.RegisterInvoicerServer(mi.GRPC(), s)
 
 	if err := mi.Serve(); err != nil {
