<?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: Tatiana Koval</title>
    <description>The latest articles on DEV Community by Tatiana Koval (@tatianakoval).</description>
    <link>https://dev.to/tatianakoval</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%2F4136546%2F96e23c13-5258-48f2-990e-614364c655fe.png</url>
      <title>DEV Community: Tatiana Koval</title>
      <link>https://dev.to/tatianakoval</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tatianakoval"/>
    <language>en</language>
    <item>
      <title>Where should a small dev shop or SaaS register its company? A checklist for engineers who now run the business</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Sun, 08 Nov 2026 05:15:46 +0000</pubDate>
      <link>https://dev.to/tatianakoval/where-should-a-small-dev-shop-or-saas-register-its-company-a-checklist-for-engineers-who-now-run-4oce</link>
      <guid>https://dev.to/tatianakoval/where-should-a-small-dev-shop-or-saas-register-its-company-a-checklist-for-engineers-who-now-run-4oce</guid>
      <description>&lt;p&gt;Many dev shops start the same way: two or three engineers, one foreign client, invoices from a personal account. Then a bigger client sends a vendor questionnaire, a product idea needs Stripe, and somebody asks which country the company should be in. This post is the checklist I would give that team. It comes from the corporate side of the job, so read it as a map of questions to settle before you pick a country, and take the final answer from a tax adviser in the countries where you actually live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from where the people are
&lt;/h2&gt;

&lt;p&gt;An agency sells people's work, so tax authorities look at the people first. Two concepts matter.&lt;/p&gt;

&lt;p&gt;The first is permanent establishment. Under Article 5 of the OECD Model Tax Convention, it is a fixed place of business through which the enterprise's business is wholly or partly carried on. It can also arise when someone in another country habitually concludes contracts on the company's behalf. Profit attributable to that establishment is taxed where the team works.&lt;/p&gt;

&lt;p&gt;The second is the company's own tax residency. The UK treats any company incorporated there as UK resident, while other countries may claim a company as resident if its directors actually run it from their territory. If the founder lives in one country, the developers in two others and the company is registered in a fourth, each of those countries has its own question to ask. A longer walk-through is in this guide on &lt;a href="https://offshora.com/en/industries/it-agency-international-company/" rel="noopener noreferrer"&gt;an international company for an IT agency&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual shortlist
&lt;/h2&gt;

&lt;p&gt;Most teams end up comparing four options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UK Ltd: Corporation Tax of 19% on profits up to £50,000 and 25% above £250,000, with relief in between. Companies House charges £100 for online registration and £50 for the annual confirmation statement, and directors go through identity verification.&lt;/li&gt;
&lt;li&gt;US LLC: tax depends on the form and the state. A single-member LLC with a foreign owner files Form 5472 every year, and the penalty for not filing is $25,000.&lt;/li&gt;
&lt;li&gt;Estonian OÜ: the 22/78 model, where tax is paid when profit is distributed. e-Residency gives you a digital signature and does not make you an Estonian tax resident.&lt;/li&gt;
&lt;li&gt;A local company in the country where the team lives: often the simplest answer for employment contracts and payroll.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A UK Ltd is sometimes sold as a way to avoid tax. It pays UK Corporation Tax like any other UK company, so that pitch is a red flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are building a product, check payments first
&lt;/h2&gt;

&lt;p&gt;A subscription business lives on card acquiring and recurring billing, so the first filter is whether your payment provider supports the country. As of October 23, 2026, Stripe listed 51 supported countries and regions, including the UK, the US, Estonia, Cyprus, Singapore, Hong Kong and the UAE. The BVI, Seychelles, Belize and Panama were not on the list. That single fact rules out most classic offshore jurisdictions for SaaS.&lt;/p&gt;

&lt;p&gt;The alternative is a merchant of record platform that sells to the end customer, handles VAT in the buyers' countries and pays you the revenue minus its fee. It simplifies launch, but each platform has its own fees and allowed business types.&lt;/p&gt;

&lt;p&gt;Then comes VAT on digital services sold to consumers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the EU, a seller with no EU establishment can register for the non-Union OSS scheme in one country and file one quarterly return covering all EU states.&lt;/li&gt;
&lt;li&gt;In the UK, a business based outside the UK has no registration threshold at all; UK companies register once taxable turnover passes £90,000 over 12 months.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The comparison table with Singapore and a Delaware C-Corp is on the page about &lt;a href="https://offshora.com/en/industries/saas-company-jurisdiction/" rel="noopener noreferrer"&gt;choosing a jurisdiction for SaaS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The IP chain is a technical debt that compounds
&lt;/h2&gt;

&lt;p&gt;Code belongs to the client only if it first belonged to your company. Before the first serious contract, put these in writing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Founders assign the rights to code written before the company existed.&lt;/li&gt;
&lt;li&gt;Every developer and contractor contract has an assignment of exclusive rights.&lt;/li&gt;
&lt;li&gt;Third-party libraries are tracked and open source licences respected.&lt;/li&gt;
&lt;li&gt;The trademark is registered where you sell.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Investors and acquirers check this chain in due diligence. Fixing it after a round is slower and more expensive than doing it on day one. Whether contributors can be contractors at all is decided by the law of the country where they live; full-time "contractors" can be reclassified as employees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contracts with clients
&lt;/h2&gt;

&lt;p&gt;A large client will vet the MSA and statements of work. Make sure they cover transfer of exclusive rights after payment, acceptance and warranty periods, a liability cap, confidentiality, currency and who issues invoices. If you process personal data of the client's EU customers, you also need a data processing agreement under Article 28 of the GDPR. GDPR can apply to a company with no EU establishment that offers services to people in the EU (Article 3(2)).&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes I keep seeing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Client money landing in a personal account or in another company's account.&lt;/li&gt;
&lt;li&gt;Contracts signed from your home country for a foreign company without anyone checking permanent establishment.&lt;/li&gt;
&lt;li&gt;A company registered where the payment provider you need does not operate.&lt;/li&gt;
&lt;li&gt;VAT left uncalculated until the platform or the tax office asks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to bring to the conversation
&lt;/h2&gt;

&lt;p&gt;Before you talk to a corporate services firm or an accountant, write down the clients' countries, where each founder and developer lives, expected turnover, the payment provider you want and whether you plan to raise money. With that list, a comparison of two or three structures and a two-year budget becomes a short exercise. Offshora's overview of &lt;a href="https://offshora.com/en/offshornye-zony.html" rel="noopener noreferrer"&gt;jurisdictions compared&lt;/a&gt; is a reasonable place to see the options side by side before that call.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>saas</category>
      <category>business</category>
      <category>freelancing</category>
    </item>
    <item>
      <title>Hiring developers in Ukraine from abroad: four setups and what each one exposes you to</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Sat, 07 Nov 2026 23:14:52 +0000</pubDate>
      <link>https://dev.to/tatianakoval/hiring-developers-in-ukraine-from-abroad-four-setups-and-what-each-one-exposes-you-tocareer-4k8l</link>
      <guid>https://dev.to/tatianakoval/hiring-developers-in-ukraine-from-abroad-four-setups-and-what-each-one-exposes-you-tocareer-4k8l</guid>
      <description>&lt;p&gt;If you run a small product company outside Ukraine and want to hire engineers in Kyiv or Lviv, you will hear four answers: pay them from abroad, contract them as sole traders, use an employer of record, or open your own Ukrainian company. Each one moves tax and legal risk to a different place. Below is how they compare under the statutes as they stand in late 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Paying them directly from your foreign company
