10 Commits

8 changed files with 133 additions and 1415 deletions
@@ -0,0 +1,26 @@
Rollback and Recovery Changelog
Timestamp: ${TS}
Actions performed:
- Reset main branch (working tree and HEAD) to commit 6127867d51c9f0e4e86d1d8390081208f45136ab and force-pushed to origin/main.
- Confirmed README.md content matches version at commit 6127867d51.
- Investigated deleted backups: located backups in parent commit 5189b23 and extracted available files into recovered_backups/ directory in the working tree (not yet committed).
- Created this changelog and saved recovered backup files under recovered_backups/ for review.
Recovered backup files:
- backups/index.html.20260324164129.bak -> recovered_backups/index.html.20260324164129.bak (extracted from commit 5189b23)
- backups/index.html.bak.20260324164053 -> recovered_backups/index.html.bak.20260324164053 (extracted from commit 5189b23)
Notes on recovery:
- The deleted backup files were present in previous commits and have been extracted from git history into recovered_backups/.
- Additional backup files referencing other timestamps exist in git history (e.g., backups/index.html.20260324164556.bak and backups/index.html.20260324164626.bak). These can be extracted on request.
Suspicious findings:
- Commit 6127867d51 (message: "Deleted Backups and changed readme") removed backup files. Author: Oliver. This commit may be responsible for missing backups. Please confirm whether this deletion was authorized.
Remaining tasks / recommendations:
- Decide whether to reintroduce recovered backups into main branch. Restoring them to main will create a new commit on top of 6127867d51 (this changelog can be used), or they can be provided in a separate branch or as artifacts.
- If you want me to commit the recovered_backups/ content and this changelog to the repository and push, confirm and I will proceed.
- If you prefer the repository to remain exactly at 6127867d51 (no additional commits), I will not commit recovered files; instead I will provide them separately (download/attach) and leave main at the rollback state.
+44 -295
View File
@@ -1,311 +1,60 @@
# README
# NGO Website — ODOO4projects
Important: Update this README with every commit.
**Project:** NGO marketing homepage and blog
**URL:** [ngo.odoo4projects.com](https://ngo.odoo4projects.com)
**Stack:** Static HTML · Tailwind CSS · Vanilla JS
Repository purpose
- Project: NGO public website using Odoo-focused messaging and Odoo4Projects hosting service.
- Goal: Fast, accessible marketing homepage and blog that ranks well, highlights transparency and minimal admin for NGOs, and promotes donor acquisition and retention.
---
Repository rules
- Blog posts are saved in blog.json (do not create separate backup files).
- Do not create backups in the repo.
## Repository Rules
CI:
- CI: run linting, Tailwind build, accessibility checks, basic SEO checks, performance budget (build must verify page size and critical render time). (Keep CI config outside this README; note these checks are required.)
- Blog posts live in `blog.json` — do not create separate backup files.
- No backup files in the repo.
- Update this README with every commit.
Main Page Blocks (ordered)
1. Hero
- Headline: Transparent
giving.
Minimal
admin.
Big
impact.
- Subheadline: Manage
donors,
communicate
transparently,
and
focus
on
impact
Odoo
made
simple
for
NGOs.
- Primary CTA: Donate
/
Support and secondary CTA: See
donor
management
2. Trust & Numbers bar
- Donor count, funds raised, projects completed, partner logos
3. How it works (3 steps)
- Step 1: Set up in minutes (little admin)
- Step 2: Track donations & communicate (donor communication)
- Step 3: Report impact (transparent reporting)
4. Features (highlighted cards)
- Donor Management (CRM + gift history)
- Easy Communication (email, receipts, automated updates)
- Transparent Reporting (dashboards, exports for donors)
- Low Admin (templates, automation, minimal data entry)
- Security & Compliance
5. Impact Stories / Testimonials
- Short stories with photos and metrics
6. Blog highlights
- Link to blog page, featured posts
7. Call to Action block
- Repeat primary CTA with trust indicators
8. Footer
- Contact, legal, social links, languages
---
Languages:
- Default: English
- Additional: Spanish (es), French (fr) — prepare for translation-ready content
## Page Structure
Technology Stack:
- Tailwind CSS. Static-first, optimized HTML, semantic markup.
| # | Block | Purpose |
|---|-------|---------|
| 1 | **Hero** | Headline, subheadline, free-trial CTA, key stats |
| 2 | **Hot NGO Topics** | Three focused topic cards (transparency, communications, fundraising) |
| 3 | **Blog** | Latest articles loaded dynamically from `blog.json` |
| 4 | **Sign Up — Free Trial** | Email signup form, 4-week free trial, no credit card |
| 5 | **Have a Meeting** | 30-minute consultation booking via Google Calendar |
SEO & Performance goals:
- Fast page that ranks well: semantic HTML, structured data (schema.org), descriptive meta titles and descriptions, sitemap, robots.txt, optimized images (modern formats), critical CSS inlined, defer non-critical JS.
- Focus keywords: NGO donor management, transparent donations, Odoo for NGOs, donor communication, minimal admin for charities
---
Suggested meta and headings (to include on homepage):
- Meta title (homepage): Odoo
for
NGOs
Transparent
donor
management
with
minimal
admin
- Meta description: Manage
donors,
communicate
transparently,
and
report
impact
with
minimal
admin.
Odoo
solutions
tailored
for
NGOs
fast,
secure,
and
donor-friendly.
- H1: Transparent
donor
management
with
minimal
admin
- H2 examples: How
Odoo
simplifies
donor
management, Features:
Donor
CRM,
automated
communication,
impact
reporting, Stories
from
our
partners
## CI Checks (required on every push)
Suggested CTAs (text variations):
- Primary: Support
now / Donate
- Secondary: See
donor
management / Schedule
a
demo
- Micro CTA: Download
impact
report
- **HTML lint** — valid markup, no broken anchors
- **JS lint** — no errors, no `console.error` left in production paths
- **Tailwind build** — `npx tailwindcss -i ./src/input.css -o ./assets/site.css --minify` must exit 0
- **Corporate design compliance:**
- No CSS gradients — `gradient`, `bg-*-gradient`, `linear-gradient`, `radial-gradient` are forbidden
- No CSS animations or keyframes — `animate-*`, `@keyframes`, transform-based `hover:translate-*` are forbidden
- No blur or glassmorphism effects — `backdrop-blur`, `backdrop-filter` are forbidden
- Colors must use the approved brand palette only: `brand-ink · brand-primary · brand-accent · brand-sunrise · brand-emerald · brand-snow · brand-smoke`
- Images must be served from `odoo4projects.com`, `images.unsplash.com`, or local `assets/`
- **Accessibility** — heading hierarchy (one `<h1>` per page), `alt` on all images, sufficient contrast (WCAG AA)
- **Performance budget** — total page weight ≤ 200 KB (excluding cached fonts); critical render path ≤ 1 s on fast 3G
- **SEO** — `<title>`, `<meta name="description">`, `<h1>`, canonical `<link>`, and JSON-LD structured data must be present
Content & SEO guidance (short):
- Use clear, trust-building language. Highlight transparency, automated communications, and low admin burden.
- Include one donor-focused success story on the homepage and link to deeper case studies in the blog.
- Use structured snippets for stats (JSON-LD) for trust signals.
---
Initial Blog Posts (to be saved into blog.json):
- Filename: blog.json (root)
- Initial entry (one object in the posts array):
{
id: how-odoo-makes-donor-management-easy,
title: How
Odoo
makes
donor
management
easy,
date: 2026-03-24,
author: Odoo4Projects
-
NGO
team,
categories: [donor-management, transparency, productivity],
tags: [Odoo, donor
communication, automation, minimal
admin],
excerpt: Learn
how
Odoo
reduces
administrative
effort,
improves
donor
communication,
and
increases
transparency
for
NGOs.,
content: Odoo
makes
donor
management
easy
by
centralizing
donor
data,
automating
receipts
and
updates,
and
generating
transparent
reports
donors
trust.
With
minimal
admin
required,
NGOs
can
set
up
templates,
schedule
automated
communications,
and
track
gifts
and
commitments
in
one
place.
Donors
receive
timely
receipts
and
impact
updates
that
strengthen
trust
and
retention.
Odoos
dashboards
provide
simple,
exportable
reports
for
accountability.
The
result:
less
time
on
admin,
more
time
on
mission.,
featured: true
}
## Languages
Social media snippets (short, use for cards):
- Tweet/LinkedIn (short): Reduce
admin,
increase
trust.
See
how
Odoo
helps
NGOs
manage
donors
and
report
impact
with
transparency.
Read:
/blog/how-odoo-makes-donor-management-easy
- Facebook/Instagram (longer): Spend
less
time
on
paperwork
and
more
on
impact.
Odoo
helps
NGOs
automate
donor
receipts,
keep
supporters
updated,
and
produce
clear
impact
reports
all
with
minimal
admin.
Learn
more:
/blog/how-odoo-makes-donor-management-easy
| Code | Language |
|------|----------|
| `en` | English (default) |
| `es` | Español |
| `de` | Deutsch |
Notes for the designer (content only):
- Keep layout simple and fast; prefer server-side rendered HTML where possible for SEO.
- Provide components/placeholder content for each Main Page Block above.
- Prefill the blog.json with the initial blog entry above.
- Add README.md with this content and commit to repo root. Ensure README is updated on every future commit.
All UI strings are managed via the inline `translations` object in `index.html`.
Deliverables (create and commit):
1. README.md (prefilled as above)
2. blog.json (prefilled with the initial entry)
---
If you need any copy adjustments (tone, length, languages), ask and we will provide final texts. Thank you.
## Focus Keywords
`NGO donor management` · `transparent donations` · `Odoo for NGOs` · `donor communication` · `minimal admin for charities`
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

-555
View File
@@ -1,555 +0,0 @@
<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>🐻 NGO ERP Landingpage | ODOO4projects</title>
<meta name="description" content="Purpose-built ERP platform for NGOs. Centralize programs, automate donor and grant reporting, and launch in weeks with ODOO4projects." />
<meta name="keywords" content="NGO ERP system, nonprofit management software, ERP for NGOs, NGO operations platform, ODOO for nonprofits" />
<link rel="icon" href="https://odoo4projects.com/web/image/website/1/favicon?unique=725c3af" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"></noscript>
<link rel="preload" href="assets/site.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
<noscript><link rel="stylesheet" href="assets/site.css"></noscript>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "NGO ERP Landing",
"about": "ERP for NGOs",
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"logo": "https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3"
},
"mainEntity": {
"@type": "SoftwareApplication",
"name": "ODOO4projects NGO ERP",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Cloud",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD",
"description": "4-week free trial of NGO ERP workspace"
}
}
}
</script>
<script defer data-domain="ngo.odoo4projects.com" src="https://plausible.odoo4projects.com/js/script.tagged-events.js"></script>
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
<style id="emoji-style">
/* Emoji styling to match heading font and spacing */
.emoji{font-family:inherit;font-size:1em;vertical-align:middle;margin-right:0.5rem;display:inline-block}
</style>
</head>
<body class="bg-brand-snow text-brand-ink">
<header class="bg-hero-gradient text-white">
<div class="max-w-6xl mx-auto px-6 py-6 flex flex-wrap items-center justify-between gap-4">
<div class="flex items-center gap-3">
<img src="https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3" alt="ODOO4projects logo" class="h-10 w-auto" />
<span class="uppercase tracking-[0.3em] text-xs text-brand-smoke" data-i18n="hero-badge"></span>
</div>
<nav class="flex flex-wrap items-center gap-6 text-sm">
<a href="#blog" class="hover:text-brand-sunrise transition" data-i18n="nav-resources"></a>
<a href="#trial" class="hover:text-brand-sunrise transition" data-i18n="nav-trial"></a>
</nav>
<div class="flex items-center gap-3">
<label for="lang-selector" class="sr-only">Language</label>
<select id="lang-selector" class="bg-white/10 border border-white/30 text-sm rounded-full px-3 py-1.5 focus:outline-none focus:ring-2 focus:ring-brand-sunrise/70">
<option value="en">English</option>
<option value="es">Español</option>
<option value="de">Deutsch</option>
</select>
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="px-5 py-2 bg-brand-sunrise text-brand-ink font-semibold rounded-full text-sm shadow-brand hover:translate-y-0.5 transition plausible-event-name=meeting" data-i18n="cta-meeting"></a>
</div>
</div>
<div class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-2 gap-12 items-center">
<div>
<p class="text-brand-sunrise font-semibold mb-4" data-i18n="hero-pill"></p>
<h1 class="text-4xl md:text-5xl font-semibold leading-tight mb-6"><span class=\"emoji\" role=\"img\" aria-label=\"bear\">🐻</span> <span data-i18n=\"hero-headline\"></span></h1>
<p class="text-lg text-white/80 mb-8" data-i18n="hero-subheadline"></p>
<div class="flex flex-wrap gap-4">
<a href="#trial" class="px-6 py-3 bg-brand-accent hover:bg-brand-sunrise text-brand-ink font-semibold rounded-full transition" data-i18n="cta-trial" data-event="cta:hero-trial"></a>
</div>
<div class="mt-10 grid grid-cols-2 gap-6 text-sm text-white/80">
<div>
<p class="text-3xl font-semibold text-white">38%</p>
<p data-i18n="hero-stat1"></p>
</div>
<div>
<p class="text-3xl font-semibold text-white">2x</p>
<p data-i18n="hero-stat2"></p>
</div>
</div>
</div>
<div class="bg-white/10 backdrop-blur-lg rounded-3xl p-8 shadow-brand">
<div class="relative">
<img src="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?auto=format&fit=crop&w=900&q=80" alt="NGO team collaborating" class="rounded-2xl" />
<div class="absolute -bottom-8 left-8 bg-white/90 text-brand-ink px-4 py-3 rounded-2xl shadow-lg">
<p class="text-xs uppercase tracking-widest text-brand-primary mb-1" data-i18n="hero-card-title"></p>
<p class="text-lg font-semibold" data-i18n="hero-card-headline"></p>
<p class="text-sm text-brand-primary" data-i18n="hero-card-body"></p>
</div>
</div>
</div>
</div>
</header>
<section class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-3 gap-8">
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
<h2 class="text-xl font-semibold mb-2" data-i18n="value1-title"></h2>
<p class="text-sm text-brand-ink/80" data-i18n="value1-body"></p>
</article>
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
<h2 class="text-xl font-semibold mb-2" data-i18n="value2-title"></h2>
<p class="text-sm text-brand-ink/80" data-i18n="value2-body"></p>
</article>
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
<h2 class="text-xl font-semibold mb-2" data-i18n="value3-title"></h2>
<p class="text-sm text-brand-ink/80" data-i18n="value3-body"></p>
</article>
</section>
<section id="blog" class="bg-white py-20">
<div class="max-w-6xl mx-auto px-6">
<div class="flex flex-col md:flex-row md:items-end md:justify-between gap-6 mb-12">
<div>
<p class="text-sm uppercase tracking-[0.3em] text-brand-primary mb-3" data-i18n="blog-tagline"></p>
<h2 class="text-3xl font-semibold" data-i18n="blog-title"></h2>
<p class="text-brand-ink/80" data-i18n="blog-subtitle"></p>
</div>
<button id="blog-toggle" type="button" class="text-brand-accent font-semibold hover:underline underline-offset-4">Browse all articles →</button>
</div>
<div id="blog-grid" class="grid gap-6 md:grid-cols-3"></div>
<p id="blog-error" class="text-sm text-brand-ink/70 mt-6 hidden"></p>
</div>
</section>
<section id="trial" class="bg-brand-ink text-white py-20">
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12">
<div>
<p class="text-brand-sunrise text-sm uppercase tracking-[0.3em] mb-4" data-i18n="trial-tagline"></p>
<h2 class="text-3xl font-semibold mb-4" data-i18n="trial-heading"></h2>
<p class="text-white/80 mb-6" data-i18n="trial-body"></p>
<ul class="space-y-4 text-sm text-white/80">
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet1"></span></li>
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet2"></span></li>
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet3"></span></li>
</ul>
</div>
<form class="bg-white text-brand-ink rounded-3xl p-8 shadow-brand space-y-5" data-event="form:trial">
<label class="block text-sm font-medium">
<span data-i18n="trial-label-email"></span>
<input type="email" required class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-email" />
</label>
<label class="block text-sm font-medium">
<span data-i18n="trial-label-priority"></span>
<select class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent">
<option data-i18n-option="priority-1"></option>
<option data-i18n-option="priority-2"></option>
<option data-i18n-option="priority-3"></option>
<option data-i18n-option="priority-4"></option>
</select>
</label>
<label class="block text-sm font-medium">
<span data-i18n="trial-label-region"></span>
<input type="text" class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-region" />
</label>
<p class="text-xs text-brand-ink/70" data-i18n="trial-microcopy"></p>
<button type="submit" class="w-full py-3 rounded-2xl bg-brand-accent text-brand-ink font-semibold" data-i18n="cta-trial"></button>
<p class="text-xs text-brand-ink/60 text-center" data-i18n="trial-help"></p>
</form>
</div>
</section>
<section id="meeting" class="py-20 bg-white">
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12 items-center">
<div>
<p class="uppercase text-xs tracking-[0.3em] text-brand-primary mb-3" data-i18n="meeting-tagline"></p>
<h2 class="text-3xl font-semibold mb-4" data-i18n="meeting-heading"></h2>
<p class="text-brand-ink/80 mb-6" data-i18n="meeting-body"></p>
<ul class="space-y-4 text-sm text-brand-ink/80">
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet1"></span></li>
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet2"></span></li>
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet3"></span></li>
</ul>
</div>
<div class="bg-brand-snow border border-brand-smoke rounded-3xl p-8 shadow-brand">
<p class="text-sm text-brand-primary font-semibold mb-2" data-i18n="meeting-note-title"></p>
<p class="text-brand-ink font-semibold text-xl mb-4" data-i18n="meeting-note-body"></p>
<p class="text-sm text-brand-ink/70" data-i18n="meeting-note-hint"></p>
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="inline-flex items-center gap-2 mt-4 text-sm font-semibold text-brand-primary hover:text-brand-accent plausible-event-name=meeting" data-i18n="meeting-note-cta"></a>
</div>
</div>
</section>
<footer class="bg-brand-ink text-white py-10">
<div class="max-w-6xl mx-auto px-6 flex flex-col md:flex-row gap-6 items-center justify-between text-sm">
<p>© <span id="year"></span> <span data-i18n="footer-note"></span></p>
<div class="flex gap-4">
<a href="https://odoo4projects.com/support" class="hover:text-brand-sunrise" data-i18n="footer-support"></a>
<a href="https://odoo4projects.com/legal" class="hover:text-brand-sunrise" data-i18n="footer-legal"></a>
<a href="https://odoo4projects.com/contactus" class="hover:text-brand-sunrise" data-i18n="footer-contact"></a>
</div>
</div>
</footer>
<script>
const translations = {
en: {
'nav-resources': 'Resources',
'nav-trial': 'Free Trial',
'hero-badge': 'ERP FOR NGOs',
'hero-pill': 'Unified NGO ERP Platform',
'hero-headline': 'Simplify every mission workflow with an ERP built for NGOs',
'hero-subheadline': 'Consolidate programs, automate donor and grant reporting, and give every field office the same source of truth. Launch in weeks with templates tailored to humanitarian and community-impact teams.',
'cta-trial': 'Sign Up for Free Trial',
'cta-meeting': 'Schedule a Meeting',
'hero-stat1': 'Faster donor & grant reporting cycles',
'hero-stat2': 'Increase in volunteer onboarding speed',
'hero-card-title': 'Live KPI snapshot',
'hero-card-headline': 'Program Impact Dashboard',
'hero-card-body': 'Realtime budgets • Volunteer hours • Donor health',
'value1-title': 'Transparency for Donors',
'value1-body': 'Accounting-ready ledgers pair receipts with stories so donors see every peso without extra spreadsheets or calls.',
'value2-title': 'Donor Management & Communications',
'value2-body': 'Automation buddies queue thank-yous, newsletters, and SMS nudges so every supporter hears from you right on time.',
'value3-title': 'International Fund Raising',
'value3-body': 'Multilingual homepages, acquisition kanbans, and project trackers keep campaigns aligned across countries without rebuilding playbooks.',
'blog-tagline': 'Insights for NGO leaders',
'blog-title': 'Blog & resource hub',
'blog-subtitle': 'Get your impulses with our entertaining playbooks.',
'blog-link': 'Browse all articles →',
'blog-all-open': 'Show fewer articles',
'blog-read-more': 'Read more',
'blog-show-less': 'Show less',
'blog-error': 'Unable to load articles right now.',
'trial-tagline': 'Sign up free trial',
'trial-heading': 'Launch your NGO ERP sandbox in under 5 minutes',
'trial-body': 'Experience localized NGO templates, donor CRM, and automation recipes. No credit card required—just choose your focus area and invite teammates.',
'trial-bullet1': 'Pre-loaded NGO chart of accounts & grant tracking',
'trial-bullet2': 'Automated donor receipts + impact dashboards',
'trial-bullet3': 'Guided checklists for go-live within 30 days',
'trial-label-email': 'Work email',
'trial-placeholder-email': 'impact@yourngo.org',
'trial-label-priority': 'Primary priority',
'priority-1': 'Grant compliance reporting',
'priority-2': 'Volunteer management',
'priority-3': 'Donor CRM & fundraising',
'priority-4': 'Finance & procurement',
'trial-label-region': 'Country / region',
'trial-placeholder-region': 'e.g., Paraguay, LATAM',
'trial-microcopy': 'No credit card required. EU hosting & GDPR-ready.',
'trial-help': 'Need help? Use the Schedule a Meeting button in the header to book a guided call.',
'meeting-tagline': 'Have a meeting',
'meeting-heading': 'See how your NGO can streamline operations, save time, and reduce errors',
'meeting-body': 'A 30-minute live walkthrough tailored to your mission, covering localization, integrations, and governance. Walk away with a rollout roadmap.',
'meeting-bullet1': 'Baseline automation scoring',
'meeting-bullet2': 'Tech stack alignment & data migration plan',
'meeting-bullet3': 'Budget templates & total cost forecast',
'meeting-note-title': 'How scheduling works',
'meeting-note-body': 'You will meet with an NGO consultant from ODOO4projects.',
'meeting-note-hint': 'Use the Schedule a Meeting button in the header and tell us during booking which question we should prepare for.',
'meeting-note-cta': 'Open booking calendar',
'footer-note': 'ODOO4projects — Hosting for the AI generation',
'footer-support': 'Support',
'footer-legal': 'Legal',
'footer-contact': 'Contact'
},
es: {
'nav-resources': 'Recursos',
'nav-trial': 'Prueba gratuita',
'hero-badge': 'ERP PARA ONGs',
'hero-pill': 'Plataforma ERP unificada para ONGs',
'hero-headline': 'Simplifica cada misión con un ERP diseñado para ONGs',
'hero-subheadline': 'Centraliza programas, automatiza reportes de donantes y subvenciones y ofrece a cada sede la misma fuente de verdad. Implementa en semanas con plantillas creadas para equipos humanitarios.',
'cta-trial': 'Crear prueba gratuita',
'cta-meeting': 'Agendar una reunión',
'hero-stat1': 'Ciclos más rápidos de reportes a donantes y subvenciones',
'hero-stat2': 'Mayor velocidad en la incorporación de voluntarios',
'hero-card-title': 'Panel de KPIs en vivo',
'hero-card-headline': 'Tablero de impacto programático',
'hero-card-body': 'Presupuestos en tiempo real • Horas voluntarias • Salud de donantes',
'value1-title': 'Transparencia para donantes',
'value1-body': 'Libros contables listos unen recibos y relatos para que cada donante vea su aporte sin hojas extra.',
'value2-title': 'Gestión y comunicación con donantes',
'value2-body': 'Bots de automatización programan agradecimientos, boletines y SMS para que cada aliado reciba noticias a tiempo.',
'value3-title': 'Recaudación internacional',
'value3-body': 'Sitios multilingües, tableros de adquisición y proyectos coordinan campañas globales sin rehacer playbooks ni procesos.',
'blog-tagline': 'Ideas para líderes de ONG',
'blog-title': 'Blog y centro de recursos',
'blog-subtitle': 'Recibe impulsos con nuestros playbooks entretenidos.',
'blog-link': 'Ver todos los artículos →',
'blog-all-open': 'Mostrar menos artículos',
'blog-read-more': 'Leer más',
'blog-show-less': 'Mostrar menos',
'blog-error': 'No pudimos cargar los artículos en este momento.',
'trial-tagline': 'Activa tu prueba',
'trial-heading': 'Lanza tu sandbox ERP para ONG en menos de 5 minutos',
'trial-body': 'Explora plantillas localizadas, CRM de donantes y recetas de automatización. Sin tarjeta; solo elige tu prioridad e invita al equipo.',
'trial-bullet1': 'Plan contable para ONG y seguimiento de subvenciones precargado',
'trial-bullet2': 'Recibos automáticos más tableros de impacto',
'trial-bullet3': 'Checklists guiados para salir a producción en 30 días',
'trial-label-email': 'Correo laboral',
'trial-placeholder-email': 'impacto@tuong.org',
'trial-label-priority': 'Prioridad principal',
'priority-1': 'Reportes de subvenciones',
'priority-2': 'Gestión de voluntarios',
'priority-3': 'CRM y recaudación',
'priority-4': 'Finanzas y compras',
'trial-label-region': 'País / región',
'trial-placeholder-region': 'ej. Paraguay, LATAM',
'trial-microcopy': 'Sin tarjeta. Hosting en la UE y cumplimiento GDPR.',
'trial-help': '¿Dudas? Usa el botón “Agendar una reunión” en el encabezado para reservar una llamada guiada.',
'meeting-tagline': 'Agenda una reunión',
'meeting-heading': 'Descubre cómo optimizar operaciones, ahorrar tiempo y reducir errores',
'meeting-body': 'Sesión de 30 minutos adaptada a tu misión, con localización, integraciones y gobernanza. Sal con un plan de implementación.',
'meeting-bullet1': 'Diagnóstico de automatización',
'meeting-bullet2': 'Plan de migración y alineación tecnológica',
'meeting-bullet3': 'Plantillas presupuestarias y previsión de costes',
'meeting-note-title': 'Cómo reservar',
'meeting-note-body': 'Te reunirás con un consultor ONG de ODOO4projects.',
'meeting-note-hint': 'Usa el botón “Agendar una reunión” del encabezado y cuéntanos durante la reserva qué pregunta debemos preparar.',
'meeting-note-cta': 'Abrir calendario de reservas',
'footer-note': 'ODOO4projects — Hosting para la generación IA',
'footer-support': 'Soporte',
'footer-legal': 'Legal',
'footer-contact': 'Contacto'
},
de: {
'nav-resources': 'Ressourcen',
'nav-trial': 'Kostenlose Testphase',
'hero-badge': 'ERP FÜR NGOs',
'hero-pill': 'Vereintes NGO-ERP',
'hero-headline': 'Vereinfache jeden Einsatz mit einem ERP für NGOs',
'hero-subheadline': 'Bündele Programme, automatisiere Spender- und Förderberichte und gib allen Standorten dieselbe Datenbasis. Starte in wenigen Wochen mit maßgeschneiderten Templates.',
'cta-trial': 'Kostenlose Testphase starten',
'cta-meeting': 'Meeting planen',
'hero-stat1': 'Schnellere Förder- & Spenderberichte',
'hero-stat2': 'Doppelt so schnelle Ehrenamtlichen-Onboardings',
'hero-card-title': 'Live-KPI-Überblick',
'hero-card-headline': 'Impact-Dashboard für Programme',
'hero-card-body': 'Budgets in Echtzeit • Ehrenamtsstunden • Donor Health',
'value1-title': 'Transparenz für Spender',
'value1-body': 'Buchhaltungsbereite Ledger verbinden Belege mit Geschichten, damit Spender jeden Euro ohne Zusatz-Excel sofort klar sehen.',
'value2-title': 'Spenderverwaltung & Kommunikation',
'value2-body': 'Automations-Buddys planen Dankesnachrichten, Newsletter und SMS, damit jede Beziehung pünktlich gepflegt und dokumentiert bleibt.',
'value3-title': 'Internationale Fundraising',
'value3-body': 'Mehrsprachige Homepages, Akquise-Kanban und Projekttracker halten Kampagnen weltweit synchron ohne Playbooks ständig umzuschreiben.',
'blog-tagline': 'Insights für NGO-Führungskräfte',
'blog-title': 'Blog & Wissenshub',
'blog-subtitle': 'Hol dir Impulse mit unseren unterhaltsamen Playbooks.',
'blog-link': 'Alle Artikel ansehen →',
'blog-all-open': 'Weniger Artikel anzeigen',
'blog-read-more': 'Mehr lesen',
'blog-show-less': 'Weniger anzeigen',
'blog-error': 'Artikel konnten gerade nicht geladen werden.',
'trial-tagline': 'Kostenlos testen',
'trial-heading': 'Starte dein NGO-ERP-Sandbox in unter 5 Minuten',
'trial-body': 'Teste lokalisierte Templates, Donor-CRM und Automatisierungen. Keine Kreditkarte wähle den Fokus und lade dein Team ein.',
'trial-bullet1': 'Vorkonfigurierter Kontenplan & Fördertracking',
'trial-bullet2': 'Automatische Spendenbelege & Impact-Dashboards',
'trial-bullet3': 'Geführte Checklisten für Go-Live in 30 Tagen',
'trial-label-email': 'Arbeits-E-Mail',
'trial-placeholder-email': 'impact@deinengo.org',
'trial-label-priority': 'Höchste Priorität',
'priority-1': 'Förder-Reporting',
'priority-2': 'Ehrenamt-Management',
'priority-3': 'Spender-CRM & Fundraising',
'priority-4': 'Finanzen & Beschaffung',
'trial-label-region': 'Land / Region',
'trial-placeholder-region': 'z.B. Paraguay, LATAM',
'trial-microcopy': 'Keine Kreditkarte. EU-Hosting & DSGVO-konform.',
'trial-help': 'Brauchen Sie Hilfe? Nutzen Sie den Button „Meeting planen“ im Header für einen geführten Call.',
'meeting-tagline': 'Meeting vereinbaren',
'meeting-heading': 'Erleben Sie, wie Ihre NGO Zeit spart und Fehler reduziert',
'meeting-body': 'Ein 30-minütiger Walkthrough zu Lokalisierung, Integrationen und Governance inklusive Rollout-Fahrplan.',
'meeting-bullet1': 'Automation-Score als Ausgangspunkt',
'meeting-bullet2': 'Technologie- & Migrationsplan',
'meeting-bullet3': 'Budgetvorlagen & Kostenprognose',
'meeting-note-title': 'So buchen Sie',
'meeting-note-body': 'Sie sprechen mit einem NGO-Berater von ODOO4projects.',
'meeting-note-hint': 'Verwenden Sie den Button „Meeting planen“ im Header und nennen Sie bei der Buchung Ihre Frage, damit wir uns vorbereiten können.',
'meeting-note-cta': 'Buchungskalender öffnen',
'footer-note': 'ODOO4projects — Hosting für die KI-Generation',
'footer-support': 'Support',
'footer-legal': 'Rechtliches',
'footer-contact': 'Kontakt'
}
};
const BLOG_LIMIT = 3;
const blogGrid = document.getElementById('blog-grid');
const blogToggle = document.getElementById('blog-toggle');
const blogError = document.getElementById('blog-error');
let blogPosts = [];
let blogExpanded = false;
if (blogGrid) {
fetch('blog.json')
.then(response => response.json())
.then(data => {
blogPosts = Array.isArray(data) ? data : [];
renderBlogCards();
})
.catch(error => {
if (blogError) {
blogError.classList.remove('hidden');
blogError.textContent = getTranslation(document.documentElement.lang, 'blog-error', 'Unable to load articles right now.');
}
console.error('blog.json load failed', error);
});
}
if (blogToggle) {
blogToggle.addEventListener('click', () => {
if (blogPosts.length <= BLOG_LIMIT) return;
blogExpanded = !blogExpanded;
renderBlogCards();
});
}
function getTranslation(locale, key, fallback) {
return (translations[locale] && translations[locale][key]) ?? translations.en[key] ?? fallback;
}
function renderBlogCards() {
if (!blogGrid) {
return;
}
if (!blogPosts.length) {
blogGrid.innerHTML = '';
updateBlogToggleLabel();
return;
}
const limit = blogExpanded ? blogPosts.length : Math.min(BLOG_LIMIT, blogPosts.length);
blogGrid.innerHTML = '';
blogPosts.slice(0, limit).forEach(post => {
blogGrid.appendChild(createBlogCard(post));
});
updateBlogToggleLabel();
}
function createBlogCard(post) {
const card = document.createElement('article');
card.className = 'border border-brand-smoke rounded-3xl p-6 h-full flex flex-col';
const meta = document.createElement('div');
meta.className = 'flex items-center justify-between mb-3';
const area = document.createElement('p');
area.className = 'text-xs uppercase tracking-widest text-brand-primary';
area.textContent = post.area || '';
const dateEl = document.createElement('time');
dateEl.className = 'text-xs text-brand-ink/60';
if (post.date) {
dateEl.dateTime = post.date;
}
dateEl.textContent = formatBlogDate(post.date);
meta.append(area, dateEl);
card.appendChild(meta);
const title = document.createElement('h3');
title.className = 'text-xl font-semibold mb-3';
title.textContent = post.title || '';
card.appendChild(title);
const teaser = document.createElement('div');
teaser.className = 'text-sm text-brand-ink/80 space-y-3 mb-4';
teaser.innerHTML = post.teaser || '';
card.appendChild(teaser);
let contentBlock = null;
const hasMore = post.content && post.content.trim() !== (post.teaser || '').trim();
if (post.content) {
contentBlock = document.createElement('div');
contentBlock.className = 'text-sm text-brand-ink/80 space-y-3 mb-4 hidden';
contentBlock.innerHTML = post.content;
card.appendChild(contentBlock);
}
if (hasMore && contentBlock) {
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'text-sm font-semibold text-brand-accent underline-offset-4 hover:underline self-start';
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
btn.addEventListener('click', () => {
const isHidden = contentBlock.classList.contains('hidden');
if (isHidden) {
contentBlock.classList.remove('hidden');
btn.textContent = getTranslation(document.documentElement.lang, 'blog-show-less', 'Show less');
} else {
contentBlock.classList.add('hidden');
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
}
});
card.appendChild(btn);
}
return card;
}
function formatBlogDate(dateString) {
if (!dateString) return '';
try {
const locale = document.documentElement.lang || 'en';
return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'short', day: 'numeric' }).format(new Date(dateString));
} catch (error) {
return dateString;
}
}
function updateBlogToggleLabel() {
if (!blogToggle) return;
if (blogPosts.length <= BLOG_LIMIT) {
blogToggle.classList.add('hidden');
blogExpanded = false;
return;
}
blogToggle.classList.remove('hidden');
blogToggle.disabled = false;
const locale = document.documentElement.lang || 'en';
blogToggle.textContent = blogExpanded
? getTranslation(locale, 'blog-all-open', 'Show fewer articles')
: getTranslation(locale, 'blog-link', 'Browse all articles →');
}
function setLanguage(lang) {
const locale = translations[lang] ? lang : 'en';
document.documentElement.lang = locale;
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.dataset.i18n;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.innerHTML = value;
});
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
const key = el.dataset.i18nPlaceholder;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.setAttribute('placeholder', value);
});
document.querySelectorAll('[data-i18n-option]').forEach(el => {
const key = el.dataset.i18nOption;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.textContent = value;
});
document.querySelectorAll('[data-i18n-aria]').forEach(el => {
const key = el.dataset.i18nAria;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.setAttribute('aria-label', value);
});
renderBlogCards();
updateBlogToggleLabel();
}
document.getElementById('lang-selector').addEventListener('change', (event) => {
setLanguage(event.target.value);
});
setLanguage('en');
document.getElementById('year').textContent = new Date().getFullYear();
</script>
</body>
</html>
-550
View File
@@ -1,550 +0,0 @@
<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>NGO ERP Landingpage | ODOO4projects</title>
<meta name="description" content="Purpose-built ERP platform for NGOs. Centralize programs, automate donor and grant reporting, and launch in weeks with ODOO4projects." />
<meta name="keywords" content="NGO ERP system, nonprofit management software, ERP for NGOs, NGO operations platform, ODOO for nonprofits" />
<link rel="icon" href="https://odoo4projects.com/web/image/website/1/favicon?unique=725c3af" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" />
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"></noscript>
<link rel="preload" href="assets/site.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
<noscript><link rel="stylesheet" href="assets/site.css"></noscript>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "NGO ERP Landing",
"about": "ERP for NGOs",
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"logo": "https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3"
},
"mainEntity": {
"@type": "SoftwareApplication",
"name": "ODOO4projects NGO ERP",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Cloud",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD",
"description": "4-week free trial of NGO ERP workspace"
}
}
}
</script>
<script defer data-domain="ngo.odoo4projects.com" src="https://plausible.odoo4projects.com/js/script.tagged-events.js"></script>
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
</head>
<body class="bg-brand-snow text-brand-ink">
<header class="bg-hero-gradient text-white">
<div class="max-w-6xl mx-auto px-6 py-6 flex flex-wrap items-center justify-between gap-4">
<div class="flex items-center gap-3">
<img src="https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3" alt="ODOO4projects logo" class="h-10 w-auto" />
<span class="uppercase tracking-[0.3em] text-xs text-brand-smoke" data-i18n="hero-badge"></span>
</div>
<nav class="flex flex-wrap items-center gap-6 text-sm">
<a href="#blog" class="hover:text-brand-sunrise transition" data-i18n="nav-resources"></a>
<a href="#trial" class="hover:text-brand-sunrise transition" data-i18n="nav-trial"></a>
</nav>
<div class="flex items-center gap-3">
<label for="lang-selector" class="sr-only">Language</label>
<select id="lang-selector" class="bg-white/10 border border-white/30 text-sm rounded-full px-3 py-1.5 focus:outline-none focus:ring-2 focus:ring-brand-sunrise/70">
<option value="en">English</option>
<option value="es">Español</option>
<option value="de">Deutsch</option>
</select>
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="px-5 py-2 bg-brand-sunrise text-brand-ink font-semibold rounded-full text-sm shadow-brand hover:translate-y-0.5 transition plausible-event-name=meeting" data-i18n="cta-meeting"></a>
</div>
</div>
<div class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-2 gap-12 items-center">
<div>
<p class="text-brand-sunrise font-semibold mb-4" data-i18n="hero-pill"></p>
<h1 class="text-4xl md:text-5xl font-semibold leading-tight mb-6" data-i18n="hero-headline"></h1>
<p class="text-lg text-white/80 mb-8" data-i18n="hero-subheadline"></p>
<div class="flex flex-wrap gap-4">
<a href="#trial" class="px-6 py-3 bg-brand-accent hover:bg-brand-sunrise text-brand-ink font-semibold rounded-full transition" data-i18n="cta-trial" data-event="cta:hero-trial"></a>
</div>
<div class="mt-10 grid grid-cols-2 gap-6 text-sm text-white/80">
<div>
<p class="text-3xl font-semibold text-white">38%</p>
<p data-i18n="hero-stat1"></p>
</div>
<div>
<p class="text-3xl font-semibold text-white">2x</p>
<p data-i18n="hero-stat2"></p>
</div>
</div>
</div>
<div class="bg-white/10 backdrop-blur-lg rounded-3xl p-8 shadow-brand">
<div class="relative">
<img src="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?auto=format&fit=crop&w=900&q=80" alt="NGO team collaborating" class="rounded-2xl" />
<div class="absolute -bottom-8 left-8 bg-white/90 text-brand-ink px-4 py-3 rounded-2xl shadow-lg">
<p class="text-xs uppercase tracking-widest text-brand-primary mb-1" data-i18n="hero-card-title"></p>
<p class="text-lg font-semibold" data-i18n="hero-card-headline"></p>
<p class="text-sm text-brand-primary" data-i18n="hero-card-body"></p>
</div>
</div>
</div>
</div>
</header>
<section class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-3 gap-8">
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
<h2 class="text-xl font-semibold mb-2" data-i18n="value1-title"></h2>
<p class="text-sm text-brand-ink/80" data-i18n="value1-body"></p>
</article>
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
<h2 class="text-xl font-semibold mb-2" data-i18n="value2-title"></h2>
<p class="text-sm text-brand-ink/80" data-i18n="value2-body"></p>
</article>
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
<h2 class="text-xl font-semibold mb-2" data-i18n="value3-title"></h2>
<p class="text-sm text-brand-ink/80" data-i18n="value3-body"></p>
</article>
</section>
<section id="blog" class="bg-white py-20">
<div class="max-w-6xl mx-auto px-6">
<div class="flex flex-col md:flex-row md:items-end md:justify-between gap-6 mb-12">
<div>
<p class="text-sm uppercase tracking-[0.3em] text-brand-primary mb-3" data-i18n="blog-tagline"></p>
<h2 class="text-3xl font-semibold" data-i18n="blog-title"></h2>
<p class="text-brand-ink/80" data-i18n="blog-subtitle"></p>
</div>
<button id="blog-toggle" type="button" class="text-brand-accent font-semibold hover:underline underline-offset-4">Browse all articles →</button>
</div>
<div id="blog-grid" class="grid gap-6 md:grid-cols-3"></div>
<p id="blog-error" class="text-sm text-brand-ink/70 mt-6 hidden"></p>
</div>
</section>
<section id="trial" class="bg-brand-ink text-white py-20">
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12">
<div>
<p class="text-brand-sunrise text-sm uppercase tracking-[0.3em] mb-4" data-i18n="trial-tagline"></p>
<h2 class="text-3xl font-semibold mb-4" data-i18n="trial-heading"></h2>
<p class="text-white/80 mb-6" data-i18n="trial-body"></p>
<ul class="space-y-4 text-sm text-white/80">
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet1"></span></li>
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet2"></span></li>
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet3"></span></li>
</ul>
</div>
<form class="bg-white text-brand-ink rounded-3xl p-8 shadow-brand space-y-5" data-event="form:trial">
<label class="block text-sm font-medium">
<span data-i18n="trial-label-email"></span>
<input type="email" required class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-email" />
</label>
<label class="block text-sm font-medium">
<span data-i18n="trial-label-priority"></span>
<select class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent">
<option data-i18n-option="priority-1"></option>
<option data-i18n-option="priority-2"></option>
<option data-i18n-option="priority-3"></option>
<option data-i18n-option="priority-4"></option>
</select>
</label>
<label class="block text-sm font-medium">
<span data-i18n="trial-label-region"></span>
<input type="text" class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-region" />
</label>
<p class="text-xs text-brand-ink/70" data-i18n="trial-microcopy"></p>
<button type="submit" class="w-full py-3 rounded-2xl bg-brand-accent text-brand-ink font-semibold" data-i18n="cta-trial"></button>
<p class="text-xs text-brand-ink/60 text-center" data-i18n="trial-help"></p>
</form>
</div>
</section>
<section id="meeting" class="py-20 bg-white">
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12 items-center">
<div>
<p class="uppercase text-xs tracking-[0.3em] text-brand-primary mb-3" data-i18n="meeting-tagline"></p>
<h2 class="text-3xl font-semibold mb-4" data-i18n="meeting-heading"></h2>
<p class="text-brand-ink/80 mb-6" data-i18n="meeting-body"></p>
<ul class="space-y-4 text-sm text-brand-ink/80">
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet1"></span></li>
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet2"></span></li>
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet3"></span></li>
</ul>
</div>
<div class="bg-brand-snow border border-brand-smoke rounded-3xl p-8 shadow-brand">
<p class="text-sm text-brand-primary font-semibold mb-2" data-i18n="meeting-note-title"></p>
<p class="text-brand-ink font-semibold text-xl mb-4" data-i18n="meeting-note-body"></p>
<p class="text-sm text-brand-ink/70" data-i18n="meeting-note-hint"></p>
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="inline-flex items-center gap-2 mt-4 text-sm font-semibold text-brand-primary hover:text-brand-accent plausible-event-name=meeting" data-i18n="meeting-note-cta"></a>
</div>
</div>
</section>
<footer class="bg-brand-ink text-white py-10">
<div class="max-w-6xl mx-auto px-6 flex flex-col md:flex-row gap-6 items-center justify-between text-sm">
<p>© <span id="year"></span> <span data-i18n="footer-note"></span></p>
<div class="flex gap-4">
<a href="https://odoo4projects.com/support" class="hover:text-brand-sunrise" data-i18n="footer-support"></a>
<a href="https://odoo4projects.com/legal" class="hover:text-brand-sunrise" data-i18n="footer-legal"></a>
<a href="https://odoo4projects.com/contactus" class="hover:text-brand-sunrise" data-i18n="footer-contact"></a>
</div>
</div>
</footer>
<script>
const translations = {
en: {
'nav-resources': 'Resources',
'nav-trial': 'Free Trial',
'hero-badge': 'ERP FOR NGOs',
'hero-pill': 'Unified NGO ERP Platform',
'hero-headline': 'Simplify every mission workflow with an ERP built for NGOs',
'hero-subheadline': 'Consolidate programs, automate donor and grant reporting, and give every field office the same source of truth. Launch in weeks with templates tailored to humanitarian and community-impact teams.',
'cta-trial': 'Sign Up for Free Trial',
'cta-meeting': 'Schedule a Meeting',
'hero-stat1': 'Faster donor & grant reporting cycles',
'hero-stat2': 'Increase in volunteer onboarding speed',
'hero-card-title': 'Live KPI snapshot',
'hero-card-headline': 'Program Impact Dashboard',
'hero-card-body': 'Realtime budgets • Volunteer hours • Donor health',
'value1-title': 'Transparency for Donors',
'value1-body': 'Accounting-ready ledgers pair receipts with stories so donors see every peso without extra spreadsheets or calls.',
'value2-title': 'Donor Management & Communications',
'value2-body': 'Automation buddies queue thank-yous, newsletters, and SMS nudges so every supporter hears from you right on time.',
'value3-title': 'International Fund Raising',
'value3-body': 'Multilingual homepages, acquisition kanbans, and project trackers keep campaigns aligned across countries without rebuilding playbooks.',
'blog-tagline': 'Insights for NGO leaders',
'blog-title': 'Blog & resource hub',
'blog-subtitle': 'Get your impulses with our entertaining playbooks.',
'blog-link': 'Browse all articles →',
'blog-all-open': 'Show fewer articles',
'blog-read-more': 'Read more',
'blog-show-less': 'Show less',
'blog-error': 'Unable to load articles right now.',
'trial-tagline': 'Sign up free trial',
'trial-heading': 'Launch your NGO ERP sandbox in under 5 minutes',
'trial-body': 'Experience localized NGO templates, donor CRM, and automation recipes. No credit card required—just choose your focus area and invite teammates.',
'trial-bullet1': 'Pre-loaded NGO chart of accounts & grant tracking',
'trial-bullet2': 'Automated donor receipts + impact dashboards',
'trial-bullet3': 'Guided checklists for go-live within 30 days',
'trial-label-email': 'Work email',
'trial-placeholder-email': 'impact@yourngo.org',
'trial-label-priority': 'Primary priority',
'priority-1': 'Grant compliance reporting',
'priority-2': 'Volunteer management',
'priority-3': 'Donor CRM & fundraising',
'priority-4': 'Finance & procurement',
'trial-label-region': 'Country / region',
'trial-placeholder-region': 'e.g., Paraguay, LATAM',
'trial-microcopy': 'No credit card required. EU hosting & GDPR-ready.',
'trial-help': 'Need help? Use the Schedule a Meeting button in the header to book a guided call.',
'meeting-tagline': 'Have a meeting',
'meeting-heading': 'See how your NGO can streamline operations, save time, and reduce errors',
'meeting-body': 'A 30-minute live walkthrough tailored to your mission, covering localization, integrations, and governance. Walk away with a rollout roadmap.',
'meeting-bullet1': 'Baseline automation scoring',
'meeting-bullet2': 'Tech stack alignment & data migration plan',
'meeting-bullet3': 'Budget templates & total cost forecast',
'meeting-note-title': 'How scheduling works',
'meeting-note-body': 'You will meet with an NGO consultant from ODOO4projects.',
'meeting-note-hint': 'Use the Schedule a Meeting button in the header and tell us during booking which question we should prepare for.',
'meeting-note-cta': 'Open booking calendar',
'footer-note': 'ODOO4projects — Hosting for the AI generation',
'footer-support': 'Support',
'footer-legal': 'Legal',
'footer-contact': 'Contact'
},
es: {
'nav-resources': 'Recursos',
'nav-trial': 'Prueba gratuita',
'hero-badge': 'ERP PARA ONGs',
'hero-pill': 'Plataforma ERP unificada para ONGs',
'hero-headline': 'Simplifica cada misión con un ERP diseñado para ONGs',
'hero-subheadline': 'Centraliza programas, automatiza reportes de donantes y subvenciones y ofrece a cada sede la misma fuente de verdad. Implementa en semanas con plantillas creadas para equipos humanitarios.',
'cta-trial': 'Crear prueba gratuita',
'cta-meeting': 'Agendar una reunión',
'hero-stat1': 'Ciclos más rápidos de reportes a donantes y subvenciones',
'hero-stat2': 'Mayor velocidad en la incorporación de voluntarios',
'hero-card-title': 'Panel de KPIs en vivo',
'hero-card-headline': 'Tablero de impacto programático',
'hero-card-body': 'Presupuestos en tiempo real • Horas voluntarias • Salud de donantes',
'value1-title': 'Transparencia para donantes',
'value1-body': 'Libros contables listos unen recibos y relatos para que cada donante vea su aporte sin hojas extra.',
'value2-title': 'Gestión y comunicación con donantes',
'value2-body': 'Bots de automatización programan agradecimientos, boletines y SMS para que cada aliado reciba noticias a tiempo.',
'value3-title': 'Recaudación internacional',
'value3-body': 'Sitios multilingües, tableros de adquisición y proyectos coordinan campañas globales sin rehacer playbooks ni procesos.',
'blog-tagline': 'Ideas para líderes de ONG',
'blog-title': 'Blog y centro de recursos',
'blog-subtitle': 'Recibe impulsos con nuestros playbooks entretenidos.',
'blog-link': 'Ver todos los artículos →',
'blog-all-open': 'Mostrar menos artículos',
'blog-read-more': 'Leer más',
'blog-show-less': 'Mostrar menos',
'blog-error': 'No pudimos cargar los artículos en este momento.',
'trial-tagline': 'Activa tu prueba',
'trial-heading': 'Lanza tu sandbox ERP para ONG en menos de 5 minutos',
'trial-body': 'Explora plantillas localizadas, CRM de donantes y recetas de automatización. Sin tarjeta; solo elige tu prioridad e invita al equipo.',
'trial-bullet1': 'Plan contable para ONG y seguimiento de subvenciones precargado',
'trial-bullet2': 'Recibos automáticos más tableros de impacto',
'trial-bullet3': 'Checklists guiados para salir a producción en 30 días',
'trial-label-email': 'Correo laboral',
'trial-placeholder-email': 'impacto@tuong.org',
'trial-label-priority': 'Prioridad principal',
'priority-1': 'Reportes de subvenciones',
'priority-2': 'Gestión de voluntarios',
'priority-3': 'CRM y recaudación',
'priority-4': 'Finanzas y compras',
'trial-label-region': 'País / región',
'trial-placeholder-region': 'ej. Paraguay, LATAM',
'trial-microcopy': 'Sin tarjeta. Hosting en la UE y cumplimiento GDPR.',
'trial-help': '¿Dudas? Usa el botón “Agendar una reunión” en el encabezado para reservar una llamada guiada.',
'meeting-tagline': 'Agenda una reunión',
'meeting-heading': 'Descubre cómo optimizar operaciones, ahorrar tiempo y reducir errores',
'meeting-body': 'Sesión de 30 minutos adaptada a tu misión, con localización, integraciones y gobernanza. Sal con un plan de implementación.',
'meeting-bullet1': 'Diagnóstico de automatización',
'meeting-bullet2': 'Plan de migración y alineación tecnológica',
'meeting-bullet3': 'Plantillas presupuestarias y previsión de costes',
'meeting-note-title': 'Cómo reservar',
'meeting-note-body': 'Te reunirás con un consultor ONG de ODOO4projects.',
'meeting-note-hint': 'Usa el botón “Agendar una reunión” del encabezado y cuéntanos durante la reserva qué pregunta debemos preparar.',
'meeting-note-cta': 'Abrir calendario de reservas',
'footer-note': 'ODOO4projects — Hosting para la generación IA',
'footer-support': 'Soporte',
'footer-legal': 'Legal',
'footer-contact': 'Contacto'
},
de: {
'nav-resources': 'Ressourcen',
'nav-trial': 'Kostenlose Testphase',
'hero-badge': 'ERP FÜR NGOs',
'hero-pill': 'Vereintes NGO-ERP',
'hero-headline': 'Vereinfache jeden Einsatz mit einem ERP für NGOs',
'hero-subheadline': 'Bündele Programme, automatisiere Spender- und Förderberichte und gib allen Standorten dieselbe Datenbasis. Starte in wenigen Wochen mit maßgeschneiderten Templates.',
'cta-trial': 'Kostenlose Testphase starten',
'cta-meeting': 'Meeting planen',
'hero-stat1': 'Schnellere Förder- & Spenderberichte',
'hero-stat2': 'Doppelt so schnelle Ehrenamtlichen-Onboardings',
'hero-card-title': 'Live-KPI-Überblick',
'hero-card-headline': 'Impact-Dashboard für Programme',
'hero-card-body': 'Budgets in Echtzeit • Ehrenamtsstunden • Donor Health',
'value1-title': 'Transparenz für Spender',
'value1-body': 'Buchhaltungsbereite Ledger verbinden Belege mit Geschichten, damit Spender jeden Euro ohne Zusatz-Excel sofort klar sehen.',
'value2-title': 'Spenderverwaltung & Kommunikation',
'value2-body': 'Automations-Buddys planen Dankesnachrichten, Newsletter und SMS, damit jede Beziehung pünktlich gepflegt und dokumentiert bleibt.',
'value3-title': 'Internationale Fundraising',
'value3-body': 'Mehrsprachige Homepages, Akquise-Kanban und Projekttracker halten Kampagnen weltweit synchron ohne Playbooks ständig umzuschreiben.',
'blog-tagline': 'Insights für NGO-Führungskräfte',
'blog-title': 'Blog & Wissenshub',
'blog-subtitle': 'Hol dir Impulse mit unseren unterhaltsamen Playbooks.',
'blog-link': 'Alle Artikel ansehen →',
'blog-all-open': 'Weniger Artikel anzeigen',
'blog-read-more': 'Mehr lesen',
'blog-show-less': 'Weniger anzeigen',
'blog-error': 'Artikel konnten gerade nicht geladen werden.',
'trial-tagline': 'Kostenlos testen',
'trial-heading': 'Starte dein NGO-ERP-Sandbox in unter 5 Minuten',
'trial-body': 'Teste lokalisierte Templates, Donor-CRM und Automatisierungen. Keine Kreditkarte wähle den Fokus und lade dein Team ein.',
'trial-bullet1': 'Vorkonfigurierter Kontenplan & Fördertracking',
'trial-bullet2': 'Automatische Spendenbelege & Impact-Dashboards',
'trial-bullet3': 'Geführte Checklisten für Go-Live in 30 Tagen',
'trial-label-email': 'Arbeits-E-Mail',
'trial-placeholder-email': 'impact@deinengo.org',
'trial-label-priority': 'Höchste Priorität',
'priority-1': 'Förder-Reporting',
'priority-2': 'Ehrenamt-Management',
'priority-3': 'Spender-CRM & Fundraising',
'priority-4': 'Finanzen & Beschaffung',
'trial-label-region': 'Land / Region',
'trial-placeholder-region': 'z.B. Paraguay, LATAM',
'trial-microcopy': 'Keine Kreditkarte. EU-Hosting & DSGVO-konform.',
'trial-help': 'Brauchen Sie Hilfe? Nutzen Sie den Button „Meeting planen“ im Header für einen geführten Call.',
'meeting-tagline': 'Meeting vereinbaren',
'meeting-heading': 'Erleben Sie, wie Ihre NGO Zeit spart und Fehler reduziert',
'meeting-body': 'Ein 30-minütiger Walkthrough zu Lokalisierung, Integrationen und Governance inklusive Rollout-Fahrplan.',
'meeting-bullet1': 'Automation-Score als Ausgangspunkt',
'meeting-bullet2': 'Technologie- & Migrationsplan',
'meeting-bullet3': 'Budgetvorlagen & Kostenprognose',
'meeting-note-title': 'So buchen Sie',
'meeting-note-body': 'Sie sprechen mit einem NGO-Berater von ODOO4projects.',
'meeting-note-hint': 'Verwenden Sie den Button „Meeting planen“ im Header und nennen Sie bei der Buchung Ihre Frage, damit wir uns vorbereiten können.',
'meeting-note-cta': 'Buchungskalender öffnen',
'footer-note': 'ODOO4projects — Hosting für die KI-Generation',
'footer-support': 'Support',
'footer-legal': 'Rechtliches',
'footer-contact': 'Kontakt'
}
};
const BLOG_LIMIT = 3;
const blogGrid = document.getElementById('blog-grid');
const blogToggle = document.getElementById('blog-toggle');
const blogError = document.getElementById('blog-error');
let blogPosts = [];
let blogExpanded = false;
if (blogGrid) {
fetch('blog.json')
.then(response => response.json())
.then(data => {
blogPosts = Array.isArray(data) ? data : [];
renderBlogCards();
})
.catch(error => {
if (blogError) {
blogError.classList.remove('hidden');
blogError.textContent = getTranslation(document.documentElement.lang, 'blog-error', 'Unable to load articles right now.');
}
console.error('blog.json load failed', error);
});
}
if (blogToggle) {
blogToggle.addEventListener('click', () => {
if (blogPosts.length <= BLOG_LIMIT) return;
blogExpanded = !blogExpanded;
renderBlogCards();
});
}
function getTranslation(locale, key, fallback) {
return (translations[locale] && translations[locale][key]) ?? translations.en[key] ?? fallback;
}
function renderBlogCards() {
if (!blogGrid) {
return;
}
if (!blogPosts.length) {
blogGrid.innerHTML = '';
updateBlogToggleLabel();
return;
}
const limit = blogExpanded ? blogPosts.length : Math.min(BLOG_LIMIT, blogPosts.length);
blogGrid.innerHTML = '';
blogPosts.slice(0, limit).forEach(post => {
blogGrid.appendChild(createBlogCard(post));
});
updateBlogToggleLabel();
}
function createBlogCard(post) {
const card = document.createElement('article');
card.className = 'border border-brand-smoke rounded-3xl p-6 h-full flex flex-col';
const meta = document.createElement('div');
meta.className = 'flex items-center justify-between mb-3';
const area = document.createElement('p');
area.className = 'text-xs uppercase tracking-widest text-brand-primary';
area.textContent = post.area || '';
const dateEl = document.createElement('time');
dateEl.className = 'text-xs text-brand-ink/60';
if (post.date) {
dateEl.dateTime = post.date;
}
dateEl.textContent = formatBlogDate(post.date);
meta.append(area, dateEl);
card.appendChild(meta);
const title = document.createElement('h3');
title.className = 'text-xl font-semibold mb-3';
title.textContent = post.title || '';
card.appendChild(title);
const teaser = document.createElement('div');
teaser.className = 'text-sm text-brand-ink/80 space-y-3 mb-4';
teaser.innerHTML = post.teaser || '';
card.appendChild(teaser);
let contentBlock = null;
const hasMore = post.content && post.content.trim() !== (post.teaser || '').trim();
if (post.content) {
contentBlock = document.createElement('div');
contentBlock.className = 'text-sm text-brand-ink/80 space-y-3 mb-4 hidden';
contentBlock.innerHTML = post.content;
card.appendChild(contentBlock);
}
if (hasMore && contentBlock) {
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'text-sm font-semibold text-brand-accent underline-offset-4 hover:underline self-start';
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
btn.addEventListener('click', () => {
const isHidden = contentBlock.classList.contains('hidden');
if (isHidden) {
contentBlock.classList.remove('hidden');
btn.textContent = getTranslation(document.documentElement.lang, 'blog-show-less', 'Show less');
} else {
contentBlock.classList.add('hidden');
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
}
});
card.appendChild(btn);
}
return card;
}
function formatBlogDate(dateString) {
if (!dateString) return '';
try {
const locale = document.documentElement.lang || 'en';
return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'short', day: 'numeric' }).format(new Date(dateString));
} catch (error) {
return dateString;
}
}
function updateBlogToggleLabel() {
if (!blogToggle) return;
if (blogPosts.length <= BLOG_LIMIT) {
blogToggle.classList.add('hidden');
blogExpanded = false;
return;
}
blogToggle.classList.remove('hidden');
blogToggle.disabled = false;
const locale = document.documentElement.lang || 'en';
blogToggle.textContent = blogExpanded
? getTranslation(locale, 'blog-all-open', 'Show fewer articles')
: getTranslation(locale, 'blog-link', 'Browse all articles →');
}
function setLanguage(lang) {
const locale = translations[lang] ? lang : 'en';
document.documentElement.lang = locale;
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.dataset.i18n;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.innerHTML = value;
});
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
const key = el.dataset.i18nPlaceholder;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.setAttribute('placeholder', value);
});
document.querySelectorAll('[data-i18n-option]').forEach(el => {
const key = el.dataset.i18nOption;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.textContent = value;
});
document.querySelectorAll('[data-i18n-aria]').forEach(el => {
const key = el.dataset.i18nAria;
const value = translations[locale][key] ?? translations.en[key] ?? '';
if (value !== undefined) el.setAttribute('aria-label', value);
});
renderBlogCards();
updateBlogToggleLabel();
}
document.getElementById('lang-selector').addEventListener('change', (event) => {
setLanguage(event.target.value);
});
setLanguage('en');
document.getElementById('year').textContent = new Date().getFullYear();
</script>
</body>
</html>
+43 -15
View File
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

+20
View File
@@ -1,3 +1,6 @@
</html>
<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
@@ -121,6 +124,23 @@
<button id="blog-toggle" type="button" class="text-brand-accent font-semibold hover:underline underline-offset-4">Browse all articles →</button>
</div>
<div id="blog-grid" class="grid gap-6 md:grid-cols-3"></div>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to Automate Grant Reporting for Small NGOs — StepbyStep with Odoo + n8n",
"datePublished": "2026-03-25",
"author": {
"@type": "Person",
"name": "Odoo4Projects NGO Team"
},
"description": "Automate grant reporting for small NGOs with Odoo and n8n — reduce errors, save time, and simplify compliance.",
"mainEntityOfPage": "https://ngo.odoo4projects.com/automate-grant-reporting-odoo-n8n",
"keywords": "automate grant reporting, Odoo grants, n8n automation NGO, grant compliance automation, NGO reporting software"
}
</script>
<p id="blog-error" class="text-sm text-brand-ink/70 mt-6 hidden"></p>
</div>
</section>