<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Osama Khattak</title>
    <description>The latest articles on DEV Community by Osama Khattak (@osama_khattak_c40f3a9e302).</description>
    <link>https://dev.to/osama_khattak_c40f3a9e302</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4210661%2F393fd25e-be71-4d16-9153-dbe5051d3d1f.jpg</url>
      <title>DEV Community: Osama Khattak</title>
      <link>https://dev.to/osama_khattak_c40f3a9e302</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/osama_khattak_c40f3a9e302"/>
    <language>en</language>
    <item>
      <title>How to Build a Time Tracking App Like Hubstaff: Lessons from Staffvertex</title>
      <dc:creator>Osama Khattak</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:39:51 +0000</pubDate>
      <link>https://dev.to/osama_khattak_c40f3a9e302/how-to-build-a-time-tracking-app-like-hubstaff-lessons-from-staffvertex-mjp</link>
      <guid>https://dev.to/osama_khattak_c40f3a9e302/how-to-build-a-time-tracking-app-like-hubstaff-lessons-from-staffvertex-mjp</guid>
      <description>&lt;p&gt;Every team that bills by the hour ends up with the same argument sooner or later: someone says they worked six hours, the report says four, and nobody can prove which is right. A time tracking app exists to end that argument. That's a harder job than it sounds.&lt;/p&gt;

&lt;p&gt;I build and maintain &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/staffvertex" rel="noopener noreferrer"&gt;Staffvertex&lt;/a&gt;, a time tracking and project management product in the same category as Hubstaff, made at Alphinex Solutions. This article is what I'd tell anyone who wants to build a time tracking app of their own: what matters, what looks important but isn't, and where the real work hides.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a time tracker has to get right
&lt;/h2&gt;

&lt;p&gt;Strip away the dashboards and a time tracker makes three promises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The hours are correct.&lt;/strong&gt; Not roughly correct. Correct enough that a client will pay an invoice built on them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracking costs almost no effort.&lt;/strong&gt; If starting the timer takes more than one click, people forget, and then they fill in timesheets from memory on Friday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's fair to the person being tracked.&lt;/strong&gt; If the team feels watched, they'll resent the tool and find ways around it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every feature decision comes back to one of those three. When I'm unsure whether something belongs in the product, I ask which promise it serves. If the answer is none, it waits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdyj8bwghw72a09slkisp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdyj8bwghw72a09slkisp.webp" alt="Staffvertex home page: free to start, time tracking and project management for teams" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Staffvertex leads with one action: start the timer in one click.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The timer is the product
&lt;/h2&gt;

&lt;p&gt;It's tempting to treat the timer as a solved problem and spend your energy on reports. That's backwards. People touch the timer dozens of times a day and open reports once a week. If the timer is slow, fiddly or unreliable, nothing else you build will matter.&lt;/p&gt;

&lt;p&gt;A good timer does a few things without being asked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starts from wherever the person already is: the desktop app, the browser, or a global keyboard shortcut.&lt;/li&gt;
&lt;li&gt;Remembers the last project and task, because most people switch far less often than you'd expect.&lt;/li&gt;
&lt;li&gt;Never runs twice. Starting a timer on the laptop should stop the one left running in the browser.&lt;/li&gt;
&lt;li&gt;Shows the running time somewhere visible, so a forgotten timer gets noticed in minutes, not days.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point saves more support tickets than any feature I can think of. A timer left running overnight is the most common way hours go wrong, and the fix is mostly visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offline first, or the hours are wrong
&lt;/h2&gt;

&lt;p&gt;Here's the mistake I see in most first attempts: the app sends a request to the server when the timer starts and another when it stops, and treats the server as the source of truth for everything in between. Then someone tracks a flight, a train ride or just a bad afternoon of Wi-Fi, and their hours disappear.&lt;/p&gt;

&lt;p&gt;The Staffvertex desktop app keeps counting when the connection drops and syncs about once a minute when it comes back. That behavior is the difference between a tracker people trust and one they double-check against a notebook.&lt;/p&gt;

&lt;p&gt;If you're designing this yourself, the pieces are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Record time on the device as small, timestamped intervals, written to local storage before anything else happens.&lt;/li&gt;
&lt;li&gt;Send those intervals to the API in batches, each with an id the server can use to ignore duplicates.&lt;/li&gt;
&lt;li&gt;Let the server accept late data. An interval that arrives three hours late is still a real interval.&lt;/li&gt;
&lt;li&gt;Never trust the device clock on its own. Compare it with server time when you can, so changing the computer clock doesn't change the hours. Staffvertex calls this a trusted clock.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rule of thumb&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Design the sync so that sending the same batch twice is harmless. Networks retry, apps crash mid-request, and laptops sleep at the worst possible moment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Idle time is a policy, not a feature
&lt;/h2&gt;

&lt;p&gt;Detecting that nobody has touched the keyboard or mouse for ten minutes is the easy part. Deciding what to do about it is not, because the right answer depends on the team. A design agency might want idle time thrown away. A support team on calls might want it kept, because talking on the phone looks idle to a computer.&lt;/p&gt;

&lt;p&gt;So don't hard-code a rule. Staffvertex lets each team choose whether idle time is kept, discarded, asked about, or whether the timer simply stops. Ask the person first whenever you can. "You were away for 14 minutes, keep this time?" is fair, and it catches the meeting that happened away from the desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots and privacy
&lt;/h2&gt;