&lt;/h2&gt;

&lt;p&gt;The easiest on day one. Two things to know.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your side:&lt;/strong&gt; Under Art. 14.1.193(b) of the Tax Code, a non-resident supplying services in Ukraine through staff hired for that purpose creates a permanent establishment once the activity runs for more than 183 days in any twelve months within one project or connected projects. Engineers building your own product is a different fact pattern from selling services into Ukraine, and that distinction is where the argument is usually won or lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Their side:&lt;/strong&gt; With a foreign payer there is no Ukrainian withholding agent. The developer has to declare the income in an annual return and pays 18% personal income tax plus the 5% military levy. Many developers on this setup do not realise they have that filing duty.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Contracting them as sole traders (FOP, group 3)
&lt;/h2&gt;

&lt;p&gt;The default in Ukrainian IT for years.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The developer registers as a sole trader in 24 hours and pays 5% single tax on turnover, a 1% military levy and the minimum social contribution for themselves.&lt;/li&gt;
&lt;li&gt;Group 3 has an annual income ceiling of 1,167 minimum wages. Breach it and the developer drops off the simplified system from the next quarter, so the 5% rate stops applying to everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your exposure is reclassification.&lt;/strong&gt; Ukrainian law has no checklist of "signs of employment"; inspectors and courts apply the Labour Code definition to the facts. Fixed hours, your equipment, your email domain and a manager approving leave all point one way. Inspections continue under martial law, usually triggered by a developer who left on bad terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Employer of record
&lt;/h2&gt;

&lt;p&gt;A Ukrainian provider signs the employment contract, runs payroll at the ordinary rates (18% income tax, 5% military levy, 22% social contribution) and the developer works on your product. The service test for permanent establishment in the Tax Code expressly excludes the provision of personnel, which is why this model exists. Keep the agency test in mind: a developer who habitually negotiates or signs contracts for you can still create a permanent establishment on that ground.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Your own Ukrainian company, possibly in Diia.City
&lt;/h2&gt;

&lt;p&gt;A foreigner can own 100% of a Ukrainian LLC, with no minimum capital, and the registrar has 24 hours to register it. If the company joins Diia.City, specialists pay 5% personal income tax on salary or gig-contract fees up to EUR 240,000 a year, plus the 5% military levy, and the social contribution is the minimum one instead of 22% of the real salary.&lt;/p&gt;

&lt;p&gt;Diia.City normally needs nine people, an average monthly pay of EUR 1,200 and 90% qualifying income. A company registered less than 24 months before applying can join without the headcount and pay tests until 31 December of the following year, which is the route that fits a foreign firm starting with five engineers. Only a company registered in Ukraine can join; your foreign entity cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  A rough decision rule
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One or two people, short engagement: FOP contract, written carefully, with real independence in how the work is done.&lt;/li&gt;
&lt;li&gt;A growing team you treat as employees: employer of record now, own entity later.&lt;/li&gt;
&lt;li&gt;Five or more engineers and a long horizon: a Ukrainian LLC, then Diia.City.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The full comparison with citations: &lt;a href="https://ua4all.org/hire-ukrainian-developers-legally.html" rel="noopener noreferrer"&gt;how to legally hire Ukrainian developers from abroad&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Entry tests, the 9% and 5% tax model and the traps for foreign owners: &lt;a href="https://ua4all.org/diia-city-it-business-ukraine.html" rel="noopener noreferrer"&gt;what Diia.City is and whether it fits a foreign IT firm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Registering the company itself, documents and apostilles: &lt;a href="https://ua4all.org/business/" rel="noopener noreferrer"&gt;guides for foreigners starting a business in Ukraine&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Statutes referred to: &lt;a href="https://zakon.rada.gov.ua/laws/show/2755-17" rel="noopener noreferrer"&gt;Tax Code of Ukraine&lt;/a&gt;, &lt;a href="https://zakon.rada.gov.ua/laws/show/1667-20" rel="noopener noreferrer"&gt;Law No. 1667-IX on Diia.City&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>developers</category>
      <category>hiring</category>
      <category>remote</category>
    </item>
    <item>
      <title>Quiz forms on contractor websites: what to ask, and where the answers go</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Sat, 07 Nov 2026 16:37:11 +0000</pubDate>
      <link>https://dev.to/tatianakoval/quiz-forms-on-contractor-websites-what-to-ask-and-where-the-answers-go-35ii</link>
      <guid>https://dev.to/tatianakoval/quiz-forms-on-contractor-websites-what-to-ask-and-where-the-answers-go-35ii</guid>
      <description>&lt;p&gt;A contractor's website usually has one contact form with a text area labelled "Describe your project". The owner gets messages like "need a quote for the basement" and spends the first call asking the questions the form should have asked. A quiz form is the same form broken into four or five screens, each with buttons instead of free text, and it changes two things: more people finish it, and the answers arrive structured enough to price the job before the call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a quiz asks
&lt;/h2&gt;

&lt;p&gt;Build the screens from the questions the estimator asks on every first call. For a renovation contractor the sequence is usually:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What are we working on? Kitchen, bathroom, basement, flooring, exterior, other.&lt;/li&gt;
&lt;li&gt;What stage is it at? Just looking, have a plan, have a permit, ready to start this month.&lt;/li&gt;
&lt;li&gt;Roughly how big? Small (one room), medium (two rooms or a full floor), large (whole house or addition).&lt;/li&gt;
&lt;li&gt;When? This month, within three months, later this year.&lt;/li&gt;
&lt;li&gt;Where? City or postal code, so the estimator knows the drive.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The last screen asks for name and phone, and says what happens next: "We call back within one business day with a price range." Each screen has three to five options, written in the customer's words rather than the trade's.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it converts better
&lt;/h2&gt;

&lt;p&gt;A text area asks the visitor to write; buttons ask them to choose. Choosing takes two seconds per screen and gives a sense of progress. Visitors who would have closed the long form finish the quiz, and the ones who leave halfway still tell you something: if most people abandon at the "stage" screen, the options are confusing or the audience is earlier in the process than the ads assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the answers go
&lt;/h2&gt;

&lt;p&gt;The quiz is only useful if every answer lands in a place the business reads. The minimum is three destinations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CRM, as a lead with every answer in its own field, so the estimator sees "bathroom, has a plan, medium, this month, Kanata" before calling.&lt;/li&gt;
&lt;li&gt;An email or messenger notification to the person who calls back, with the same fields.&lt;/li&gt;
&lt;li&gt;Analytics, as a key event with the answers as parameters, so the ad campaigns can be judged by qualified leads rather than form submits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CRM write must be server-side with validation and bot protection; a form that posts straight from the browser to a third-party endpoint will fill the CRM with spam within a week. This is part of why we treat lead capture as a build requirement on &lt;a href="https://mmix.biz/development-of-corporate-websites" rel="noopener noreferrer"&gt;corporate sites&lt;/a&gt; rather than a plugin added at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three quizzes on one site
&lt;/h2&gt;

