Uses geometric algebra to calculate the spherical polar position vector, and then take derivatives to find the trivector volume element (Jacobian).

<< GA30`;

ClearAll[ii,jj,kk,b1, b2, b3,ej,x, xr, xt, xp, r]
ii=Bivector[1,1, 2];
kk = Bivector[1,3,1];
b1 = Vector[1,1];
b2 = Vector[1,2];
b3 = Vector[1,3];
jj[phi_]=kk ** (Cos[phi]+ii Sin[phi]);
ej[t_,p_]=Cos[t]+jj[p] Sin[t];
x[r_,t_,p_]=r (b3 ** ej[t,p]);

xr[r_,theta_,phi_]=D[x[a,theta,phi],a]/.a->r;
xt[r_,theta_,phi_]=D[x[r,t,phi],t]/.t->theta;
xp[r_,theta_,phi_]=D[x[r,theta,p],p]/.p->phi;

{x[r, θ, ϕ],
xr[r, θ, ϕ],
xt[r, θ, ϕ],
xp[r, θ, ϕ]} // Column

 xr[r, θ, ϕ] **
xt[r, θ, ϕ] **
xp[r, θ, ϕ]

{e1,e2,e3} = IdentityMatrix[3];

(*probably a better way to do this with Map or MapThread*)
jacobean = {
{xr[r, θ, ϕ] . b1,xr[r, θ, ϕ] . b2,xr[r, θ, ϕ] . b3},
{xt[r, θ, ϕ] . b1,xt[r, θ, ϕ] . b2,xt[r, θ, ϕ] . b3},
{xp[r, θ, ϕ] . b1,xp[r, θ, ϕ] . b2,xp[r, θ, ϕ] . b3}};

Det[  jacobean ] // Simplify