&lt;p&gt;Screenshots are the feature buyers ask about and employees dread. I'd build them, because some clients genuinely need proof of work, but I'd build them carefully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Off by default. A team turns them on deliberately, and everyone tracked can see that they're on.&lt;/li&gt;
&lt;li&gt;Blur options, so a screenshot can show that work happened without showing private messages or client data.&lt;/li&gt;
&lt;li&gt;Clear retention, so old screenshots are deleted on a schedule instead of piling up forever.&lt;/li&gt;
&lt;li&gt;Honest operating system permissions. On macOS, screen capture requires the Screen Recording permission, so only ask for it when screenshots are actually enabled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Staffvertex follows that pattern: screenshots are optional and off by default, with blur controls. Activity and app tracking sit in the same bucket. Useful for some teams, invasive for others, so they should be settings, not assumptions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8w2dy257sbix5d76nxu3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8w2dy257sbix5d76nxu3.webp" alt="Staffvertex page explaining what a tracked day looks like, from clocking on to the end of the day" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Explaining a tracked day step by step does more for trust than any privacy policy.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From hours to timesheets to invoices
&lt;/h2&gt;

&lt;p&gt;Tracked time is raw material. The value shows up when it turns into something a manager or client acts on, and the chain usually looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Timesheets.&lt;/strong&gt; A week of intervals grouped by person and day, with overtime calculated and a way to approve or send back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports.&lt;/strong&gt; The same data cut by project, client or task, exportable, and ideally emailed on a schedule so nobody has to remember to run them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invoices and pay.&lt;/strong&gt; Hours multiplied by the right rate. Rates differ per person, per project and sometimes per client, so model them as their own records with start dates, not as one number on the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Staffvertex covers all three, along with project expenses. If you're building a smaller tool, I'd still design the data with invoices in mind from day one. Retrofitting rates onto months of existing time entries is painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  A data model that survives edits
&lt;/h2&gt;

&lt;p&gt;People edit their time. They forget to start the timer, they log a meeting after the fact, they split two hours across two projects. Your data model has to handle that without losing what originally happened.&lt;/p&gt;

&lt;p&gt;Whether you use MongoDB or a relational database, a few decisions hold up well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Store intervals, not totals.&lt;/strong&gt; Each time entry has a start, an end, a user, a project and optionally a task, all in UTC. Durations are calculated, never stored as the only record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record the source.&lt;/strong&gt; Desktop, web, mobile or manual entry. Managers reasonably want to know which hours were added by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep an edit history.&lt;/strong&gt; When someone changes an entry, keep the old values. It settles disputes and it catches bugs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index for the questions you ask most.&lt;/strong&gt; In MongoDB, a compound index on user and start time covers "my week", and one on project and start time covers project reports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store the user's time zone with the entry.&lt;/strong&gt; A day boundary means midnight where the person is, not midnight on the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing the stack
&lt;/h2&gt;

&lt;p&gt;A time tracker is really three apps that share one API: the web app where people plan work and read reports, the desktop app that does the tracking, and the API with its database in the middle.&lt;/p&gt;

&lt;p&gt;For the web app and API, the &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/mern-stack-development" rel="noopener noreferrer"&gt;MERN stack&lt;/a&gt; is a natural fit. Time entries, projects and teams map cleanly to MongoDB documents, Express and Node.js handle a busy API comfortably, and React is a good match for the timer and board interfaces. Staffvertex's web app runs on &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/nextjs-development" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, which adds server rendering for the public marketing and pricing pages, the pages that need to rank on Google.&lt;/p&gt;

&lt;p&gt;The desktop app is its own project. Browser tabs get throttled and closed, so serious tracking needs a desktop client. Staffvertex ships for Windows and macOS. Plan for code signing, auto-updates and the operating system permissions from the start, because each one takes longer than it looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you build your own?
&lt;/h2&gt;

&lt;p&gt;If you just need your own team to track hours, don't build anything. Use an existing tool. Staffvertex has a free plan for a single user, and so do several of its competitors.&lt;/p&gt;

&lt;p&gt;Building makes sense when one of these is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time tracking is the product you want to sell.&lt;/li&gt;
&lt;li&gt;Your workflow is unusual enough that existing tools fight you, such as a specific approval chain or payroll rule.&lt;/li&gt;
&lt;li&gt;You need tracking built into a product you already have, for example a marketplace that bills clients by the hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, start small: the timer, offline sync and a weekly timesheet. Get those trusted first. Screenshots, invoices and integrations can follow once people rely on the core.&lt;/p&gt;

&lt;p&gt;If you're planning a SaaS product like this and want someone who has built one end to end, see &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/mern-stack-development" rel="noopener noreferrer"&gt;how I work on MERN stack projects&lt;/a&gt; or &lt;a href="https://osama-s-porfolio-beige.vercel.app/contact" rel="noopener noreferrer"&gt;tell me what you're building&lt;/a&gt;. You can also look at &lt;a href="https://www.staffvertex.com" rel="noopener noreferrer"&gt;Staffvertex itself&lt;/a&gt; to see these ideas running in production.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://osama-s-porfolio-beige.vercel.app/blog/build-time-tracking-app-like-hubstaff" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt;. I'm Osama Khattak, a MERN stack and Next.js developer in Islamabad. See my work at &lt;a href="https://osama-s-porfolio-beige.vercel.app/" rel="noopener noreferrer"&gt;osama-s-porfolio-beige.vercel.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>node</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Contractor Website Design: How an Instant Quote Form Wins More Leads</title>
      <dc:creator>Osama Khattak</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:39:38 +0000</pubDate>
      <link>https://dev.to/osama_khattak_c40f3a9e302/contractor-website-design-how-an-instant-quote-form-wins-more-leads-1bk8</link>
      <guid>https://dev.to/osama_khattak_c40f3a9e302/contractor-website-design-how-an-instant-quote-form-wins-more-leads-1bk8</guid>
      <description>&lt;p&gt;Picture a homeowner on their phone at 10 pm, wondering what a carport would cost. The website says "Call us for a free quote". It's 10 pm. They close the tab, and by morning they've found someone else.&lt;/p&gt;