&lt;p&gt;A contractor site often needs more than one quiz, because the audiences differ: a homeowner planning a kitchen, a property manager with a repair list, a developer looking for a trade partner. One quiz per audience, each starting from its own service page, keeps the questions relevant and the lead routing simple. On the marketing side, each quiz becomes its own landing page for ads, which is the structure we use for &lt;a href="https://mmix.ca/marketing-for-the-construction-industry/" rel="noopener noreferrer"&gt;construction companies&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to measure in the first month
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start rate: visitors who click the first button divided by page views.&lt;/li&gt;
&lt;li&gt;Completion rate: visitors who submit the last screen divided by starts.&lt;/li&gt;
&lt;li&gt;Drop-off by screen.&lt;/li&gt;
&lt;li&gt;Qualified share: leads the estimator was willing to price, divided by submissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If completion is high and qualified share is low, the quiz is too easy to finish and needs a budget or timing question. If completion is low, there is one screen that confuses people; the drop-off report will show which.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on bilingual sites
&lt;/h2&gt;

&lt;p&gt;In Ontario and Quebec, the quiz needs a French version with the same fields mapped to the same CRM columns. Build the field names once in English for the CRM, and translate the labels only.&lt;/p&gt;

&lt;p&gt;Tatiana Koval, Marketing MIX (Ottawa, since 2012)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>forms</category>
      <category>marketing</category>
      <category>ux</category>
    </item>
    <item>
      <title>Before you send paid traffic to a small-business website: a pre-launch checklist</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Sat, 07 Nov 2026 16:33:49 +0000</pubDate>
      <link>https://dev.to/mmixstudio/before-you-send-paid-traffic-to-a-small-business-website-a-pre-launch-checklist-4c04</link>
      <guid>https://dev.to/mmixstudio/before-you-send-paid-traffic-to-a-small-business-website-a-pre-launch-checklist-4c04</guid>
      <description>&lt;p&gt;Most small-business ad budgets are lost on the landing page rather than in the ad account. The click arrives, the page takes four seconds to show anything on a mid-range phone, the phone number is a picture, the form has nine fields and no confirmation. The campaign report then says "low conversion rate" and the owner concludes that ads do not work for their trade.&lt;/p&gt;

&lt;p&gt;This checklist is what we run before a single dollar goes to Google or Meta for a local service business. It fits on one page and takes an afternoon to go through.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. One page per offer
&lt;/h2&gt;

&lt;p&gt;An ad for "emergency drain cleaning" has to land on a page about emergency drain cleaning, with that phrase in the headline. Sending every ad to the home page is the single most common mistake we see on audits. If the offer has no page yet, a one-page landing is cheaper than a month of wasted clicks; the scope of a landing page is described on the &lt;a href="https://mmix.ca/landing-page-development/" rel="noopener noreferrer"&gt;landing page development&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The phone number is a link
&lt;/h2&gt;

&lt;p&gt;On mobile, the number in the header must be a tel: link and a sticky button must stay on screen while the visitor scrolls. Test it on a real phone, not in the browser's device emulator.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The form asks for three things
&lt;/h2&gt;

&lt;p&gt;Name, phone or email, and one question that qualifies the lead (city, date, number of guests, type of job). Everything else can be asked in the reply. Every extra required field removes a share of submissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A confirmation the visitor can see
&lt;/h2&gt;

&lt;p&gt;After submit, the page shows a message with what happens next and when. The same event fires a conversion in analytics. Without this, the ad platform optimises toward people who click, not people who enquire.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Tracking is wired and tested
&lt;/h2&gt;

&lt;p&gt;Google Analytics 4 with a key event for form submit and for phone click, Google Ads conversion import, Meta Pixel or Conversions API for Meta campaigns. Submit a test lead and watch it arrive in each report before launch, then delete the test from the CRM.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Speed on a cheap phone
&lt;/h2&gt;

&lt;p&gt;Open the page on a mid-range Android over mobile data. If the headline and the button are not visible within two seconds, compress images, remove the slider and defer third-party scripts. Core Web Vitals in Search Console will show the same problem a week later, but the ad budget is being spent today.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Price orientation
&lt;/h2&gt;

&lt;p&gt;A visitor from an ad wants to know roughly what the job costs. "From $X" with a short list of what changes the price keeps the ones who can afford you and saves the time of the ones who cannot. If pricing a website is the question, the cost drivers by site type are explained in &lt;a href="https://mmix.ca/how-much-does-a-website-cost-in-canada/" rel="noopener noreferrer"&gt;how much a website costs in Canada&lt;/a&gt;; the same logic applies to any service page.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Reviews and a Google Business Profile link
&lt;/h2&gt;

&lt;p&gt;Three or four recent reviews with names and a link to the Google profile. For a local business, the Maps listing is often where the visitor goes next to check that you are real.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Area served
&lt;/h2&gt;

&lt;p&gt;The city and the neighbourhoods you cover, written in text, with a map if you have a service area. Ads targeted to a region lose money when the page does not say you work there.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. The old URL still works
&lt;/h2&gt;

&lt;p&gt;If the page replaced an older one, the old address redirects with a 301. Ads are sometimes copied from last year's campaign and still point to the old URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. The page is indexable, but the thank-you page is not
&lt;/h2&gt;

&lt;p&gt;The landing page should be reachable by Google; the confirmation page should carry noindex, otherwise it starts collecting organic visits and inflating the conversion count.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Someone answers within the hour
&lt;/h2&gt;

&lt;p&gt;The best landing page cannot fix a missed call. Agree who picks up during the campaign hours, and test the enquiry route end to end: form to email to phone call back.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use the list
&lt;/h2&gt;

&lt;p&gt;Go through the twelve points with the page open on a phone. Fix the red ones before launch, launch with a small daily budget, and read the first week's report by enquiries rather than clicks. If the enquiries come, scale; if the clicks come without enquiries, the problem is on this list, not in the keyword bids.&lt;/p&gt;

&lt;p&gt;Tatiana Koval, Marketing MIX (Ottawa, since 2012)&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>webdev</category>
      <category>smallbusiness</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Lead quizzes for two trades: a Montreal cabinet painter and an Ottawa renovation contractor</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Wed, 04 Nov 2026 21:16:38 +0000</pubDate>
      <link>https://dev.to/mmixstudio/lead-quizzes-for-two-trades-a-montreal-cabinet-painter-and-an-ottawa-renovation-contractor-671</link>
      <guid>https://dev.to/mmixstudio/lead-quizzes-for-two-trades-a-montreal-cabinet-painter-and-an-ottawa-renovation-contractor-671</guid>
      <description>&lt;p&gt;In 2026 we built lead funnels for two owner-run trades businesses: Mr. Gary, a painter in Montreal who moved into on-site kitchen cabinet painting, and Korvex Construction, a renovation and exterior construction company in Ottawa. Both started with Meta ads and a short quiz, and both later got a full bilingual site. The setups are close enough to compare, and the bugs were useful. All numbers below come from the clients' own CRM and lead logs, with test entries removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The starting point
&lt;/h2&gt;

&lt;p&gt;Neither business had a website. Mr. Gary lived on a Facebook page, an Instagram account and word of mouth; the owner films his own jobs on his phone. Korvex had an Instagram account full of before-and-after reels, a Facebook page, reviews on HomeStars and Google, and one route for a person who wanted a price: a direct message.&lt;/p&gt;

&lt;p&gt;For a trade, speed to the lead decides most of the outcome. One of the first notes in the Mr. Gary working chat was about ad hours: run the ads when someone is free to reply within a couple of minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quiz pattern
&lt;/h2&gt;

&lt;p&gt;Both quizzes follow the same rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every screen fits a phone without scrolling, including the short viewport of the Facebook and Instagram in-app browser;&lt;/li&gt;
&lt;li&gt;the phone field defaults to +1 and the number on the page is a tap-to-call link;&lt;/li&gt;
&lt;li&gt;the last screen asks for contact details, after the person has already answered the job questions;&lt;/li&gt;
&lt;li&gt;a completed quiz posts into the owner's Telegram with the answers numbered and one-tap WhatsApp and Telegram links to the person.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The server side is small. The form posts to our own endpoint, which validates the payload, writes a lead log, sends the Telegram card and fires a &lt;code&gt;Lead&lt;/code&gt; event to Meta through the Conversions API with the same &lt;code&gt;event_id&lt;/code&gt; the browser pixel used. A minimal version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// browser: one id for both the pixel and the server event&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;fbq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;track&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lead&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;eventID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;eventId&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/lead&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;eventId&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meta then counts each lead once and the campaign optimises on real submissions. The Telegram bot token and the Conversions API token stay on the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers looked like
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mr. Gary.&lt;/strong&gt; The CRM holds 92 requests between 30 March and 24 August 2026, 89 of them while the spring campaigns ran (30 March to 9 May). 82 came through the quiz and 10 through the form on the landing page. The busiest week brought 22. Quiz requests from 3 to 29 March went straight to Telegram before the CRM was connected, so they are outside that count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Korvex.&lt;/strong&gt; The three live quizzes logged 67 leads between 14 August and 26 October 2026. The feature-wall quiz alone brought 21 leads from Meta ads in 17 days: 14 from Facebook, 6 from Instagram and 1 from Threads. The budget question in the first quiz showed the demand early: of 45 leads, 21 picked "Under $5,000" and 14 picked "Need guidance". Most people wanted fences, French drains, waterproofing and basements, done as soon as possible.&lt;/p&gt;

&lt;p&gt;The full write-ups, with screenshots of each quiz and site, are on our site: the &lt;a href="https://mmix.biz/mr-gary-cabinet-painting" rel="noopener noreferrer"&gt;Mr. Gary cabinet painting case&lt;/a&gt; and the &lt;a href="https://mmix.biz/korvex-developments" rel="noopener noreferrer"&gt;Korvex Construction case&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that cost three leads
&lt;/h2&gt;

&lt;p&gt;On 2 October we removed one step from the Korvex premium quiz. The page changed, and the server script that receives the form still required the fields from the removed step. Three real submissions that morning were rejected and never reached the client.&lt;/p&gt;

&lt;p&gt;The fix made those fields optional. The rule we kept: a change to a quiz's steps is a change to both the page and the server script, and both are tested together in a sandbox before the change ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other things we would repeat
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead forms against the quiz.&lt;/strong&gt; For a few days in April we ran a Meta lead-form campaign next to the quiz traffic for Mr. Gary. Lead forms are cheaper per request and bring more spam and more time spent warming people up, which matters most for a job that costs thousands of dollars. 82 of the 92 requests in the CRM came through the quiz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show the source in the lead card.&lt;/strong&gt; Since 24 October each Korvex lead in Telegram shows the platform and the ad the person came from, with the ad's picture, so the owner sees which creative brought which enquiry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the language of demand.&lt;/strong&gt; A free search study for Mr. Gary put French commercial queries about cabinet painting in Quebec at roughly three times the English ones. The spring campaigns had been English-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the site from the owner's own material.&lt;/strong&gt; Both sites use the owners' job photos, captions and reviews quoted word for word.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The sites that followed
&lt;/h2&gt;

&lt;p&gt;Korvex got a bilingual site on its own domain on 28 September 2026: a page per service, 23 project pages, a reviews page and 64 service-in-area pages for eight Ottawa areas. In its first month, 130 of its pages appeared in Google Search. Mr. Gary got a 116-page English and Quebec French site built around kitchen cabinet painting, with redirects from every old address already configured, waiting on a domain switch.&lt;/p&gt;

&lt;p&gt;If you run a trade and want to see what a quiz like this would ask your customers, our &lt;a href="https://mmix.biz/website-cost-estimate" rel="noopener noreferrer"&gt;website cost estimate&lt;/a&gt; is built the same way.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>marketing</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>Moving an abandoned WordPress site without losing rankings: a checklist</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Wed, 04 Nov 2026 21:08:23 +0000</pubDate>
      <link>https://dev.to/mmixstudio/moving-an-abandoned-wordpress-site-without-losing-rankings-a-checklist-48f2</link>
      <guid>https://dev.to/mmixstudio/moving-an-abandoned-wordpress-site-without-losing-rankings-a-checklist-48f2</guid>
      <description>&lt;p&gt;A common request in our studio: a small business has a WordPress site that nobody has updated in years. The developer is gone, the theme is from 2017, half the plugins are no longer maintained, and the host is about to switch off the PHP version it runs on. The site still brings calls from Google, and the owner is afraid that any change will lose them.&lt;/p&gt;

&lt;p&gt;Rankings drop after a move for a short list of reasons: addresses change without redirects, pages that brought visitors disappear, a staging &lt;code&gt;noindex&lt;/code&gt; ships to production, or the site was already compromised and the move carries the infection over. This checklist covers each of them. We use it on every &lt;a href="https://mmix.biz/website-rescue-and-migration" rel="noopener noreferrer"&gt;website rescue and migration&lt;/a&gt; we take on.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Take a full copy before anything else
&lt;/h2&gt;

&lt;p&gt;Copy the files, the database, the DNS zone and the list of accounts (registrar, host, email, analytics, Search Console) before you touch the live site.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# on the old host, if you have SSH and wp-cli&lt;/span&gt;
wp db &lt;span class="nb"&gt;export &lt;/span&gt;backup-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%F&lt;span class="si"&gt;)&lt;/span&gt;.sql
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; files-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%F&lt;span class="si"&gt;)&lt;/span&gt;.tar.gz &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'wp-content/cache'&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# DNS: save the current zone, including MX and TXT records&lt;/span&gt;
dig +noall +answer example.com ANY &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; dns-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%F&lt;span class="si"&gt;)&lt;/span&gt;.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without SSH, most hosting panels have a backup button, and a plugin such as UpdraftPlus can export to your own storage. Write down where every account lives and who holds the password. On abandoned sites the hosting account is often in the former developer's name, and recovering it takes days, so start early.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Check whether the site is already hacked
&lt;/h2&gt;

&lt;p&gt;Old WordPress installs are a common target. Before planning the move, look for signs of a compromise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;site:example.com&lt;/code&gt; in Google shows pages you never wrote (pharmacy, casino, Japanese keyword spam);&lt;/li&gt;
&lt;li&gt;PHP files inside &lt;code&gt;wp-content/uploads/&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;admin users nobody recognises;&lt;/li&gt;
&lt;li&gt;redirects that fire only for visitors coming from Google or only on phones.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find wp-content/uploads &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.php'&lt;/span&gt;
wp user list &lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;administrator
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rl&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.php'&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'base64_decode'&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'gzinflate'&lt;/span&gt; wp-content/ | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you find any of this, clean the site and find the way in before you migrate, otherwise the backdoor moves with the content. Our notes on &lt;a href="https://mmix.biz/cybersecurity/hacked-website-repair" rel="noopener noreferrer"&gt;hacked website repair&lt;/a&gt; describe the order: contain, copy the evidence, clean against vendor originals, close the entry point, rotate keys, then ask Google for a review if there is a warning.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Build the list of addresses to protect
&lt;/h2&gt;