&lt;p&gt;That's the problem an instant quote form solves. I built the website for &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/carports-hawaii" rel="noopener noreferrer"&gt;Carports Hawaii&lt;/a&gt;, an aluminium carport, patio cover and pergola company that serves the Hawaiian islands, and gave it an instant-quote form: enter the width and length, see the square footage and a price range. This article covers how I'd design a contractor website around that idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one job of a contractor website
&lt;/h2&gt;

&lt;p&gt;A contractor's website isn't a brochure. Its job is to turn a stranger into a quote request, and everything on the page either helps with that or gets in the way. That makes the plan simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Say what you do and where, in one line, above the fold.&lt;/li&gt;
&lt;li&gt;Show proof: photos of finished jobs, reviews, licence details.&lt;/li&gt;
&lt;li&gt;Make asking for a price effortless, at any hour.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa1l5kls5rdl64zdza6vm.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa1l5kls5rdl64zdza6vm.webp" alt="Carports Hawaii home page: aluminium carports, patio and pool covers with installation" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;The offer, the area served and the next step, all on the first screen.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an instant quote works
&lt;/h2&gt;

&lt;p&gt;Price is the first question everyone has and the last thing most contractor sites answer. Visitors assume the worst when a price is hidden. An instant estimate does three useful things at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It answers the question right away, so the visitor stays on the page.&lt;/li&gt;
&lt;li&gt;It filters out people whose budget is far off, which saves the sales team wasted site visits.&lt;/li&gt;
&lt;li&gt;It gets the visitor to take a small action, entering two numbers, which makes the next step easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Someone who has just seen that their carport falls inside their budget is far more likely to fill in their name and phone number than someone who has seen nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the quote form
&lt;/h2&gt;

&lt;p&gt;The original Carports Hawaii form was four boxes in a single row: width and length to fill in, then the square footage and a price range worked out from them. A few principles make a form like that work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask for measurements before contact details.&lt;/strong&gt; Give the estimate first. Asking for an email before showing anything feels like a trap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the words customers use.&lt;/strong&gt; "Width" and "length" in feet, not "span" and "projection".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculate as they type.&lt;/strong&gt; Square footage should appear the moment both numbers are in, with no button to press.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Place it high on the page.&lt;/strong&gt; On Carports Hawaii it sat directly under the headline. Don't make people hunt for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it work with a thumb.&lt;/strong&gt; Numeric keyboards on phones, big tap targets, and labels that stay visible while typing.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keep the first step tiny&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two inputs and an answer. Anything more, such as roof style, colour or installation date, belongs in the follow-up form after the visitor has seen a number.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Show a range, not a promise
&lt;/h2&gt;

&lt;p&gt;Contractors worry, reasonably, that a website price becomes a promise. The answer is a range plus a clear next step. The live Carports Hawaii site does this well today: its cost estimator gives a low and high figure per square foot, which differs by island, and says the final price is set after a free site inspection.&lt;/p&gt;

&lt;p&gt;That pattern is worth copying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show a low and a high estimate, not one number.&lt;/li&gt;
&lt;li&gt;Adjust for the factors that really change price, such as location or material, and nothing more.&lt;/li&gt;
&lt;li&gt;State what the final price depends on, in one sentence.&lt;/li&gt;
&lt;li&gt;Offer the next step right there: book a free inspection or request an exact quote.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Put trust next to the form
&lt;/h2&gt;

&lt;p&gt;The moment before someone submits their phone number is the moment they wonder whether you're legitimate. Put the proof right beside the form, not on a separate About page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Licence number and years in business.&lt;/li&gt;
&lt;li&gt;Your Google review rating and count, linked to the reviews.&lt;/li&gt;
&lt;li&gt;Three or four photos of real installations, ideally local ones.&lt;/li&gt;
&lt;li&gt;Warranty terms in one line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Carports Hawaii backs this up with a full photo gallery of finished installations. For a visual product like a carport, the gallery is often the most visited page after the home page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7xscbcroeajo8ur35b8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7xscbcroeajo8ur35b8.webp" alt="Carports Hawaii product range and structure guide further down the home page" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Product types and a structure guide answer the next questions before a visitor has to ask.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Service-area pages for local search
&lt;/h2&gt;

&lt;p&gt;Contractors win most of their search traffic from local searches like "carport installation Maui". A single page that lists every area you serve rarely ranks for any of them. Give each real service area its own page with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The area in the title, heading and URL.&lt;/li&gt;
&lt;li&gt;Real local details: jobs completed there, local permit or weather considerations, a local photo.&lt;/li&gt;
&lt;li&gt;The same quote form, so a visitor who lands there can act straight away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid copying one page and swapping the place name. Google treats near-identical pages as one, and visitors notice too. Pair the pages with a complete Google Business Profile, and ask every happy customer for a review. For a deeper look at the technical side, see my &lt;a href="https://osama-s-porfolio-beige.vercel.app/blog/technical-seo-checklist" rel="noopener noreferrer"&gt;technical SEO checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building it in WordPress
&lt;/h2&gt;