&lt;p&gt;Collect every URL that has search history or inbound links. Use four sources, because each one misses something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the XML sitemap (often outdated on abandoned sites);&lt;/li&gt;
&lt;li&gt;a crawl of the live site;&lt;/li&gt;
&lt;li&gt;Search Console, Performance report, Pages tab, the last 16 months;&lt;/li&gt;
&lt;li&gt;server logs, if the host keeps them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pay attention to the WordPress-specific addresses that a new build usually drops: &lt;code&gt;/?p=123&lt;/code&gt; short links, &lt;code&gt;/category/&lt;/code&gt; and &lt;code&gt;/tag/&lt;/code&gt; archives, &lt;code&gt;/author/&lt;/code&gt; pages, attachment pages, &lt;code&gt;/feed/&lt;/code&gt;, paginated archives (&lt;code&gt;/page/2/&lt;/code&gt;), and direct image URLs under &lt;code&gt;/wp-content/uploads/&lt;/code&gt; that other sites embed.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Write the redirect map
&lt;/h2&gt;

&lt;p&gt;One row per old address: old URL, new URL, status code. Every old page that brought visitors or has links goes to its closest new page with a 301. Avoid sending everything to the home page; Google treats mass redirects to the home page as soft 404s.&lt;/p&gt;

&lt;p&gt;Decide the trailing slash and the &lt;code&gt;www&lt;/code&gt; question once and apply it everywhere. A mismatch between the redirect rules and the canonical tags creates chains and loops. On one recent rescue, the diagnosis found a redirect loop that turned 45% of requests into 301 responses before the site was even moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Test the map with a script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# redirects.csv: old_url,expected_url&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;, &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; old expected&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;final&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{url_effective} %{http_code} %{num_redirects}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$old&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; url code hops &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$final&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$expected&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"200"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hops&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 1 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL &lt;/span&gt;&lt;span class="nv"&gt;$old&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$hops&lt;/span&gt;&lt;span class="s2"&gt; hops), expected &lt;/span&gt;&lt;span class="nv"&gt;$expected&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;fi
done&lt;/span&gt; &amp;lt; redirects.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it against staging with the production hostnames mapped in &lt;code&gt;/etc/hosts&lt;/code&gt;, and again right after launch. Every line it prints is a page that will lose its rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Launch-day checks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remove &lt;code&gt;noindex&lt;/code&gt; and the staging &lt;code&gt;Disallow: /&lt;/code&gt; from robots.txt. This is the most common way a migration wipes a site from Google, and it is easy to check with &lt;code&gt;curl -s https://example.com/robots.txt&lt;/code&gt; and a look at the page &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Canonical tags point at the new production URLs.&lt;/li&gt;
&lt;li&gt;hreflang pairs still match if the site has English and French.&lt;/li&gt;
&lt;li&gt;Forms, phone links and analytics events work the way a customer uses them. Send a real test request.&lt;/li&gt;
&lt;li&gt;Submit the new sitemap in Search Console and keep the old one for a few weeks so Google recrawls the redirects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Watch the first weeks
&lt;/h2&gt;

&lt;p&gt;Check Search Console coverage and 404s daily for the first week and again after three or four weeks. A short dip while Google recrawls is normal. A page that stays gone is usually a missing redirect, and the fix is one line in the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repair or rebuild?
&lt;/h2&gt;

&lt;p&gt;Some abandoned sites come back with updates and a cleanup. Others cost less to rebuild on a current stack than to keep patching. Make the choice with both options and their scope written down, after the copy and the diagnosis. If you are in Canada and want us to do it, the &lt;a href="https://mmix.biz/website-rescue-and-migration" rel="noopener noreferrer"&gt;website rescue and migration&lt;/a&gt; page has a short quiz that asks for the address of your site.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>seo</category>
      <category>devops</category>
    </item>
    <item>
      <title>What a small-business website costs in Canada in 2026 and how to estimate yours</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Wed, 04 Nov 2026 21:08:15 +0000</pubDate>
      <link>https://dev.to/mmixstudio/what-a-small-business-website-costs-in-canada-in-2026-and-how-to-estimate-yours-52bo</link>
      <guid>https://dev.to/mmixstudio/what-a-small-business-website-costs-in-canada-in-2026-and-how-to-estimate-yours-52bo</guid>
      <description>&lt;p&gt;Most small-business owners in Canada ask the price of a website first and describe the website second. The number they get back depends almost entirely on the second part, so two quotes for "a site for my company" can differ by a factor of ten and both be honest.&lt;/p&gt;

&lt;p&gt;We price websites for service businesses in Ottawa and across Canada, and we built a &lt;a href="https://mmix.biz/website-cost-estimate" rel="noopener noreferrer"&gt;website cost estimate quiz&lt;/a&gt; around the six questions we need answered before we can give a figure in writing. This post walks through those questions and what each one does to the cost, so you can estimate your own project before you talk to anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is the job?
&lt;/h2&gt;

&lt;p&gt;A new site, a redesign of a site you have, a rescue of a site that is broken, hacked or locked away from you, an online store, or a site that takes bookings. These are five different projects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A first site has nothing to protect. It starts faster.&lt;/li&gt;
&lt;li&gt;A redesign or a rescue starts with an inventory of the old site: every address that has search history or links pointing at it needs a redirect to its new page.&lt;/li&gt;
&lt;li&gt;A store or a booking site adds integrations that have to be built and tested: payments, taxes, shipping, a calendar tied to staff schedules, reminders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Who is the site for?
&lt;/h2&gt;

&lt;p&gt;A local service business, a shop, a professional practice, a non-profit and a personal project need different pages. A plumber in Kanata needs service pages, area pages, a phone button and a short form. A law practice needs one page per practice area and an intake form that screens the request. The page list drives the cost more than the design does.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What must the site do?
&lt;/h2&gt;

&lt;p&gt;Write down the jobs, one per line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;be found on Google and in AI answers for your services and your city;&lt;/li&gt;
&lt;li&gt;bring enquiries by phone, form, WhatsApp or a quiz;&lt;/li&gt;
&lt;li&gt;take bookings or payments;&lt;/li&gt;
&lt;li&gt;work in English and French;&lt;/li&gt;
&lt;li&gt;answer common customer questions with an assistant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each line is a set of pages or an integration. English and French is a good example: a bilingual site is two sites to write and check, plus the hreflang tags and URL structure that keep the two languages apart in search. In Ottawa, with Gatineau across the river, many service businesses need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What does it run on today?
&lt;/h2&gt;

&lt;p&gt;This question decides how much work goes into protecting what you already have. If the current site gets visitors from Google, export the list of pages from Search Console before anyone touches it. Here is a short script we use on that export (Performance report, Pages tab, Export as CSV):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# usage: python pages_to_keep.py Pages.csv
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Clicks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Impressions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Clicks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Clicks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Impressions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top pages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; addresses need a redirect or must keep their URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line of output is a good proxy for the migration part of the estimate. A site with 12 such pages and a site with 900 are different jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Copy and photos
&lt;/h2&gt;

&lt;p&gt;Copy takes longer than code. A site built from text you already have is cheaper than one where the studio writes every service page. Real photos of your work, your team and your premises do more for enquiries than any layout, and if you do not have them, a shoot becomes a line in the estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Budget band and timing
&lt;/h2&gt;