&lt;p&gt;Carports Hawaii runs on WordPress, which suits most contractors: the team can add gallery photos and edit pages without a developer. For the quote form itself there are two routes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A form plugin with calculated fields.&lt;/strong&gt; Fine for simple rules such as area multiplied by a rate. Quick to build and easy for the owner to adjust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A small custom script.&lt;/strong&gt; Better when pricing depends on several factors, such as location, size bands and add-ons, or when you want the estimate to update instantly as people type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, keep the rates somewhere the owner can change them. Material costs move, and a form that quotes last year's prices does more harm than no form at all. This is the kind of build my &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/wordpress-development" rel="noopener noreferrer"&gt;WordPress development service&lt;/a&gt; covers, and I design the flow in Figma first when the form is complex, as part of my &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/ui-ux-design" rel="noopener noreferrer"&gt;UI and UX design work&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure what the form brings in
&lt;/h2&gt;

&lt;p&gt;A quote form is only worth what it produces, so measure it from day one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track estimate views and form submissions as separate events in Google Analytics.&lt;/li&gt;
&lt;li&gt;Record where each lead came from: which page, which search, which campaign.&lt;/li&gt;
&lt;li&gt;Ask the sales team which leads became jobs, and compare the form against phone calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then improve one thing at a time. Move the form higher, cut a field, change the button text, and watch the numbers.&lt;/p&gt;

&lt;p&gt;You can see the live site at &lt;a href="https://carportshawaii.com" rel="noopener noreferrer"&gt;carportshawaii.com&lt;/a&gt;. If your own website gets visitors but not enquiries, &lt;a href="https://osama-s-porfolio-beige.vercel.app/contact" rel="noopener noreferrer"&gt;tell me about it&lt;/a&gt;. The fix is often smaller than you'd expect.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://osama-s-porfolio-beige.vercel.app/blog/contractor-website-instant-quote-form" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt;. I'm Osama Khattak, a MERN stack and Next.js developer in Islamabad. See my work at &lt;a href="https://osama-s-porfolio-beige.vercel.app/" rel="noopener noreferrer"&gt;osama-s-porfolio-beige.vercel.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>ux</category>
      <category>marketing</category>
    </item>
    <item>
      <title>How to Build a Furniture Ecommerce Website in Pakistan</title>
      <dc:creator>Osama Khattak</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:39:29 +0000</pubDate>
      <link>https://dev.to/osama_khattak_c40f3a9e302/how-to-build-a-furniture-ecommerce-website-in-pakistan-32b</link>
      <guid>https://dev.to/osama_khattak_c40f3a9e302/how-to-build-a-furniture-ecommerce-website-in-pakistan-32b</guid>
      <description>&lt;p&gt;A sofa can cost more than a phone, it takes two people to carry, and nobody wants to send one back. That's why furniture is one of the hardest categories to sell online. Buyers need far more reassurance than they do for a t-shirt, and the website has to give it to them.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/timbera" rel="noopener noreferrer"&gt;Timbera.pk&lt;/a&gt;, an online furniture store based in Islamabad, on WordPress and WooCommerce. This guide is how I'd plan a furniture ecommerce website for buyers in Pakistan today, from choosing the platform to the checks I run before launch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ilvwr710i4ef10bvf7w.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ilvwr710i4ef10bvf7w.webp" alt="Timbera.pk home page: quality furniture in Pakistan, with a shop now button" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Timbera.pk opens with one clear promise and one button.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why furniture is different online
&lt;/h2&gt;

&lt;p&gt;Three things set furniture apart from most ecommerce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High price, low frequency.&lt;/strong&gt; People buy a bed every few years. They research for longer, compare more, and often visit the site several times before ordering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It has to fit.&lt;/strong&gt; Dimensions matter as much as looks. A dining table that is 10 cm too long for the room is a return, and returns of bulky items are expensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery is part of the product.&lt;/strong&gt; Buyers want to know when it arrives, whether it comes assembled, and who carries it up the stairs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every page on the site should answer at least one of those worries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing a platform: WooCommerce or Shopify
&lt;/h2&gt;

&lt;p&gt;Timbera runs on WordPress with WooCommerce, with Elementor for page layouts. For a Pakistani furniture business, that combination has real advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No monthly platform fee and no transaction fee from the platform itself.&lt;/li&gt;
&lt;li&gt;A wide choice of local payment and courier plugins.&lt;/li&gt;
&lt;li&gt;Full control over product attributes, which you need for filters such as fabric and colour.&lt;/li&gt;
&lt;li&gt;WordPress for content, so buying guides and room ideas live on the same domain as the shop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shopify is faster to start and needs less maintenance. The catch for Pakistan is payments: Shopify's own payment service isn't offered in Pakistan, so you depend on third-party gateways and pay Shopify's extra fee on top. If you choose WooCommerce, budget for hosting, backups and plugin updates instead. If you want help choosing or building, that's exactly what my &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/wordpress-development" rel="noopener noreferrer"&gt;WordPress development service&lt;/a&gt; covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payments that work in Pakistan
&lt;/h2&gt;

&lt;p&gt;Most stores here end up offering a mix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cash on delivery.&lt;/strong&gt; Still expected by many buyers. For expensive pieces, consider asking for a deposit before dispatch, and say so clearly on the product page rather than at checkout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile wallets.&lt;/strong&gt; JazzCash and Easypaisa are widely used and both offer online merchant payments that can be connected to WooCommerce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cards and bank transfer.&lt;/strong&gt; Through a local payment gateway or your bank. Bank transfer with a screenshot of the receipt is common for big orders.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before you go live&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Place a real order with every payment method, on a phone, on mobile data. Payment pages that work on office Wi-Fi and fail on a 4G connection are more common than you'd think.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Structure the catalogue around how people shop
&lt;/h2&gt;