&lt;p&gt;Giving a budget band feels like a negotiating mistake. In practice it decides which scope the studio proposes: the same goals can be met with a one-page site and a quiz, or with forty service and area pages. Say the band and ask what fits inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ongoing costs to ask about
&lt;/h2&gt;

&lt;p&gt;The build is one number. Ask separately about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosting and platform fees.&lt;/strong&gt; Builder plans such as Wix or Squarespace run CA$50 to CA$100 a month for as long as the site lives. A static site on a CDN costs close to nothing to host for a typical small business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates.&lt;/strong&gt; A WordPress site needs core, theme and plugin updates, and each update can break something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search, ads and content after launch.&lt;/strong&gt; These should be quoted separately so you can stop any of them without losing the site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tax.&lt;/strong&gt; In Ontario, HST at 13% goes on top of a quoted price.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What our published prices are
&lt;/h2&gt;

&lt;p&gt;So you have real numbers to compare against: rebuilding an existing old WordPress, Joomla or website-builder site as a fast static site you own costs CA$500 + HST for a one-page site and CA$1,000 + HST for a multi-page site, paid once, on our &lt;a href="https://mmix.biz/website-rescue-and-migration" rel="noopener noreferrer"&gt;website rescue and migration&lt;/a&gt; offer. A 30-minute marketing strategy session costs €100. New sites, stores and booking sites are quoted per scope; our &lt;a href="https://mmix.biz/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; explains how that quote is put together.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist before you ask for quotes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The job: new, redesign, rescue, store or bookings.&lt;/li&gt;
&lt;li&gt;The page list, one line per service and per area.&lt;/li&gt;
&lt;li&gt;The languages.&lt;/li&gt;
&lt;li&gt;How a request reaches you: call, form, quiz, booking.&lt;/li&gt;
&lt;li&gt;The Search Console export of the current site, if there is one.&lt;/li&gt;
&lt;li&gt;Who owns the domain, the hosting and the analytics today.&lt;/li&gt;
&lt;li&gt;Your budget band and the date you want to launch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that list in hand, any studio can give you a written figure, and you can compare quotes line by line. If you want ours, the &lt;a href="https://mmix.biz/website-cost-estimate" rel="noopener noreferrer"&gt;two-minute quiz&lt;/a&gt; asks exactly these questions and a person from the studio replies with a written estimate.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>smallbusiness</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Building Cross-Border E-Commerce Infrastructure in the EU: Estonian OÜ Entity, VAT OSS, and Remote Payroll Compliance</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Mon, 02 Nov 2026 03:31:53 +0000</pubDate>
      <link>https://dev.to/tatianakoval/building-cross-border-e-commerce-infrastructure-in-the-eu-estonian-ou-entity-vat-oss-and-remote-1f2k</link>
      <guid>https://dev.to/tatianakoval/building-cross-border-e-commerce-infrastructure-in-the-eu-estonian-ou-entity-vat-oss-and-remote-1f2k</guid>
      <description>&lt;p&gt;Operating a cross-border e-commerce business within the European Union requires solving two distinct operational hurdles: managing centralized VAT reporting across 27 member states and structuring compliant remuneration for distributed international team members. For non-resident digital entrepreneurs, establishing an Estonian private limited company (OÜ) via the e-Residency program provides a transparent, paperless corporate framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  E-Commerce Setup and the EU VAT Architecture
&lt;/h2&gt;

&lt;p&gt;When selling goods or digital services across EU borders to B2C consumers, merchants face the EU Value Added Tax destination principle. Rather than registering for individual VAT IDs in every customer country, an Estonian company leverages the centralized One-Stop Shop (OSS) scheme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domestic Estonian VAT applies until intra-community distance sales exceed the EU-wide €10,000 threshold.&lt;/li&gt;
&lt;li&gt;Upon passing the threshold, the business reports all consumer VAT through a single quarterly OSS declaration submitted to the Estonian Tax and Customs Board (EMTA).&lt;/li&gt;
&lt;li&gt;For merchants importing consignments under €150 directly to EU buyers, registering for the Import One-Stop Shop (IOSS) simplifies customs clearance and VAT collection at checkout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setting up an &lt;a href="https://innovacg.com/en/estonia/industries/ecommerce" rel="noopener noreferrer"&gt;Estonia company for ecommerce&lt;/a&gt; allows seamless integration with major European payment gateways, merchant acquiring accounts, and multi-currency business accounts without the overhead of physical brick-and-mortar operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote Payroll, Board Remuneration, and TSD Declarations
&lt;/h2&gt;

&lt;p&gt;A frequent compliance challenge for international owners is distinguishing between board member remuneration, local resident employee salaries, and foreign remote contractor fees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Board member fees paid to non-residents are subject to Estonian personal income tax (22% in 2026) and social tax (33%), regardless of where the board meetings take place.&lt;/li&gt;
&lt;li&gt;Salaries paid to remote employees permanently working outside of Estonia are generally taxed in their country of fiscal residence, subject to applicable Double Taxation Treaties (DTT).&lt;/li&gt;
&lt;li&gt;Independent contractors invoicing the OÜ on a B2B basis handle their own local taxes, requiring robust contract documentation to prevent reclassification risks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All payroll taxes and dividend distributions must be declared monthly via the Estonian TSD return by the 10th day of the following calendar month. Professional &lt;a href="https://innovacg.com/en/estonia/tax-accounting/payroll" rel="noopener noreferrer"&gt;payroll services in Estonia&lt;/a&gt; ensure that wage calculations, fringe benefit accounting, and tax withholding adhere strictly to current statutory rates while avoiding double taxation pitfalls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reinvested Profits and Corporate Efficiency
&lt;/h2&gt;

&lt;p&gt;Estonia’s unique corporate tax model does not levy annual corporate income tax on retained and reinvested profits. The standard 22% tax rate applies only when earnings are distributed as dividends to shareholders. For fast-growing e-commerce stores continuously reinvesting working capital into inventory, software development, and supply chain automation, this deferral mechanism significantly accelerates organic business growth.&lt;/p&gt;

</description>
      <category>infrastructure</category>
      <category>management</category>
      <category>startup</category>
    </item>
    <item>
      <title>Engineering High-Performance Law Firm Websites: Architecture, Practice-Area Siloing, and Intake UX</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Mon, 02 Nov 2026 03:31:15 +0000</pubDate>
      <link>https://dev.to/tatianakoval/engineering-high-performance-law-firm-websites-architecture-practice-area-siloing-and-intake-ux-2bnb</link>
      <guid>https://dev.to/tatianakoval/engineering-high-performance-law-firm-websites-architecture-practice-area-siloing-and-intake-ux-2bnb</guid>
      <description>&lt;p&gt;Building a digital presence for a legal practice requires balancing strict regulatory compliance, clear practice-area information architecture, and rapid lead qualification. Potential clients seeking legal representation typically arrive with high urgency and distinct intent. When a website fails to clearly articulate expertise or introduces friction into the consultation intake funnel, visitors leave for competing counsel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice-Area Siloing and URL Architecture
&lt;/h2&gt;