&lt;p&gt;People shop for furniture by room and by type: "sofas", "beds", "dining tables". Timbera's categories follow that: sofas, beds, dining tables, chairs, tables and consoles, mirrors, and book racks and shelves. Keep the top level short and obvious.&lt;/p&gt;

&lt;p&gt;Then use product attributes, not more categories, for the things people filter by. Timbera's shop filters by price, colour and fabric. Set attributes up properly in WooCommerce from the first product. Adding them to 80 products later is slow, manual work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbll7n03w2qq1m3trmqu0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbll7n03w2qq1m3trmqu0.webp" alt="Timbera.pk category rows showing beds and dining tables with prices in rupees" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Category rows with real prices in rupees let people judge the range before clicking.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Product pages that answer the real questions
&lt;/h2&gt;

&lt;p&gt;A furniture product page needs more than a photo and a price. Before someone pays, they want to know:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Exact dimensions&lt;/strong&gt; in centimetres or inches: width, depth, height, and seat height for chairs and sofas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Materials,&lt;/strong&gt; written plainly: solid wood or engineered board, which wood, which fabric.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery time and cost&lt;/strong&gt; for their city, not hidden until checkout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assembly:&lt;/strong&gt; does it arrive assembled, and if not, who does it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Care and warranty,&lt;/strong&gt; plus what happens if it arrives damaged.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Photos come next. Show the piece from several angles, one close-up of the material, and one photo in a real room for scale. Use the same background and lighting across the catalogue, because a consistent catalogue looks like a business that can be trusted with a large order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it fast on a phone
&lt;/h2&gt;

&lt;p&gt;Most furniture browsing in Pakistan starts on a phone, often on mobile data. Large product photos make that the biggest risk to a furniture store's speed. The fixes are well known:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serve images as WebP, sized for the slot they appear in, and lazy-load everything below the first screen.&lt;/li&gt;
&lt;li&gt;Use page caching, and a CDN in front of the site.&lt;/li&gt;
&lt;li&gt;Keep the plugin list short. Each plugin adds scripts to every page, including the ones that don't use it.&lt;/li&gt;
&lt;li&gt;Test on a mid-range Android phone, not only on your laptop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv6zq2cfd3kxxint8ola2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv6zq2cfd3kxxint8ola2.webp" alt="Timbera.pk furniture store on a mobile phone" width="780" height="1688"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;The storefront on a phone: the screen most buyers actually see.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO for a furniture store
&lt;/h2&gt;

&lt;p&gt;Category pages are where a furniture store wins search traffic. Someone searching "sofa set price in Pakistan" wants a page of sofas, not one sofa. So give each category page a short, useful introduction, a descriptive title and a clean URL such as &lt;code&gt;/product-category/sofas/&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write your own product descriptions. Copying the supplier's text gives Google nothing new to rank.&lt;/li&gt;
&lt;li&gt;Add Product structured data with price and availability so search results can show them.&lt;/li&gt;
&lt;li&gt;Name image files and write alt text that describes the piece: "walnut king size bed with upholstered headboard".&lt;/li&gt;
&lt;li&gt;Publish buying guides, such as how to choose a sofa size for your lounge, and link them to the right categories.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you already have a store that isn't getting found, my &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/seo-services" rel="noopener noreferrer"&gt;SEO service&lt;/a&gt; starts with exactly these checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  A launch checklist
&lt;/h2&gt;

&lt;p&gt;Before announcing the store, I go through this list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every page has your own business name, address and policies. Search the whole site for any text left over from the theme's demo content.&lt;/li&gt;
&lt;li&gt;Shipping, returns and payment policies are written for Pakistan, in plain language.&lt;/li&gt;
&lt;li&gt;Every button and link points to the live domain, not a staging copy.&lt;/li&gt;
&lt;li&gt;Test orders with each payment method, on a phone.&lt;/li&gt;
&lt;li&gt;Order emails reach the customer and the shop, and don't land in spam.&lt;/li&gt;
&lt;li&gt;Google Search Console and analytics are set up, and the sitemap is submitted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A furniture website is never really finished. New collections arrive, prices change, and seasonal sales come and go. Build it so the owner can manage all of that without a developer, and keep the developer for the things that matter: speed, payments and search.&lt;/p&gt;

&lt;p&gt;Planning a store of your own? See &lt;a href="https://timbera.pk" rel="noopener noreferrer"&gt;Timbera.pk live&lt;/a&gt;, read the &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/timbera" rel="noopener noreferrer"&gt;Timbera case study&lt;/a&gt;, or &lt;a href="https://osama-s-porfolio-beige.vercel.app/contact" rel="noopener noreferrer"&gt;send me the details of your project&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://osama-s-porfolio-beige.vercel.app/blog/furniture-ecommerce-website-pakistan" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt;. I'm Osama Khattak, a MERN stack and Next.js developer in Islamabad. See my work at &lt;a href="https://osama-s-porfolio-beige.vercel.app/" rel="noopener noreferrer"&gt;osama-s-porfolio-beige.vercel.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>wordpress</category>
      <category>woocommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Hire a MERN Stack Developer: A Practical Checklist</title>
      <dc:creator>Osama Khattak</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:39:17 +0000</pubDate>
      <link>https://dev.to/osama_khattak_c40f3a9e302/how-to-hire-a-mern-stack-developer-a-practical-checklist-a82</link>
      <guid>https://dev.to/osama_khattak_c40f3a9e302/how-to-hire-a-mern-stack-developer-a-practical-checklist-a82</guid>
      <description>&lt;p&gt;I'm a MERN stack developer, so I'm writing this from the other side of the table. I've seen how clients find developers, what they check, and more often what they forget to check. The good news is that most bad hires are avoidable with a few hours of homework before the first call.&lt;/p&gt;

&lt;p&gt;Here's the checklist I'd use if I were hiring a MERN stack developer myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a MERN stack developer actually does
&lt;/h2&gt;

&lt;p&gt;MERN stands for the four pieces of a JavaScript web application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB&lt;/strong&gt;, the database, which stores data as flexible JSON-like documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Express&lt;/strong&gt;, the web framework that defines your API routes on the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt;, the library for building the interface people click on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;, the runtime that runs JavaScript on the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A MERN stack developer can build all four layers, which means one person can take a product from the database to the button. That's the main reason to hire one: fewer handoffs, and nobody saying "that's a back-end problem".&lt;/p&gt;

&lt;h2&gt;
  
  
  Is MERN the right stack for your project?
&lt;/h2&gt;

&lt;p&gt;MERN is a strong choice for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS products and dashboards behind a login.&lt;/li&gt;
&lt;li&gt;Marketplaces, booking systems and internal tools.&lt;/li&gt;
&lt;li&gt;Apps with real-time features such as chat, notifications or live updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not always the best choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public pages that must rank on Google.&lt;/strong&gt; A plain React front end renders in the browser. Use Next.js for those pages, which keeps the same JavaScript skills but renders on the server. I explain the difference on my &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/nextjs-development" rel="noopener noreferrer"&gt;Next.js development page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content sites and simple stores.&lt;/strong&gt; A well-built WordPress site is often faster to launch and easier for your team to edit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heavily relational data,&lt;/strong&gt; such as complex accounting, may suit a relational database better than MongoDB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good developer will tell you when your project doesn't need their favorite stack. Treat that as a point in their favor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freelancer, agency or full-time hire
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A freelancer&lt;/strong&gt; suits a defined project or a first version. You get one accountable person and usually a faster start. The risk is availability, so ask how many projects they run at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agency&lt;/strong&gt; suits work that needs several specialists in parallel. You pay more for coordination, and the person who sold you the project may not be the person writing the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A full-time hire&lt;/strong&gt; suits a product you'll develop for years. The hiring process is slower, but knowledge stays in the company.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many teams start with a freelancer to ship the first version, then hire full-time once the product has proven itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read a developer's portfolio
&lt;/h2&gt;

&lt;p&gt;A portfolio is only useful if you check it properly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the live sites.&lt;/strong&gt; Are they still up? Do they load quickly on your phone? A broken project in a portfolio is worth asking about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask what the developer actually did.&lt;/strong&gt; "Worked on" can mean anything. On my own &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects" rel="noopener noreferrer"&gt;projects page&lt;/a&gt; I spell it out per project. For example, on NetworkUstad my work was SEO, not the design, and the page says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for something close to your project.&lt;/strong&gt; If you're building a SaaS product, a time tracker like &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/staffvertex" rel="noopener noreferrer"&gt;Staffvertex&lt;/a&gt; tells you more than ten landing pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the code if you can.&lt;/strong&gt; A GitHub profile shows how someone names things, structures a project and writes commit messages. Client code is often private, so personal projects count too.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Questions that separate good from good-looking
&lt;/h2&gt;

&lt;p&gt;You don't need to be technical to ask these. Listen for specific, concrete answers rather than buzzwords.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How would you design the database for my app?" A good answer starts with how the data will be read, not just what fields exist, and mentions indexes.&lt;/li&gt;
&lt;li&gt;"How do you handle logins and passwords?" Listen for hashed passwords, secure sessions or tokens, and role checks on the server, not only in the interface.&lt;/li&gt;
&lt;li&gt;"What happens when the API gets bad input?" Validation, clear error messages and no crashes.&lt;/li&gt;
&lt;li&gt;"How will you deploy it, and how do we release updates?" There should be a plan, not "we'll see".&lt;/li&gt;
&lt;li&gt;"What would you build first, and what would you leave out?" Good developers cut scope to ship sooner.&lt;/li&gt;
&lt;li&gt;"How will I know how the project is going?" You want a rhythm: weekly updates, a preview link, a shared task board.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A useful test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask them to explain a past project's architecture in plain English. If they can make it clear to you, they'll be able to explain problems to you during your project too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Run a small paid trial
&lt;/h2&gt;

&lt;p&gt;Before committing to a large project, pay for one small, real piece of work that takes a few days: a single feature, an API endpoint with its screen, or a bug fix in your existing code. You'll learn more about code quality, communication and reliability from that than from any interview. Pay for it. Good developers rarely do unpaid test projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with a developer in Pakistan
&lt;/h2&gt;