&lt;p&gt;The primary structural mistake on law firm websites is grouping disparate legal services under generic umbrella pages. Search engines and users require explicit contextual depth. Each core practice area requires an independent silo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated practice landing pages (e.g., Corporate Commercial, Litigation, Employment Law) addressing specific client questions, statutory frameworks, and case considerations.&lt;/li&gt;
&lt;li&gt;Nested sub-practice pages targeting long-tail matters, such as shareholder agreements, wrongful dismissal, or commercial lease disputes.&lt;/li&gt;
&lt;li&gt;Cross-linking between individual attorney profiles and the specific practice areas where those lawyers maintain active bar credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A robust technical foundation for &lt;a href="https://mmix.biz/development-of-a-website-for-a-law-firm" rel="noopener noreferrer"&gt;law firm website development&lt;/a&gt; ensures that practice silos maintain clean canonical hierarchy, avoiding duplicate content across multilingual or multi-jurisdictional pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lawyer Bios and E-E-A-T Signals
&lt;/h2&gt;

&lt;p&gt;Search algorithms evaluate legal websites under the "Your Money or Your Life" (YMYL) standard. Google demands verified Experience, Expertise, Authoritativeness, and Trustworthiness. Every attorney profile page should systematically incorporate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bar admissions, jurisdiction certifications, and graduation credentials.&lt;/li&gt;
&lt;li&gt;Published decisions, representative matters (subject to solicitor-client confidentiality), and professional associations.&lt;/li&gt;
&lt;li&gt;Validated Schema.org structured data using &lt;code&gt;Attorney&lt;/code&gt; and &lt;code&gt;LegalService&lt;/code&gt; types with &lt;code&gt;knowsAbout&lt;/code&gt;, &lt;code&gt;alumniOf&lt;/code&gt;, and &lt;code&gt;memberOf&lt;/code&gt; properties.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting structured schema directly to external authority nodes (such as official provincial or state bar directories) helps search engines verify author credentials unambiguously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intake Funnel and Performance Optimization
&lt;/h2&gt;

&lt;p&gt;High-converting law firm sites streamline the path from initial visitor discovery to booked consultation. Implementing multi-step intake forms allows firms to screen for jurisdiction and conflict of interest before booking consultations.&lt;/p&gt;

&lt;p&gt;Furthermore, Core Web Vitals directly impact organic visibility and bounce rates. Prioritizing server-side rendering, deferred script execution for CRM integrations, and responsive assets ensures sub-second page loads even on mobile devices. Partnering with an experienced &lt;a href="https://mmix.biz/" rel="noopener noreferrer"&gt;international digital marketing agency&lt;/a&gt; enables legal practices to transform their web architecture into an authoritative, scalable client acquisition engine.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A 7-screen quiz instead of a contact form: lead funnel for a moving company in Ottawa</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Sat, 31 Oct 2026 00:06:00 +0000</pubDate>
      <link>https://dev.to/tatianakoval/a-7-screen-quiz-instead-of-a-contact-form-lead-funnel-for-a-moving-company-in-ottawa-2ja9</link>
      <guid>https://dev.to/tatianakoval/a-7-screen-quiz-instead-of-a-contact-form-lead-funnel-for-a-moving-company-in-ottawa-2ja9</guid>
      <description>&lt;p&gt;Beaver Movers is a moving company in Ottawa. They came to us with a regular website and a regular contact form, and wanted ads on Meta to bring in booked moves. Below is what we built, what came out of it, and the bugs we paid for along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a quiz
&lt;/h2&gt;

&lt;p&gt;A moving request has a lot of variables: date, from where, to where, size of the place, stairs, how urgent. A long form with all of that on one screen loses people on a phone. A form that asks only for name and phone gives the dispatcher nothing to work with.&lt;/p&gt;

&lt;p&gt;So we split it into 7 short screens, mobile first. Each screen is one question with big tap targets. The last screen asks for contact details, when the person has already invested a minute in the answers.&lt;/p&gt;

&lt;p&gt;One question matters more than the others: how urgent the move is and what budget the person has in mind. It goes into a hidden field for manual triage. The visitor never sees it echoed back, and the dispatcher sees it first in the lead card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the lead goes
&lt;/h2&gt;

&lt;p&gt;The quiz posts to a small server-side script, &lt;code&gt;send_lead.php&lt;/code&gt;, which:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;validates the payload,&lt;/li&gt;
&lt;li&gt;sends a card to the dispatcher's Telegram,&lt;/li&gt;
&lt;li&gt;fires the Lead event to Meta through the Conversions API with an &lt;code&gt;event_id&lt;/code&gt;, so the browser pixel and the server event are counted once and the ad account learns from real submissions. The pixel itself loads only after cookie consent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Telegram bot token lives only on the server. Our first version called the Bot API from the browser, which means anyone who opened dev tools could read the token. If you are building something similar, keep every token behind your own endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;Leads from the Meta campaign came in at about $10 each. On 1 August a request from the quiz turned into a move on the same day: the crew had a free slot that evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bugs we paid for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logs were readable over HTTP.&lt;/strong&gt; The lead log and the CAPI log sat in a web-accessible folder. We closed it with a deny rule in nginx and learned that the rule disappears if someone recreates the vhost. So that check now sits on the list for every server change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-app browsers.&lt;/strong&gt; Facebook and Instagram open links in their own browser. There, &lt;code&gt;visualViewport&lt;/code&gt; height jumps around when the toolbar hides, and the quiz screens shifted. Pinning the layout to &lt;code&gt;window.innerHeight&lt;/code&gt; fixed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sticky &lt;code&gt;:hover&lt;/code&gt; on touch screens.&lt;/strong&gt; An answer tile stayed highlighted after the tap, and people thought it was already selected. Hover styles now apply only under &lt;code&gt;@media (hover: hover) and (pointer: fine)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two funnels on one pixel.&lt;/strong&gt; We ran a second landing page on the same Meta pixel and the attribution mixed. One pixel per funnel, or at least separate custom events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design tokens.&lt;/strong&gt; Our first draft used a palette we invented. The client rejected it, fairly. The final version takes colours and fonts from their live site, so the quiz looks like part of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we would reuse
&lt;/h2&gt;

&lt;p&gt;For any service where a request has several variables, we now start with a quiz. One hidden qualifying question goes straight to the person who calls back. Leads travel through our own endpoint to Telegram and the Conversions API, with no tokens in the browser. And before the first ad goes live, we run the quiz inside the Facebook and Instagram in-app browsers on a real phone.&lt;/p&gt;

&lt;p&gt;The live quiz is at beaver-movers.mmix.ca. The full case, with screenshots of the quiz and the site, is on our site: &lt;a href="https://mmix.biz/beaver-movers" rel="noopener noreferrer"&gt;Beaver Movers quiz funnel case&lt;/a&gt;. More of our work is in the &lt;a href="https://mmix.biz/portfolio/" rel="noopener noreferrer"&gt;portfolio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We are MMIX, a small studio in Ottawa and Kyiv. We build websites, client portals, CRM set-ups and bots like this one for small businesses. If you have a funnel like this in mind, tell us about it in the comments, or answer the six questions in our &lt;a href="https://mmix.biz/website-cost-estimate" rel="noopener noreferrer"&gt;website cost estimate quiz&lt;/a&gt; and get a written estimate.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>marketing</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>D-U-N-S number for Google Play and Apple developer accounts: a practical guide</title>
      <dc:creator>Tatiana Koval</dc:creator>
      <pubDate>Tue, 22 Sep 2026 14:28:49 +0000</pubDate>
      <link>https://dev.to/tatianakoval/d-u-n-s-number-for-google-play-and-apple-developer-accounts-a-practical-guide-1j4k</link>
      <guid>https://dev.to/tatianakoval/d-u-n-s-number-for-google-play-and-apple-developer-accounts-a-practical-guide-1j4k</guid>
      <description>&lt;p&gt;If you ship mobile apps under a company name, sooner or later a console will ask for a D-U-N-S Number. For many small studios this is the slowest part of the whole launch: code is ready, the store listing is ready, and the account is stuck waiting on a business registry. Below is the checklist I hand to dev teams. It focuses on what the platforms actually check and how to avoid the mismatch errors that block accounts. Facts are from Apple, Google and Dun &amp;amp; Bradstreet documentation, checked on 21 September 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Organization accounts on Apple and Google Play need a D-U-N-S Number. Individual accounts do not.&lt;/li&gt;
&lt;li&gt;Plan for up to a week via Apple and up to 30 days for Google Play.&lt;/li&gt;
&lt;li&gt;Name and address in every console have to be identical to the D&amp;amp;B record.&lt;/li&gt;
&lt;li&gt;Paying D&amp;amp;B to expedite does nothing for Apple.&lt;/li&gt;
&lt;li&gt;US federal systems (SAM.gov) dropped DUNS in 2022, so ignore old grant guides.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;Dun &amp;amp; Bradstreet hands out and maintains these nine-digit company IDs. Apple describes it as identifying business entities "on a location-specific basis", which means the number points to a legal entity at a specific address. If your company has several addresses, D&amp;amp;B asks for a separate number per location. Use the one that matches the address you put into the developer console.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide: individual or organization
&lt;/h2&gt;

&lt;p&gt;This decision determines whether you need the number at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual enrollment: no D-U-N-S Number.&lt;/li&gt;
&lt;li&gt;Sole proprietorships and single-person businesses enroll as individuals.&lt;/li&gt;
&lt;li&gt;Enrolling as an organization means your legal entity must own the number. Apple turns away DBAs, fictitious names, trading names and branch offices.&lt;/li&gt;
&lt;li&gt;On top of that: a live public site on the company's own domain (a social media page or a parked registrar page will fail), a person with authority to sign for the company, and 99 USD per year.&lt;/li&gt;
&lt;li&gt;Customers see your legal entity name in the Seller field of the App Store listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Google Play&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personal accounts: no D-U-N-S Number.&lt;/li&gt;
&lt;li&gt;Organization accounts: required since 31 August 2023 for new accounts, together with the organization's website. Google's help page says you cannot create an organization account without one.&lt;/li&gt;
&lt;li&gt;Government entities go through support without a number.&lt;/li&gt;
&lt;li&gt;If your region has no way to issue the number, support can offer an alternative verification path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Android Developer Console (sideloaded and non-Play apps)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organization sign-up asks for the number as well.&lt;/li&gt;
&lt;li&gt;Checks begin on 30 September 2026 for apps installed by people in Brazil, Indonesia, Singapore and Thailand; the rest of the world follows in 2027.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Timeline you can plan a sprint around
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Official estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apple flow&lt;/td&gt;
&lt;td&gt;D&amp;amp;B issues within five business days, Apple receives it within two more; after two weeks, email D&amp;amp;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;up to 30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android Developer Console&lt;/td&gt;
&lt;td&gt;up to 28 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&amp;amp;B standard request&lt;/td&gt;
&lt;td&gt;30 business days max&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&amp;amp;B expedited (paid)&lt;/td&gt;
&lt;td&gt;8 business days max&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Apple states that expediting will not shorten its waiting period.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Look up before you apply
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Apple lookup  -&amp;gt; requires Apple Account sign-in
D&amp;amp;B lookup    -&amp;gt; free, public, on the D&amp;amp;B site
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apple itself recommends checking before enrollment. A company may already have a number from a bank or supplier application years ago.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Freeze your canonical company data
&lt;/h3&gt;

&lt;p&gt;Create one source of truth in your repo wiki or ops docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;legal_name_en&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Example&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Studio&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;LLC"&lt;/span&gt;
&lt;span class="na"&gt;legal_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;street,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;city,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;postcode,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;country"&lt;/span&gt;
&lt;span class="na"&gt;mailing_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;..."&lt;/span&gt;
&lt;span class="na"&gt;website&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com"&lt;/span&gt;
&lt;span class="na"&gt;duns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste these exact strings into D&amp;amp;B, App Store Connect, Play Console and Google payments. Apple's lookup needs the legal entity name, headquarters address, mailing address and your work contacts. Companies in Ukraine also need an official English name for the D&amp;amp;B partner's form, and D&amp;amp;B publishes no transliteration rule, so pick one spelling and stick to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Request the number
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; when the lookup comes back empty during organization enrollment, Apple lets you forward your details to D&amp;amp;B and request a free number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything else:&lt;/strong&gt; go to D&amp;amp;B directly or to its local partner. Ukrainian companies use the form on dnb.com.ua (run by A.B.M. Ryzyk-Inform): company code, names in both languages, street address, VAT ID, contacts, website. Nothing to upload.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expect a verification call from D&amp;amp;B, so list a contact who can answer questions about the company.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verify the profile before you enroll
&lt;/h3&gt;

&lt;p&gt;Diff the D&amp;amp;B record against your frozen data. According to Google, a payments profile that disagrees with D&amp;amp;B can get the account restricted and every app taken down.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Handle changes deliberately
&lt;/h3&gt;

&lt;p&gt;Renamed the company or moved offices? Update D&amp;amp;B first. Apple picks up changes within two business days. Google Play syncs within five business days after D&amp;amp;B finishes, then asks you to re-verify your developer identity. Schedule this outside release weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The error you will probably see
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The information you entered did not match your D&amp;amp;B profile. Before submitting your information, check your D&amp;amp;B profile. If you've recently changed your legal entity name, update your D&amp;amp;B profile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is Apple's wording. Fix the data on the D&amp;amp;B side, then retry. On Apple's forums users also report long names being truncated in the D&amp;amp;B database; that tip comes from the community without official confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;D&amp;amp;B charges nothing for a standard request. Apple words it as free "in most jurisdictions". The expedited D&amp;amp;B option has a fee that D&amp;amp;B does not list on its page. The Apple developer membership for organizations is 99 USD a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outsourcing the paperwork
&lt;/h2&gt;

&lt;p&gt;For a solo developer, the DIY path is fine. For an agency shipping client apps under several legal entities, the admin adds up. Two services I trust for Ukrainian companies: &lt;a href="https://regserv.biz/en/obtaining-a-duns-number/" rel="noopener noreferrer"&gt;RegServ handles DUNS registration end to end&lt;/a&gt;, and &lt;a href="https://zakon.lviv.ua/en/poluchenie-nomera-duns-dans.html" rel="noopener noreferrer"&gt;Zakon Lviv covers D-U-N-S cases for IT developers and exporters&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does the same number work for Apple and Google?&lt;/strong&gt; Yes, for the same entity and address, provided both consoles mirror D&amp;amp;B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am a sole proprietor. Do I need it?&lt;/strong&gt; For Apple, no: you enroll as an individual. For Google Play, a personal account works without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is DUNS still needed for SAM.gov?&lt;/strong&gt; It was retired there in April 2022. SAM.gov now issues its own free 12-character Unique Entity ID.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm Tatiana Koval, I help companies launch products in foreign markets. Questions about your specific setup are welcome in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>mobile</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