&lt;p&gt;Pakistan has a large pool of experienced JavaScript developers, and many work with clients in the US, UK, Europe and the Gulf. I'm based in Islamabad and work with clients remotely over Zoom, Trello and GitHub. A few practical points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time zones.&lt;/strong&gt; Pakistan Standard Time is UTC+5. Afternoons in Pakistan overlap with mornings in the UK and Europe, and Pakistani evenings overlap with mornings on the US East Coast. Agree on a daily window when both sides are online.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication.&lt;/strong&gt; Written updates matter more when you're not in the same room. Ask for a short summary at the end of each week: what shipped, what's next, what's blocked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments.&lt;/strong&gt; Freelance platforms such as Upwork handle payment and escrow. For direct contracts, services like Payoneer and Wise are widely used.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contracts, milestones and handover
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Write down the scope as a list of features and pages, and agree what "done" means for each.&lt;/li&gt;
&lt;li&gt;Split payment into milestones tied to working software you can click through.&lt;/li&gt;
&lt;li&gt;Make sure the code lives in a repository you own, from the first day.&lt;/li&gt;
&lt;li&gt;Agree who owns hosting, domains and third-party accounts. They should be in your name.&lt;/li&gt;
&lt;li&gt;Ask for a handover: how to run the project, how to deploy, and where the important settings live.&lt;/li&gt;
&lt;li&gt;Agree on support after launch, because there will be bugs to fix.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Red flags
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;They agree to everything and never ask a question about your business.&lt;/li&gt;
&lt;li&gt;They want full payment up front for a large project.&lt;/li&gt;
&lt;li&gt;Portfolio links are broken, or they can't say what their part was.&lt;/li&gt;
&lt;li&gt;They want to host your code in their own account with no access for you.&lt;/li&gt;
&lt;li&gt;Estimates come back within minutes, before they've understood the scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're looking for a MERN stack developer for a SaaS product, marketplace or internal tool, here's &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/mern-stack-development" rel="noopener noreferrer"&gt;how I work on MERN stack projects&lt;/a&gt;, and you can read about &lt;a href="https://osama-s-porfolio-beige.vercel.app/about" rel="noopener noreferrer"&gt;my background&lt;/a&gt;. When you're ready, &lt;a href="https://osama-s-porfolio-beige.vercel.app/contact" rel="noopener noreferrer"&gt;tell me about the project&lt;/a&gt;. I'll tell you honestly whether MERN is the right fit.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://osama-s-porfolio-beige.vercel.app/blog/hire-mern-stack-developer" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt;. I'm Osama Khattak, a MERN stack and Next.js developer in Islamabad. See my work at &lt;a href="https://osama-s-porfolio-beige.vercel.app/" rel="noopener noreferrer"&gt;osama-s-porfolio-beige.vercel.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mern</category>
      <category>career</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Technical SEO Checklist for Blogs and Content Sites</title>
      <dc:creator>Osama Khattak</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:38:57 +0000</pubDate>
      <link>https://dev.to/osama_khattak_c40f3a9e302/technical-seo-checklist-for-blogs-and-content-sites-kl</link>
      <guid>https://dev.to/osama_khattak_c40f3a9e302/technical-seo-checklist-for-blogs-and-content-sites-kl</guid>
      <description>&lt;p&gt;I started my career in SEO, before I wrote much code. At Nausal Technologies, the work I did on client sites grew their traffic by 60%, ranked more than 50 target keywords and lifted organic leads by 35%. Very little of that came from clever tricks. Most of it came from fixing the unglamorous technical problems that stop good content from ranking.&lt;/p&gt;

&lt;p&gt;This is the checklist I work through on blogs and content sites, including &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/networkustad" rel="noopener noreferrer"&gt;NetworkUstad&lt;/a&gt;, an IT certification publication I did SEO for, and &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/editorialdiary" rel="noopener noreferrer"&gt;EditorialDiary&lt;/a&gt;, a multi-topic blog. It's ordered by impact: if step one is broken, nothing after it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Crawling and indexing
&lt;/h2&gt;

&lt;p&gt;Before anything else, confirm Google can reach and store your pages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;robots.txt&lt;/strong&gt; allows the pages you want indexed, and doesn't block the CSS and JavaScript Google needs to render them. Blocking a whole assets folder is a surprisingly common mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An XML sitemap&lt;/strong&gt; lists every indexable URL and nothing else: no redirects, no 404s, no pages marked noindex. Submit it in Google Search Console.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every important page returns a 200 status&lt;/strong&gt; and has a canonical tag that points to itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noindex is only where you mean it:&lt;/strong&gt; thank-you pages, internal search results, thin tag archives. A leftover noindex from a staging site can hide an entire website.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. When pages are discovered but not indexed
&lt;/h2&gt;

&lt;p&gt;The Page indexing report in Search Console tells you why pages aren't indexed. The reason that confuses people most is "Discovered - currently not indexed". Google knows the URL exists but hasn't bothered to crawl it.&lt;/p&gt;

&lt;p&gt;I saw it on my own portfolio a few weeks after launch: 11 pages indexed, 9 discovered but never crawled, including the service page I most wanted to rank. Nothing was technically broken. The site was new, it had no links from elsewhere, and several pages were short. Google simply didn't see enough reason to hurry.&lt;/p&gt;

&lt;p&gt;The fixes for that status are rarely technical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the pages worth crawling. Expand thin pages with real, specific content, or merge them.&lt;/li&gt;
&lt;li&gt;Link to them from pages Google already crawls often, such as your home page and your best-performing articles.&lt;/li&gt;
&lt;li&gt;Earn a few links from other sites, which tells Google the site matters.&lt;/li&gt;
&lt;li&gt;Use URL Inspection to request indexing for the most important pages, then give it time.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't panic about it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requesting indexing over and over doesn't help. Improve the pages and the links pointing to them, then wait a week or two before checking again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Site structure and topic clusters
&lt;/h2&gt;

&lt;p&gt;Content sites rank best when related articles are grouped and linked as a cluster: one broad guide, surrounded by detailed articles that link back to it.&lt;/p&gt;

&lt;p&gt;NetworkUstad is a good example. Its CCNA material is split into guides by exam domain, each with its own set of articles, so a reader and a search engine can both see how the topics fit together. A random stream of posts on the same subjects would rank far worse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm22wndk43wyilclw6izj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm22wndk43wyilclw6izj.webp" alt="NetworkUstad certification study guides for Security+, Network+ and CySA+" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Study guides grouped by certification: a clear cluster for readers and for Google.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For a multi-topic blog like EditorialDiary, which covers ten categories, the structure question is different: which categories deserve real depth? Keyword research answers it. Pick the topics where you can realistically rank, build those out properly, and stop spreading effort evenly across everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Internal links
&lt;/h2&gt;

&lt;p&gt;Internal links are the cheapest ranking factor you control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Link from every new article to two or three older, related ones, and go back and link older articles to the new one.&lt;/li&gt;
&lt;li&gt;Use descriptive anchor text, such as "subnetting cheat sheet", never "click here".&lt;/li&gt;
&lt;li&gt;Make sure no important page is an orphan, with no internal links pointing at it.&lt;/li&gt;
&lt;li&gt;Keep important pages within three clicks of the home page.&lt;/li&gt;
&lt;li&gt;Use breadcrumbs, which help users and give search engines the site hierarchy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Titles, descriptions and headings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One unique title per page, under about 60 characters, with the main keyword near the start.&lt;/li&gt;
&lt;li&gt;A meta description of about 150 to 160 characters that reads like a reason to click.&lt;/li&gt;
&lt;li&gt;Exactly one H1 per page, matching what the page is about.&lt;/li&gt;
&lt;li&gt;H2s and H3s in order, describing sections the way a reader would scan them.&lt;/li&gt;
&lt;li&gt;Descriptive alt text on images, written for someone who can't see them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On WordPress sites, an SEO plugin makes these easy to manage at scale. On custom sites, build them into the templates so no page ships without them. I set up every new post on &lt;a href="https://osama-s-porfolio-beige.vercel.app/projects/mindsieves" rel="noopener noreferrer"&gt;Mindsieves&lt;/a&gt; this way, so it was search-ready the moment it was published.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Structured data
&lt;/h2&gt;

&lt;p&gt;Structured data, usually JSON-LD, tells search engines what a page is: an article, a breadcrumb trail, a product, a person. It can earn richer search results and it helps search engines and AI tools understand your content.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Article or BlogPosting markup with the headline, author, dates and image.&lt;/li&gt;
&lt;li&gt;Add BreadcrumbList markup that matches the visible breadcrumbs.&lt;/li&gt;
&lt;li&gt;Add Organization or Person markup once, and link it from everything else.&lt;/li&gt;
&lt;li&gt;Test with Google's Rich Results Test and the Schema.org validator after every template change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Page speed and Core Web Vitals
&lt;/h2&gt;

&lt;p&gt;Speed is a ranking factor, and it matters even more for keeping readers. When I worked on WordPress sites, the fixes that helped most were consistent: caching, compressing and resizing images, and cutting the plugin list down. On the HTML and CSS builds I did, trimming what each page loaded cut average load time by more than a second.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LCP&lt;/strong&gt; (largest contentful paint): serve the main image or headline fast. Preload it, size it properly, and don't fade it in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLS&lt;/strong&gt; (layout shift): give images and ads fixed dimensions so the page doesn't jump while loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INP&lt;/strong&gt; (responsiveness): cut heavy scripts, especially third-party widgets that run on every page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something new, a framework that renders pages on the server, such as &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/nextjs-development" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, makes good scores far easier to reach and keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Duplicate and thin content
&lt;/h2&gt;

&lt;p&gt;Content sites generate duplicate pages without anyone noticing. Check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tag and date archives that repeat the same posts. Noindex them or remove them.&lt;/li&gt;
&lt;li&gt;The same page available with and without www, or with and without a trailing slash. Pick one and redirect the rest.&lt;/li&gt;
&lt;li&gt;Paginated archives with missing or wrong canonicals.&lt;/li&gt;
&lt;li&gt;Old, thin posts that get no traffic. Update them, merge them into a stronger article, or remove them with a redirect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Links from other sites
&lt;/h2&gt;

&lt;p&gt;Technical SEO gets a site ready to rank. Links from other sites are what convince Google it deserves to. For a content site, the links that work are the ones you earn: original guides people cite, useful tools, data nobody else has published. Relevant guest articles and outreach help too. Paying for bulk links from unrelated sites doesn't, and it can get you penalized.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Monitoring
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check Search Console weekly for new indexing errors and drops in impressions.&lt;/li&gt;
&lt;li&gt;Watch which queries are climbing, and give those pages more internal links and fresher content.&lt;/li&gt;
&lt;li&gt;Re-test structured data and speed after every theme, plugin or template change.&lt;/li&gt;
&lt;li&gt;Run a full audit every few months, and always before and after a redesign or migration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your content is good but your traffic isn't, the problem is usually somewhere in steps one to four. That's where my &lt;a href="https://osama-s-porfolio-beige.vercel.app/services/seo-services" rel="noopener noreferrer"&gt;SEO service&lt;/a&gt; starts, and because I'm also the developer, the fixes get made in the code instead of sitting in a report. &lt;a href="https://osama-s-porfolio-beige.vercel.app/contact" rel="noopener noreferrer"&gt;Send me your site&lt;/a&gt; and I'll tell you what I'd look at first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://osama-s-porfolio-beige.vercel.app/blog/technical-seo-checklist" rel="noopener noreferrer"&gt;my portfolio&lt;/a&gt;. I'm Osama Khattak, a MERN stack and Next.js developer in Islamabad. See my work at &lt;a href="https://osama-s-porfolio-beige.vercel.app/" rel="noopener noreferrer"&gt;osama-s-porfolio-beige.vercel.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>blogging</category>
    </item>
  </channel>
</rss>
